遗传算法的VB程序【精品毕业设计】(完整版)
- 格式:docx
- 大小:165.11 KB
- 文档页数:21
完整的遗传算法函数Matlab程序遗传算法是一种模拟自然进化过程的算法,通过遗传代数操作来搜索最优解。
它是一种优化算法,可以用于解决复杂问题,例如函数优化、组合优化、机器学习等。
在Matlab 中,遗传算法可以通过使用内置函数进行实现,也可以编写自己的遗传算法函数。
以下是一个完整的遗传算法函数Matlab程序的示例:function [x_best, f_best] = GA(fit_func, nvars)% fit_func: 适应度函数句柄% nvars: 变量个数% 遗传算法参数设置pop_size = 100; % 种群大小prob_crossover = 0.8; % 交叉概率prob_mutation = 0.02; % 变异概率max_gen = 1000; % 最大迭代次数% 初始化种群pop = rand(pop_size, nvars);for i = 1:max_gen% 计算适应度for j = 1:pop_sizefitness(j) = feval(fit_func, pop(j,:));end% 找到最优个体[f_best, best_idx] = max(fitness);x_best = pop(best_idx,:);% 交叉操作for j = 1:2:pop_sizeif rand < prob_crossover% 随机选择父代idx_parent1 = randi(pop_size);idx_parent2 = randi(pop_size);parent1 = pop(idx_parent1,:);parent2 = pop(idx_parent2,:);% 交叉idx_crossover = randi(nvars-1);child1 = [parent1(1:idx_crossover) parent2(idx_crossover+1:end)];child2 = [parent2(1:idx_crossover) parent1(idx_crossover+1:end)];% 更新种群pop(j,:) = child1;pop(j+1,:) = child2;endend% 变异操作for j = 1:pop_sizeif rand < prob_mutation% 随机选择变异个体idx_mutation = randi(nvars);pop(j,idx_mutation) = rand;endendendend在上述程序中,遗传算法的参数通过设定变量的值进行设置,包括种群大小、交叉概率、变异概率和最大迭代次数等。
遗传算法详解(含MATLAB代码)Python遗传算法框架使用实例(一)使用Geatpy实现句子匹配在前面几篇文章中,我们已经介绍了高性能Python遗传和进化算法框架——Geatpy的使用。
本篇就一个案例进行展开讲述:pip install geatpy更新至Geatpy2的方法:pip install --upgrade --user geatpy查看版本号,在Python中执行:import geatpyprint(geatpy.__version__)我们都听过“无限猴子定理”,说的是有无限只猴子用无限的时间会产生特定的文章。
在无限猴子定理中,我们“假定”猴子们是没有像人类那样“智能”的,而且“假定”猴子不会自我学习。
因此,这些猴子需要“无限的时间"。
而在遗传算法中,由于采用的是启发式的进化搜索,因此不需要”无限的时间“就可以完成类似的工作。
当然,需要产生的文章篇幅越长,那么就需要越久的时间才能完成。
下面以产生"T om is a little boy, isn't he? Yes he is, he is a good and smart child and he is always ready to help others, all in all we all like him very much."的句子为例,讲述如何利用Geatpy实现句子的搜索。
之前的文章中我们已经讲述过如何使用Geatpy的进化算法框架实现遗传算法编程。
这里就直接用框架。
把自定义问题类和执行脚本编写在下面的"main.py”文件中:# -*- coding: utf-8 -*-import numpy as npimport geatpy as eaclass MyProblem(ea.Problem): # 继承Problem父类def __init__(self):name = 'MyProblem' # 初始化name(函数名称,可以随意设置) # 定义需要匹配的句子strs = 'Tom is a little boy, isn't he? Yes he is, he is a good and smart child and he is always ready to help others, all in all we all like him very much.'self.words = []for c in strs:self.words.append(ord(c)) # 把字符串转成ASCII码M = 1 # 初始化M(目标维数)maxormins = [1] # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)Dim = len(self.words) # 初始化Dim(决策变量维数)varTypes = [1] * Dim # 初始化varTypes(决策变量的类型,元素为0表示对应的变量是连续的;1表示是离散的)lb = [32] * Dim # 决策变量下界ub = [122] * Dim # 决策变量上界lbin = [1] * Dim # 决策变量下边界ubin = [1] * Dim # 决策变量上边界# 调用父类构造方法完成实例化ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)def aimFunc(self, pop): # 目标函数Vars = pop.Phen # 得到决策变量矩阵diff = np.sum((Vars - self.words)**2, 1)pop.ObjV = np.array([diff]).T # 把求得的目标函数值赋值给种群pop的ObjV执行脚本if __name__ == "__main__":"""================================实例化问题对象============================="""problem = MyProblem() # 生成问题对象"""==================================种群设置================================"""Encoding = 'RI' # 编码方式NIND = 50 # 种群规模Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges,problem.borders) # 创建区域描述器population = ea.Population(Encoding, Field, NIND) # 实例化种群对象(此时种群还没被初始化,仅仅是完成种群对象的实例化)"""================================算法参数设置=============================="""myAlgorithm = ea.soea_DE_rand_1_L_templet(problem, population) # 实例化一个算法模板对象myAlgorithm.MAXGEN = 2000 # 最大进化代数"""===========================调用算法模板进行种群进化========================="""[population, obj_trace, var_trace] = myAlgorithm.run() # 执行算法模板population.save() # 把最后一代种群的信息保存到文件中# 输出结果best_gen = np.argmin(obj_trace[:, 1]) # 记录最优种群是在哪一代best_ObjV = obj_trace[best_gen, 1]print('最优的目标函数值为:%s'%(best_ObjV))print('有效进化代数:%s'%(obj_trace.shape[0]))print('最优的一代是第 %s 代'%(best_gen + 1))print('评价次数:%s'%(myAlgorithm.evalsNum))print('时间已过 %s 秒'%(myAlgorithm.passTime))for num in var_trace[best_gen, :]:print(chr(int(num)), end = '')上述代码中首先定义了一个问题类MyProblem,然后调用Geatpy内置的soea_DE_rand_1_L_templet算法模板,它实现的是差分进化算法DE-rand-1-L,详见源码:运行结果如下:种群信息导出完毕。
遗传算法代码# iiiclude<stdio.h>#mclude<stnng.h> #mclude<stdlib.h> #mclude<math.h> #mclude<tmie.h>^define cities 10 〃城市的个数 ^define MAXX ]00//迭代次数 #define pc 0.8 〃交配概率 #define pm 0.05 〃变异概率 ^define num 10〃种群的人小 int bestsolution;//最优染色体int distance[cities] [cities];// 城市之间的距离stmct group //染色体的结构{int city [cities];// 城市的顺序int adapt;// 适应度 double p 〃在种群中的幸存概率} group [num] ,grouptemp [num];〃随机产生10个城市之间的相互距离 voidinit(){intij ;meniset(distance.0.sizeof(distance)); srand((uiisigned)tuue(NULL)); fbr(i=O ;i<cities;i++){fbr(j=i+l ;j<cities J++){distance [i] [j]=rand()% 100; distance[j][i]=distance[i]Ij];} }fbr(i=O;i<cities;i++)printf( ”************ 城市的距离矩阵如下************\ii n );pruitf(M%4d H,distance[i][j]);}}〃随机产生初试群void groupproduceQ{mt i j 丄k,flag;fbi(i=O ;i<num; i++) //初始化for(j=OJ<citiesj++) group[i].city[j]=-l;srand((uiisigned)tuue(NULL));fbi(i=O ;i<num: i++)血(J=Oj<citi 亡s;){ t=rand()%cities;flag=l;for(k=0;k<j;k++){if(group[i] .city[k]=t){flag=O;break:}} if(flag){group[i].city|j]=t; J++;}}}pnntfC************ 初始种群如下^***************^);fbi(i=0;i<num: i++)血(J=0 J <citi 亡s;j++) pimtf(M%4d,\gioup[i].city[j]);〃评价函数,找岀最优染色体void pmgjiaQint ij;iiit nl,ii2;mt sumdistance5biggestsum=O; double biggestp=O;fdr(i=O;i<num; i++){sumdistance=O;{nl=group[i].city|j-l];n2=group[i].city[j]; sumdistance4-=distance[nl][n2];}group [1] .adapt=sumd istaiice; 〃每条染色体的路径总和biggestsum+=sumdistance; 〃种群的总路径}fbi(i=O ;i<num: i++){group [i].p= 1 -(double)gioup(i] .adapt/(double)biggestsum;biggestp+=group[i].p;}fbi(i=O ;i<num: i++)gioup[i] .p=gioup[i] .p./biggestp;〃求最佳路劲bestsolution=0;fbi(i=O ;i<num: i++) if(gioup[i].p>gioup[bestsolution].p) bestsolution=i; }〃选择void xuanzeQ{mt ij^temp;double gradient[num]^/梯度概率double xuaiize[num];//选择染色体的随机概率mt xuaii[num];//选择了的染色体〃初始化梯度概率fbi(i=O ;i<num: i++)gradient[i]=O.O; xuaiize[i]=O.O;}gradient[0]=gioup[0].p;fbr(i= 1 ;i<num:i++)gradient[i]=gradient[i-1 ]+group[i] .p; srand((uiisigned)tune(NULL));〃随机产生染色体的存活概率fdr(i=O;i<num: i++){xuanze[i]=(rand()% 100); xuaiize[i]/=100;}〃选择能生存的染色体fdr(i=0;i<num: i++){{if(xu aiize [i] <gradient [j ]){xuan[i]=j; //第i个位置存放第j个染色体break;}}}〃拷贝种群fdr(i=0;i<num: i++){grouptenip [i]. adapt=gioup [i].adapt;giouptemp[i] .p=group[i] .p;fbi(j=0 j <cities;j ++)grouptenip [i].citv|j]=group [i]. c ity[j ];}〃数据更新fdr(i=0;i<num: i++){temp=xuan[i];groupfi] .adapt=giouptemp[temp] .adapt;group [1] .p=giouptemp [temp] .p;fbi(j=0 j <cities;j ++)group[i].city[j]=grouptemp[tenip].city[j];〃变异void bianyiQ{intij;mt t;mt temp 1 ,temp2.point;double buinyip[num]; 〃染色体的变异概率mtbianyiflag[num];//染色体的变异情况fbi(i=O ;i<num: i++)〃初始化bianyiflag[i]=O;〃随机产生变异概率srand((uiisigned)tune(NULL));fbi(i=O ;i<num: i++){bianyip[i]=(rand()% 100); bianyip[i]/=100;}〃确定可以变异的染色体t=0;for(i=0 ;i<num; i++){if(biaiivip[i]<pm){ biaiiviflag[i]=l; t++;}}〃变异操作,即交换染色体的两个节点srand((iuisigned)tiine(NULL));for(i=0 ;i<num; i++){if(biaiiviflag[i]== 1){templ=rand()%10;temp2=rand()% 10;pomt=group[i]・ city[temp 1 ]; group [i]. city [temp1 ]=gioup [1]. city [temp2 ]; group[i] .city[temp2]=pomt;o e :a【n d(XXVINV£3n¥fo C T bB U T doQonpo】ddno・bb O -S Hg o q o ・Teqo「(£2】o o y )U S S A S()UTCU 二UTo lunp 」f (A R §o q o )2wl^20q o ^.・o %w uc o sXUTPsqsns^******** ***************^f l 】0 A)近士定—障尉QTry f ******************5-:************* **********⑧ 琛c>^建翠 唳********************=)七.s】d宀(dcl.mdno乩z'uxpt%-®^^・・)七宀「(曰目。
遗传算法简述及代码详解声明:本文内容整理自网络,认为原作者同意转载,如有冒犯请联系我。
遗传算法基本内容遗传算法为群体优化算法,也就是从多个初始解开始进行优化,每个解称为一个染色体,各染色体之间通过竞争、合作、单独变异,不断进化。
遗传学与遗传算法中的基础术语比较染色体:又可以叫做基因型个体(individuals)群体/种群(population):一定数量的个体组成,及一定数量的染色体组成,群体中个体的数量叫做群体大小。
初始群体:若干染色体的集合,即解的规模,如30,50等,认为是随机选取的数据集合。
适应度(fitness):各个个体对环境的适应程度优化时先要将实际问题转换到遗传空间,就是把实际问题的解用染色体表示,称为编码,反过程为解码/译码,因为优化后要进行评价(此时得到的解是否较之前解优越),所以要返回问题空间,故要进行解码。
SGA采用二进制编码,染色体就是二进制位串,每一位可称为一个基因;如果直接生成二进制初始种群,则不必有编码过程,但要求解码时将染色体解码到问题可行域内。
遗传算法的准备工作:1) 数据转换操作,包括表现型到基因型的转换和基因型到表现型的转换。
前者是把求解空间中的参数转化成遗传空间中的染色体或者个体(encoding),后者是它的逆操作(decoding)2) 确定适应度计算函数,可以将个体值经过该函数转换为该个体的适应度,该适应度的高低要能充分反映该个体对于解得优秀程度。
非常重要的过程。
遗传算法基本过程为:1) 编码,创建初始群体2) 群体中个体适应度计算3) 评估适应度4) 根据适应度选择个体5) 被选择个体进行交叉繁殖6) 在繁殖的过程中引入变异机制7) 繁殖出新的群体,回到第二步实例一:(建议先看实例二)求 []30,0∈x 范围内的()210-=x y 的最小值1) 编码算法选择为"将x 转化为2进制的串",串的长度为5位(串的长度根据解的精度设 定,串长度越长解得精度越高)。
实验一 遗传算法解决函数优化问题一、实验目的1.掌握遗传算法的基本原理和步骤。
2. 复习VB 、VC 的基本概念、基本语法和编程方法,并熟练使用VB 或VC 编写遗传算法程序。
二、实验内容1. 上机编写程序,解决以下函数优化问题:()1021min 100i i i f x x =⎛⎫=≤ ⎪⎝⎭∑X2. 调试程序。
3. 根据实验结果,撰写实验报告。
三、实验原理遗传算法是一类随机优化算法,但它不是简单的随机比较搜索,而是通过对染色体的评价和对染色体中基因的作用,有效地利用已有信息来指导搜索有希望改善优化质量的状态。
标准遗传算法流程图如下图所示,主要步骤可描述如下: ① 随机产生一组初始个体构成初始种群。
② 计算每一个体的适配值(fitness value ,也称为适应度)。
适应度值是对染色体(个体)进行评价的一种指标,是GA 进行优化所用的主要信息,它与个体的目标值存在一种对应关系。
③ 判断算法收敛准则是否满足,若满足,则输出搜索结果;否则执行以下步骤。
④ 根据适应度值大小以一定方式执行复制操作(也称为选择操作)。
⑤ 按交叉概率p c 执行交叉操作。
⑥ 按变异概率p m 执行变异操作。
⑦ 返回步骤②。
图1.1 标准遗传算法流程图四、程序代码#include <stdio.h>#include <math.h>#include <stdlib.h>#include<time.h>#define byte unsigned char#define step 200 //步长#define MAX 50#define N 10 //随机数个数#define Pc 0.74 //被选择到下一代的概率,个数=Pc*N,小于N 下一代数=上一代,不用处理#define Pt 0.25 //交叉的概率,个数=Pt*N 舍,小于N 0~(n2+1)随机数,之后部分开始交叉#define Pm 0.01 //变异的概率,个数=Pm*N*n2 入,小于N 0~(N*(n2+1))随机数/(n2+1)=个体,0~(N*(n2+1))随机数%(n2+1)=该个体基因位置#define n2 15//2的15次方,共16位#define next_t (int)(Pt*N)//交叉个数#define next_m (int)(Pm*N+1)//变异个数向后约等于#define e 0.001//次数限制阈值/*int N=10; //随机数个数float Pc=0.74; //被选择到下一代的概率,个数=Pc*N,小于N 下一代数=上一代,不用处理float Pt=0.25; //交叉的概率,个数=Pt*N 舍,小于N 0~(n2+1)随机数,之后部分开始交叉float Pm=0.01; //变异的概率,个数=Pm*N*n2 入,小于N 0~(N*(n2+1))随机数/(n2+1)=个体,0~(N*(n2+1))随机数%(n2+1)=该个体基因位置*/bytebitary[N][n2+1],bitary0[N][n2+1];//二进制int src1[N];float ShowType(int a);//表现型void BinNum(int a);//二进制位数n2 float fit_func(float a);//适应度void DecToBin (int src,int num);//十进制转二进制void BinToDec (void);//十进制转二进制int selectT(float a,float b[10]);//选择交叉个体int selectM(float a,float b[10]);//选择变异个体void main(void){//范围是[-100,100]*************************** intsrc[N],i=0,j=0,k=0,count=0;//十进制float show[N];//表现型float fit[N],sumfit=0;//适应度float pcopy[N];//优胜劣汰,遗传到下一代的概率fit[i]/总和(fit[i]) float pacc[N];//pcopy[i]累加概率值float prand[N];//随机产生N个0~1的下一代概率int iselect;//根据概率选择到的个体序号int new_select[N];//根据概率选择到的个体int new_T[next_t],new_M[next_m];float min,min1;printf("随机数(原始母体),表现型, 适配值\n");srand( (unsigned)time(NULL) );for(i=0;i<N;i++){src[i]=rand()%32768;//rand()%201-100===>-100~100的十进制随机数随时间递增show[i]=ShowType(src[i]);//转化成表现型fit[i]=fit_func(show[i]);//计算各个适配值(适应度)sumfit=sumfit+fit[i]; //种群的适应度总和printf("%5d, %f, %f\n",src[i],s how[i],fit[i]);}printf("\n第%d代适配总值\n%f\n",count,sumfit);//第0代count++;min=sumfit;printf("\n遗传到下一代的概率\n");for(i=0;i<N;i++){pcopy[i]=fit[i]/sumfit;printf("%f, ",pcopy[i]);}// 求选择(被复制)的累加概率,用于轮盘赌产生随机数区域,选择下一代个体printf("\n遗传到下一代的累加概率\n");pacc[0]=pcopy[0];for(i=1;i<N;i++){pacc[i]=pacc[i-1]+pcopy[i];printf("%f, ",pacc[i]);}//每个src[N]都随机取其中一个pcopy,取得的值pcopy[i]跟pcopy概率大小有关//模拟轮盘赌方式选择新一代printf("\n\n新产生的第%d代,表现型, 适配值\n",count);srand( (unsigned)time(NULL) );for(i=0;i<N;i++){prand[i]=(float)( (rand()%101)*0.01 );//0~1的十进制小数,精确到0.01iselect=selectT(prand[i],pacc);new_select[i]=src[iselect];//产生的新一代,十进制show[i]=ShowType(new_select[i]);/ /转化成表现型fit[i]=fit_func(show[i]);DecToBin (new_select[i],i);sumfit=sumfit+fit[i]; //种群的适应度总和printf(" %d %f %f\n",new_selec t[i],show[i],fit[i]);}printf("\n第%d代适配总值\n%f\n",count,sumfit);//第1代min1=sumfit;if (min>sumfit){min1=min;min=sumfit;}while(fabs(min-min1)>e&&count<MAX ){//从新一代选择个体交叉printf("\n随机产生交叉个体号");srand( (unsigned)time(NULL) );for(i=0;i<2;i++) //简单起见交叉数设为2{new_T[i]=rand()%N;//0~10的十进制数产生的交叉个体if (i>0)//两个不同个体交叉while(new_T[i]==new_T[i-1])new_T[i]=rand()%N;printf("%d, ",new_T[i]);}srand( (unsigned)time(NULL) );//随机产生交叉位置k=rand()%n2;//0~14的十进制数printf("\n随机产生交叉位置 %d\n",k);printf("\n原编码\n");for(j=n2;j>=0;j--)printf("%c",bitary[new_T[0]][j]);printf("\n");for(j=n2;j>=0;j--)printf("%c",bitary[new_T[1]][j]);printf("\n位置%d后交叉编码\n",k);char temp;for(i=k+1;i<n2+1;i++)//交叉{temp=bitary[new_T[0]][i];bitary[new_T[0]][i]=bitary[new_T[ 1]][i];bitary[new_T[1]][i]=temp;}for(j=n2;j>=0;j--)printf("%c",bitary[new_T[0]][j]);printf("\n");for(j=n2;j>=0;j--)printf("%c",bitary[new_T[1]][j]);//从新一代选择个体变异printf("\n随机产生变异个体号");srand( (unsigned)time(NULL) );for(i=0;i<1;i++) //简单起见变异数设为1个{new_M[i]=rand()%N;//0~9的十进制数产生的变异个体k=rand()%(n2+1);//0~15的十进制数printf("%d\n编码位置 %d\n原编码\n",new_M[i],k);for(j=n2;j>=0;j--)printf("%c",bitary[new_M[i]][j]);if(bitary[new_M[i]][k]=='0')//变异取反bitary[new_M[i]][k]='1';elsebitary[new_M[i]][k]='0';printf("\n位置%d变异后编码\n",k);for(j=n2;j>=0;j--)printf("%c",bitary[new_M[i]][j]);}printf("\n");count++;//新的bitary即产生第二代printf("\n新产生的第%d代\n",count);for(i=0;i<N;i++){for(j=n2;j>=0;j--)printf("%c",bitary[i][j]);printf("\n");}BinToDec ();//二进制转十进制 for(i=0;i<N;i++){new_select[i]=src1[i];show[i]=ShowType(src[i]);//转化成表现型fit[i]=fit_func(show[i]);//计算各个适配值(适应度)sumfit=sumfit+fit[i]; //种群的适应度总和printf("%5d, %f, %f\n",src1[i], show[i],fit[i]);}printf("\n第%d代适配总值\n%f\n",count,sumfit);if (sumfit<min){min1=min;min=sumfit;}}printf("\n\n\n*****************\n over\n*****************\n",sumfit);}//////////////////////////子函数////////////////float ShowType(int a){float temp;temp=(float)(a*200.0/32767-100);/ /(2的15次方减1)=32767return temp;}float fit_func(float a){float temp;temp=a*a;return temp;}void DecToBin (int src,int num){int i;//注意负数的补码if (src<0){src=(int)pow(2,16)-abs(src);}for (i=0;i<=n2;i++){bitary[num][i]='0';bitary0[num][i]='0';if(src){bitary[num][i]=(src%2)+48;bitary0[num][i]=(src%2)+48;src=(int)(src/2);}}}void BinToDec (void){int i,j;for(i=0;i<N;i++){src1[i]=0;for(j=0;j<n2+1;j++){src1[i]=src1[i]+(bitary[i][j]-48) *(int)pow(2,j);}}}int selectT(float a,float b[10]) {int i;for(i=0;i<N;i++){if (a<b[i])return i;}return -1;} 五、实验结果分析:随机性大,精度不高六、实验心得理论指导实践,在实践中得以提高。
#include〈stdio.h>#include<stdlib.h>#include<time.h>#include<fstream。
h〉#include<windows。
h〉#define POPSIZE 500#define MAXIMIZATION 1#define MINIMIZATION 2#define random(x)(rand()%(x))#define Cmax 100 /*最大值函数适应度的设置*/#define Cmin 0 /*最小值函数适应度的设置*/#define LENGTH1 10#define LENGTH2 10#define CHROMLENGTH LENGTH1+LENGTH2int FunctionMode=MAXIMIZATION;/*optimization type即函数类型,是求最大值函数还是最小值函数*/ int a=100;int PopSize=80;int MaxGeneration=200;double Pc=0。
6;struct individual{char chrom[CHROMLENGTH+1];double value;double fitness;};int generation;int best_index;int worst_index;struct individual bestindividual;struct individual worstindividual;struct individual currentbest;struct individual population[POPSIZE];void GenerateInitialPopulation(void);void GenerateNextPopulation(void);void EvaluatePopulation(void);long DecodeChromosome(char *,int,int); void CaculateObjectValue(void);void FindBestAndWorstIndividual(void);void PerformEvolution(void);void SelectionOperator(void);void CrossoverOperator(void);void MutationOperator(void);void OutputTextReport(void);void main(){srand((unsigned)time(NULL)); //随时间而改变随机数generation=0;GenerateInitialPopulation();EvaluatePopulation();while(generation<MaxGeneration){generation++;GenerateNextPopulation();EvaluatePopulation();PerformEvolution();OutputTextReport();}}void GenerateInitialPopulation(void){int i,j;for(i=0;i〈PopSize;i++){for(j=0;j<CHROMLENGTH;j++){population[i].chrom[j]=(random(10)<5)?'1':’0';}population[i].chrom[CHROMLENGTH]=’\0';}}void GenerateNextPopulation(void){SelectionOperator();CrossoverOperator();MutationOperator();}void EvaluatePopulation(void){CaculateObjectValue();CaculateFitnessValue();FindBestAndWorstIndividual();}long DecodeChromosome(char *string,int point,int length){int i;long decimal=0;char *pointer;for(i=0,pointer=string+point;i<length;i++,pointer++) {decimal+=(*pointer—'0')<〈(length—1—i);}return(decimal);}void CaculateObjectValue(void)int i;long temp1,temp2;double x1,x2;for(i=0;i<PopSize;i++){temp1=DecodeChromosome(population[i]。
1、遗传算法介绍遗传算法,模拟达尔文进化论的自然选择和遗产学机理的生物进化构成的计算模型,一种不断选择优良个体的算法。
谈到遗传,想想自然界动物遗传是怎么来的,自然主要过程包括染色体的选择,交叉,变异(不明白这个的可以去看看生物学),这些操作后,保证了以后的个基本上是最优的,那么以后再继续这样下去,就可以一直最优了。
2、解决的问题先说说自己要解决的问题吧,遗传算法很有名,自然能解决的问题很多了,在原理上不变的情况下,只要改变模型的应用环境和形式,基本上都可以。
但是遗传算法主要还是解决优化类问题,尤其是那种不能直接解出来的很复杂的问题,而实际情况通常也是这样的。
本部分主要为了了解遗传算法的应用,选择一个复杂的二维函数来进行遗传算法优化,函数显示为y=10*sin(5*x)+7*abs(x-5)+10,这个函数图像为:怎么样,还是有一点复杂的吧,当然你还可以任意假设和编写,只要符合就可以。
那么现在问你要你一下求出最大值你能求出来吗?这类问题如果用遗传算法或者其他优化方法就很简单了,为什么呢?说白了,其实就是计算机太笨了,同时计算速度又超快,举个例子吧,我把x等分成100万份,再一下子都带值进去算,求出对应的100万个y的值,再比较他们的大小,找到最大值不就可以了吗,很笨吧,人算是不可能的,但是计算机可以。
而遗传算法也是很笨的一个个搜索,只不过加了一点什么了,就是人为的给它算的方向和策略,让它有目的的算,这也就是算法了。
3、如何开始?我们知道一个种群中可能只有一个个体吗?不可能吧,肯定很多才对,这样相互结合的机会才多,产生的后代才会多种多样,才会有更好的优良基因,有利于种群的发展。
那么算法也是如此,当然个体多少是个问题,一般来说20-100之间我觉得差不多了。
那么个体究竟是什么呢?在我们这个问题中自然就是x值了。
其他情况下,个体就是所求问题的变量,这里我们假设个体数选100个,也就是开始选100个不同的x值,不明白的话就假设是100个猴子吧。
遗传算法简述及代码详解声明:本文内容整理自网络,认为原作者同意转载,如有冒犯请联系我。
遗传算法基本内容遗传算法为群体优化算法,也就是从多个初始解开始进行优化,每个解称为一个染色体,各染色体之间通过竞争、合作、单独变异,不断进化。
遗传学与遗传算法中的基础术语比较染色体:又可以叫做基因型个体(individuals)群体/种群(population):一定数量的个体组成,及一定数量的染色体组成,群体中个体的数量叫做群体大小。
初始群体:若干染色体的集合,即解的规模,如30,50等,认为是随机选取的数据集合。
适应度(fitness):各个个体对环境的适应程度优化时先要将实际问题转换到遗传空间,就是把实际问题的解用染色体表示,称为编码,反过程为解码/译码,因为优化后要进行评价(此时得到的解是否较之前解优越),所以要返回问题空间,故要进行解码。
SGA采用二进制编码,染色体就是二进制位串,每一位可称为一个基因;如果直接生成二进制初始种群,则不必有编码过程,但要求解码时将染色体解码到问题可行域内。
遗传算法的准备工作:1) 数据转换操作,包括表现型到基因型的转换和基因型到表现型的转换。
前者是把求解空间中的参数转化成遗传空间中的染色体或者个体(encoding),后者是它的逆操作(decoding)2) 确定适应度计算函数,可以将个体值经过该函数转换为该个体的适应度,该适应度的高低要能充分反映该个体对于解得优秀程度。
非常重要的过程。
遗传算法基本过程为:1) 编码,创建初始群体2) 群体中个体适应度计算3) 评估适应度4) 根据适应度选择个体5) 被选择个体进行交叉繁殖6) 在繁殖的过程中引入变异机制7) 繁殖出新的群体,回到第二步实例一:(建议先看实例二)求 []30,0∈x 范围内的()210-=x y 的最小值1) 编码算法选择为"将x 转化为2进制的串",串的长度为5位(串的长度根据解的精度设 定,串长度越长解得精度越高)。
遗传算法的VB程序最近看了下遗传算法,刚看了一点,就觉得手痒,非要把程序编制出来看看效果(我现在总认为那些理论再高深,无法用计算机实现就是空话,呵呵)。
下面是我调试了好久的代码,无赖没有学过数据结构&算法,程序写的很差,单效果还是出来了,高兴,和大家共同分享下成果吧。
还是一样,不想说原理,因为这里想搞个公式上去N麻烦。
直接给点实际的东西。
具体步骤是参考《MATLAB遗传算法工具箱及应用》(西安电子科技大学出版社)16~22页的相关说明编制的,有兴趣的同学可以去看看这本书。
在程序调试成功的同时,郁闷的是工作的事情,现在好多企业久是指名不要研究生,而我又是一个四不象,本专业是热能工程,可我本专业基本上还是本科水平,大部分时间都去自学一些杂七杂八的东西去了,比如人工智能,PLC,自动控制方面,图像处理啊,可又只是懂个皮毛,现在找工作也不知道怎么给自己定位了。
有相关经历的同学可要指点我一二哦。
Option Explicit'程序实现功能:用遗传算法求函数的最大值'作者: laviewpbt'联系方式:'QQ:33184777'版本:Version 1.4.0'说明:复制请保留源作者信息,转载请说明,欢迎大家提出意见和建议Dim N2(30) As Long '用来保存2的N次方的数据Dim Script As Object '调用其Eval函数Public Enum CrossOverOnePointCrossOver '单点交叉TwoPointCrossOver '两点交叉UniformCrossOver '平均交叉End EnumPublic Enum SelectionRouletteWheelSelection '轮盘赌选择StochasticTourament '随机竞争选择RandomLeagueMatches '随机联赛选择StochasticUniversalSampleing '随机遍历取样End EnumPublic Enum EnCodingBinary '标准二进制编码Gray '格雷码End EnumPrivate Type GAinfoMax As DoubleCordinate() As DoubleEnd Type'*********************************** 二进制码转格雷码***********************************''函数名: BinaryToGray'参数: Value - 要转换的二进制数的实值'说明:如3对应的二进制表示为0011,而用格雷码表示为0010,这个函数的value为0011代表的实数' 而返回的是0010所代表的实数(2)'返回值:返回格雷码对应的二进制数的实值'源作者:黄毅'开发语言: C语言'修改者: laviewpbt'时间: 2006-11-4''*********************************** 二进制码转格雷码***********************************Public Function BinaryToGray(Value As Long) As LongDim V As Long, Max As LongDim start As Long, mEnd As Long, Temp As Long, Counter As Long Dim Flag As BooleanV = Value: Max = 1While V > 0V = V / 2Max = Max * 2WendIf Max = 0 Then Exit FunctionFlag = TruemEnd = Max - 1While start < mEndTemp = (mEnd + start - 1) / 2If Value <= Temp ThenIf Not Flag ThenCounter = Counter + (mEnd - start + 1) / 2End IfmEnd = TempFlag = TrueElseIf Flag ThenCounter = Counter + (mEnd - start + 1) / 2End IfTemp = Temp + 1start = TempFlag = FalseEnd IfWendBinaryToGray = CounterEnd Function'*********************************** 格雷码转二进制码***********************************''函数名: BinaryToGray'参数: Value - 要转换的二进制数的实值'说明:如3对应的二进制表示为0011,而用格雷码表示为0010,这个函数的value为0010代表的实数' 而返回的是0010所代表的实数(2)'返回值:返回格雷码对应的二进制数的实值'源作者:黄毅,感谢viena(维也纳nn)'开发语言: C语言'修改者: laviewpbt'时间: 2006-11-4''*********************************** 格雷码转二进制码***********************************Public Function GrayToBinary(Value As Long) As LongDim V As Long, Max As LongDim start As Long, mEnd As Long, Temp As Long, Counter As Long Dim Flag As BooleanV = Value: Max = 1While V > 0V = V / 2Max = Max * 2WendFlag = TruemEnd = Max - 1While start < mEndTemp = Counter + (mEnd - start + 1) / 2If Flag Xor (Value < Temp) ThenIf Flag Then Counter = Tempstart = (start + mEnd + 1) / 2Flag = FalseElseIf Not Flag Then Counter = TempmEnd = (start + mEnd - 1) / 2Flag = TrueEnd IfWendGrayToBinary = startEnd Function'*********************************** 十进制转转二进制码***********************************''函数名: DecToBinary'参数: Value - 要转换的十进制数'返回值:返回对应的二进制数'修改者: laviewpbt'时间: 2006-11-4''*********************************** 十进制转转二进制码***********************************Private Function DecToBinary(ByVal Value As Long) As String Dim StrTemp As StringDim ModNum As IntegerDo While Value > 0ModNum = Value Mod 2Value = Value \ 2StrTemp = ModNum & StrTempLoopDecToBinary = StrTempEnd Function'************************************* 二十进制转换**********************************''函数名: BinToDec'参数: BinCode - 二进制字符串'返回值:转换后的十进制数'说明:二进制字符串转换位十进制数'作者: laviewpbt'时间: 2006-11-3''************************************* 二十进制转换**********************************Public Function BinToDec(BinCode As String) As LongDim i As Integer, Dec As Long, Length As IntegerLength = Len(BinCode)For i = 1 To LengthIf Mid(BinCode, i, 1) = "1" ThenDec = Dec + N2(Length - i)End IfNextBinToDec = DecEnd Function'*********************************** 编码***********************************''过程名: Coding'参数: Bits - 需要编码的位数' BinGroup - 保存群体编码数据的数组'说明:编码,准确的说应该是初始化种群,对于二进制码和格雷码这个过程一样的'作者: laviewpbt'时间: 2006-11-3''*********************************** 编码***********************************Public Sub Coding(Bits As Integer, BinGroup() As String)Dim i As Integer, j As IntegerDim Temp As StringRandomizeFor i = 1 To UBound(BinGroup, 1)Temp = ""For j = 1 To BitsIf Rnd >= 0.5 ThenTemp = Temp & "1"ElseTemp = Temp & "0"End IfNextBinGroup(i) = Temp。