1、的适应值,显然,适应值最高的个体被随机选定的概率就越大,被选择的次数就越多,从而被繁殖的次数也就越多。(2)单点交叉。单点交叉又称简单交叉,是遗传算法所使用的交叉操作方法。选择一个交叉点,子代在交叉点前面的基因从一个父代基因那里得到,后面的部分从另外一个父代基因那里得到。如:交叉前:100|10101|01交叉后:100|01101|10(3)基本位变异。基本位变异石最简单和最基本的变异操作,也是基本遗传算法中所使用的变异操作方法。对于基本遗传算法中用二进制编码符号串所表示的个体,对需要进行变异操作的某一基因,若原有基因值为0,则变异操作将该基因值变为1;反之,若原有基因值为1,则变异操作将其
2、变为0.基本位变异算子是指对个体编码串随机指定的某一位或某几位基因作变异运算。对于基本遗传算法中用二进制编码符号串所表示的个体,若需要进行变异操作的某一基因座上的原有基因值为0,则变异操作将其变为1;反之,若原有基因值为1,则变异操作将其变为0。变异前:1001|0变异后:1001|1(4)基本遗传算法的运行参数本例中指定四个基本参数种群大小:popsize最大世代数 maxgeneration交叉率pc 变异率pm至于遗传算法的终止条件,还可以利用某种判定准则,当判定出群体已经进化成熟且不再有进化趋势时就可终止算法的运行过程。如连续几代个体平均适应度的差异小于某一个极小的值;或者群体中所有个
3、体适应度的方差小于某一个极小的值。这4个参数对遗传算法的搜索结果及搜索效率都有一定的影响,目前尚无合理选择它们的理论根据在遗传算法的实际应用中,往往需要经过多次的试算后才能确定出这些参数合理的取值范围或取值大小4、遗传算法的应用步骤如下:遗传算法提供了一种求解复杂系统优化问题的通用框架,它不依赖于问题的领域和种类。对一个需要进行优化计算的实际应用问题,一般可按下述步骤来构造求解该问题的遗传算法。第一步:建立优化模型,即确定出目标函数、决策变量及各种约束条件以及数学描述形式或量化方法。第二步:确定表示可行解的染色体编码方法,也即确定出个体的基因型x及遗传算法的搜索空间。第三步:确定解码方法,即确
4、定出个体基因型x到个体表现型x的对应关系或转换方法。第四步:确定个体适应度的量化评价方法,即确定出由目标函数值到个体适应度的转换规则。第五步:设计遗传操作方法,即确定出选择运算、交叉运算、变异运算等具体操作方法。第六步:确定遗传算法的有关运行参数,即确定出遗传算法的种群大小(popsize)、最大世代数 (maxgeneration)、交叉率(pc)、变异率(pm)等参数。由上述构造步骤可以看出,可行解的编码方法、遗传操作的设计是构造遗传算法时需要考虑的两个主要问题,也是设计遗传算法时的两个关键步骤。对不同的优化问题需要使用不同的编码方法和不同的遗传操作,它们与所求解的具体问题密切相关,因而对
5、所求解问题的理解程度是遗传算法应用成功与否的关键。本例c语言代码/遗传算法 解决 y=x2问题/编译环境 vc+6.0/声明:部分代码来自网#include #includetime.hmath.h#define POPSIZE 500 /种群大小#define chromlength 5 /染色体长int popsize ; /种群大小int maxgeneration; /最大世代数double pc = 0.0; /交叉率double pm = 0.0; /变异率struct individual /定义染色体个体结构体 int chromchromlength; /定义染色体二进制表达
6、形式,edit by ppme 将char 转为 int double value; /染色体的值 double fitness; /染色体的适应值;int generation; /当前执行的世代数int best_index; /最好的染色体索引序号int worst_index; /最差的染色体索引序号struct individual bestindividual; /最佳染色体个体struct individual worstindividual; /最差染色体个体struct individual currentbest; /当前最好的染色体个体 currentbeststruct
7、 individual populationPOPSIZE;/种群数组/函数声明 void generateinitialpopulation(); /ok-初始化当代种群 void generatenextpopulation(); /产生下一代种群void evaluatepopulation(); /评价种群void calculateobjectfitness(); /计算种群适应度double decodechromosome(int,int); /染色体解码void findbestandworstindividual(); /寻找最好的和最坏的染色体个体void performe
8、volution(); /进行演变进化void selectoperator(); /选择操作void crossoveroperator(); /交换操作void mutationoperator(); /变异操作void input(); /输入接口void outputtextreport(); /输出文字报告void main() /主函数 int i; srand(unsigned)time(NULL); /强制类型转化,以当前时间戳定义随机数种子 printf(本程序为求函数y=x*x的最大值n); generation=0; /初始化generation当前执行的代 input(
9、); /初始化种群大小、交叉率、变异率 /*edit by ppme*/ /调试用。显示input()结果种群规模(popsize): %d;n最大世代数(maxgeneration) %d;n交叉率(pc) %f;变异率(pm) %fnn,popsize,maxgeneration,pc,pm); generateinitialpopulation(); /产生初始化种群 evaluatepopulation(); /评价当前种群,(A.计算种群/个体的适应度;B.找出最好和最差的个体) while(generationmaxgeneration) /小于最大世代数,执行循环体 genera
10、tion+; generatenextpopulation(); /生成子代种群(A.选择; B.交叉; C.变异) evaluatepopulation(); /评价新生子代种群 performevolution(); /进行子代进化 outputtextreport(); /输入当代最终种群 n 统计结果: 最大函数值等于:%fn,currentbest.fitness);其染色体编码为: /计算currentbest的value for( i = 0 ; i chromlength ; i+ ) printf( %d,currentbest.chromi);void generatein
11、itialpopulation( ) /种群初始化 int i,j; for (i=0;ipopsize; i+) for(j=0;jchromlength;j+) populationi.chromj=(rand()%105)?0:1; /rand()%10随机产生0-9的整数 /,小于5标注0,否则标注1 /调试显示初始化结果显示初始化结果: for(i = 0 ; popsize ; for(j = 0 ; j = 0 ; i- ) decimal += populationpop_index.chromi*pow(2,i); /遍历染色体二进制编码, return (decimal);
12、 /并计算出其10进制的value值void findbestandworstindividual( ) /求最佳个体和最差个体 double sum=0.0; bestindividual=population0; worstindividual=population0; for (i=1; if (populationi.fitnessbestindividual.fitness) /依次比较,找出最佳个体 bestindividual=populationi; best_index=i; else if (populationi.fitness=currentbest.fitness)/
13、第n代最好的,通过比较大于以往最好个体的话, /暂时存放在currentbest currentbest=bestindividual;void performevolution() /演示评价结果 if (bestindividual.fitnesscurrentbest.fitness) currentbest=populationbest_index; populationworst_index=currentbest;void selectoperator() /比例选择算法 int i,index; double p,sum=0.0; /p存放随机概率,sum存放个体适应率和累计适应
14、率 double cfitnessPOPSIZE; /当代种群染色体个体的适应率 struct individual newpopulationPOPSIZE; /新种群 srand(unsigned) time(NULL); /种下随机种子i+) / /sum存放种群适应值总和 i+) cfitnessi=populationi.fitness/sum; / cfitness = fitness/sum得到个体适应率 for(i=1; cfitnessi=cfitnessi-1+cfitnessi; /cfitness= cfitnessi-1+cfitnessi得到种群 /累计适应率i+)
15、 /for循环实现轮盘赌算法 p=rand()%1000/1000.0; /得到千分位小数 index=0; while (pcfitnessindex) index+; newpopulationi=populationindex; /选出的个体组成新的一代,暂时存放于newpopulation中 populationi=newpopulationi; /全局变量populaiton存放新的种群(有重复的值)void crossoveroperator() /交叉算法 int indexPOPSIZE; int point,temp; double p;i+) /初始化index数组 ind
16、exi=i;i+) /for 循环实现种群内随机两两交换 point=rand()%(popsize-i); /打乱种群顺序 temp=indexi; indexi=indexpoint+i; indexpoint+i=temp;popsize-1;i+=2) if (ppc) /单点交叉算法 point=rand()%(chromlength-1)+1; for (j=point; jj+) temp=populationindexi.chromj; populationindexi.chromj=populationindexi+1.chromj; populationindexi+1.c
17、hromj=temp; void mutationoperator() /变异操作i+) p=rand()%1000/1000.0; if (ppm) populationi.chromj=(populationi.chromj=0)?1:0;void input() /数据输入初始化全局变量:种群大小(4-500偶数): scanf(%d, &popsize); /输入种群大小,必须为偶数 if(popsize%2) != 0) 种群大小已设置为偶数n popsize+; ;最大世代数(10-300): /输入最大世代数maxgeneration);交叉率(0.2-1.0): /输入交叉率%
18、lfpc);变异率(0.00): /输入变异率pm);void outputtextreport()/数据输出 double sum; double average; sum=0.0; sum+=populationi.value; average=sum/popsize;当前世代=%dn当前世代染色体平均值=%fn当前世代染色体最高值=%fn,generation,average,populationbest_index.value);运行结果:/*本程序为求函数y=x*x的最大值450.90.01 4;最大世代数(maxgeneration) 5;交叉率(pc) 0.900000;变异率(pm) 0.010000 0 1 0 0 1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 1显示当前种群结
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1