遗传算法简介和代码详解_第1页
遗传算法简介和代码详解_第2页
遗传算法简介和代码详解_第3页
遗传算法简介和代码详解_第4页
遗传算法简介和代码详解_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.遗传算法简述及代码详解声明:本文内容整理自网络,认为原作者同意转载,如有冒犯请联系我。遗传算法基本内容遗传算法为群体优化算法,也就是从多个初始解开始进行优化,每个解称为一个染色体,各染色体之间通过竞争、合作、单独变异,不断进化。遗传学与遗传算法中的基础术语比较染色体 数据,数组,序列基因单个元素,位等位基因数据值,属性,值基因座 位置,iterator位置表现型 参数集,解码结构,候选解染色体:又可以叫做基因型个体群体/种群:一定数量的个体组成,及一定数量的染色体组成,群体中个体的数 量叫做群体大小。初始群体:若干染色体的集合,即解的规模,如30,50等,认为是随机选取的数据集合。适应度:各

2、个个体对环境的适应程度优化时先要将实际问题转换到遗传空间,就是把实际问题的解用染色体表示,称为编码,反过程为解码/译码,因为优化后要进行评价此时得到的解是否较之前解优越,所以要返回问题空间,故要进行解码。SGA采用二进制编码,染色体就是二进制位串,每一位可称为一个基因;如果直接生成二进制初始种群,则不必有编码过程,但要求解码时将染色体解码到问题可行域内。遗传算法的准备工作: 数据转换操作,包括表现型到基因型的转换和基因型到表现型的转换。前者是把求解空间中的参数转化成遗传空间中的染色体或者个体,后者是它的逆操作2确定适应度计算函数,可以将个体值经过该函数转换为该个体的适应度,该适应度的高低要能充

3、分反映该个体对于解得优秀程度。非常重要的过程。遗传算法基本过程为:1 编码,创建初始群体2 群体中个体适应度计算3 评估适应度4 根据适应度选择个体5 被选择个体进行交叉繁殖6 在繁殖的过程中引入变异机制7 繁殖出新的群体,回到第二步实例一:建议先看实例二求 范围内的的最小值1 编码算法选择为将转化为2进制的串,串的长度为5位串的长度根据解的精度设定,串长度越长解得精度越高。2 计算适应度的方法是:先将个体串进行解码,转化为int型的x值,然后使用作为其适应度计算合适。需要说明,将原目标函数设置为适应度函数是一种选择,但未必是最贴切的方法。3 正式开始,先设置群体大小为4,然后初始化群体 =

4、4 计算适应度Fi 计算每个个体的选择概率,选择概率要能够反映个体的优秀程度。这里用一个很简单的方法来确定选择概率 6 选择根据所有个体的选择概率进行淘汰选择。这里使用的是一个赌轮的方式进行淘汰选择。先按照每个个体的选择概率创建一个赌轮,然后选取4次,每次先产生一个0-1的随机小数,然后判断该随机数落在那个段内就选取相对应的个体。这个过程中,选取概率高的个体将可能被多次选择,而概率低的就可能被淘汰。下面是一个简单的赌轮的例子 13% 35% 15% 37% -|-|-|-|个体1 个体2 个体3 0.67 个体4随机数为0.67落在了个体4的端内,本次选择了个体4。被选中的个体将进入配对库准备

5、开始繁殖。7 简单交叉先对配对库中的个体进行随机配对,然后在配对的2个个体中设置交叉点,交换2个个体的信息后产生下一代。比如 -交叉- -交叉- 2个父代的个体在交叉后繁殖出了下一代的同样数量的个体.复杂的交叉在交叉的位置,交叉的方法,双亲的数量上都可以选择.其目的都在于尽可能的培育出更优秀的后代8 变异变异操作时按照基因座来的,比如说每计算2万个基因座就发生一个变异变异的结果是基因座上的等位基因发生了变化。我们这里的例子就是把0变成1或则1变成0。至此,我们已经产生了一个新的群体,然后回到第4步,周而复始,生生不息下去。实例二:为了便于理解,手工计算来简单地模拟遗传算法的各个主要执行步骤:个

6、体编码遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种符号串。本题中,用无符号二进制整数编码方式较多来表示。因 x1, x2 为 0 7之间的整数,所以分别用3位无符号二进制整数来表示,将它们连接在一起所组成的6位无符号二进制数就形成了个体的基因型,表示一个可行解。例如,基因型 X101110 所对应的表现型是:x 5,6 。个体的表现型x和基因型X之间可通过编码和解码程序相互转换。初始群体的产生 遗传算法是对群体进行的进化操作,需要给其淮备一些表示起始搜索点的初始群体数据。 本例中,群体规模的大小随机选取取为4,即群体由4个个体组成,每个个体可通过随机方法产生。

7、 如:011101,101011,011100,111001适应度汁算 遗传算法中以个体适应度的大小来评定各个个体的优劣程度,从而决定其遗传机会的大小。 本例中,目标函数总取非负值,并且是以求函数最大值为优化目标,故可直接利用目标函数值作为个体的适应度适应度函数可以有许多。选择运算 选择运算把当前群体中适应度较高的个体按某种规则或模型遗传到下一代群体中。一般要求适应度较高的个体将有更多的机会遗传到下一代群体中。本例中,我们采用与适应度成正比的概率来确定各个个体复制到下一代群体中的数量。其具体操作过程是: 先计算出群体中所有个体的适应度的总和 ; 其次计算出每个个体的相对适应度的大小,它即为每个

8、个体被遗传到下一代群体中的概率; 每个概率值组成一个区域,全部概率值之和为1; 最后再产生一个0到1之间的随机数,依据该随机数出现在上述哪一个概率区域内来确定各个个体被选中的次数。详见下图 交叉运算 交叉运算是遗传算法中产生新个体的主要操作过程,它以某一概率相互交换某两个个体之间的部分染色体。 本例采用单点交叉的方法,其具体操作过程是: 先对群体进行随机配对; 其次随机设置交叉点位置; 最后再相互交换配对染色体之间的部分基因。 变异运算 变异运算是对个体的某一个或某一些基因座上的基因值按某一较小的概率进行改变,它也是产生新个体的一种操作方法。 本例中,我们采用基本位变异的方法来进行变异运算,其

9、具体操作过程是: 首先确定出各个个体的基因变异位置,下表所示为随机产生的变异点位置, 其中的数字表示变异点设置在该基因座处; 然后依照某一概率将变异点的原有基因值取反。对群体P进行一轮选择、交叉、变异运算之后可得到新一代的群体p。从上表中可以看出,群体经过一代进化之后,其适应度的最大值、平均值都得到了明显的改进。事实上,这里已经找到了最佳个体111111。注意 需要说明的是,表中有些栏的数据是随机产生的。这里为了更好地说明问题,我们特意选择了一些较好的数值以便能够得到较好的结果,而在实际运算过程中,有可能需要一定的循环次数才能达到这个最优结果。选择要能够合理的反映适者生存的自然法则,而交叉必须

10、将有利的基因尽量遗传给下一代 算法过程当中有几个随机过程:初始种群的产生是随机产生,但有时为了更好迭代,知道解在某一个值附近,可以认 为设定初始种群确定个体被选中次数时,运用到轮赌法,其产生的数据为随机数据交叉点变异点伪代码:/Init populationforeach individual in population individual = EncodeRandom;while /计算个体适应度 int TotalF = 0; foreach individual in population individual.F = 1000 - Decode-102; TotalF += indi

11、vidual.F; /-选择过程,计算个体选择概率- foreach individual in population individual.P = individual.F / TotalF; /选择 forint i=0;i /SelectIndividual是根据随机数落在段落计算选取哪个个体的函数 MatingPooli = populationSelectIndividualRandom; /-简单交叉- /由于只有4个个体,配对2次 forint i=0;i MatingPool.Parentsi.Mother = MatingPool.RandomPop; MatingPool.

12、Parentsi.Father = MatingPool.RandomPop; /交叉后创建新的集团 population.Clean; foreach Parent in MatingPool.Parents /注意在copy 双亲的染色体时在某个基因座上发生的变异未表现. child1 = Parent.Mother.DivHeader + Parent.Father.DivEnd; child2 = Parent.Father.DivHeader + Parent.Mother.DivEnd; population.push; population.push; 完整代码如下:#inclu

13、destdafx.h#include#include#include#definePOPSIZE 500#defineMAXIMIZATION 1 /求解函数为求最大值#defineMINIMIZATION 2 /求解函数为求最小值#defineCmax 100 /求解最大值时适应度函数的基准数#defineCmin 0 /求解最小值时适应度函数的基准数 #defineLENGTH1 10 /每一个解用位基因表示#defineLENGTH2 10 #defineCHROMLENGTHLENGTH1+LENGTH2intFunctionMode=MAXIMIZATION; /函数值求解类型是最大

14、值intPopSize=80; /种群规模intMaxGeneration =100; /最大世代数,即最大迭代数doublePc = 0.6; /变异概率doublePm = 0.001; /交叉概率structindividual/定义个体charchromCHROMLENGTH+1; /个体数doublevalue; /个体对应的变量值doublefitness; /个体适应度;intgeneration;intbest_index;intworst_index;structindividualbestindividual;structindividualworstindividual;

15、structindividualcurrentbest;structindividualpopulationPOPSIZE;voidGenerateInitialPopulation;/初始种群生成voidGenerateNextPopulation; /产生下一代种群voidEvaluatePopulation;voidCalculateObjectValue; longDecodeChromosome; /译码voidCalculateFitnessValue; voidFindBestAndWorstIndividual; voidPerformEvolution;voidSelecti

16、onOperator;voidCrossoverOperator; voidMutationOperator;voidOutputTextReport;voidmaingeneration=0; GenerateInitialPopulation; /初始种群生成EvaluatePopulation; /计算种群值,即计算种群适应度whilegeneration generation+; GenerateNextPopulation; /产生下一代种群EvaluatePopulation; /计算种群值,即计算种群适应度PerformEvolution; OutputTextReport; v

17、oidGenerateInitialPopulation /随机产生初始种群,且用0,1表示inti,j; fori=0;i forj=0;jpopulationi.chromj=rand%10?0:1; /rand%n产生一个 / n-1的数populationi.chromCHROMLENGTH=0; voidGenerateNextPopulation SelectionOperator;CrossoverOperator;MutationOperator;voidEvaluatePopulation CalculateObjectValue; CalculateFitnessValue

18、; FindBestAndWorstIndividual; longDecodeChromosome /译码,换算为十进 /制数inti;longdecimal=0L;char *pointer;fori=0,pointer=string+point;idecimal+=; /移位操作,染色体实现十进 /制化 return; voidCalculateObjectValue /计算函数值 inti;longtemp1,temp2;doublex1,x2;for i=0;i /从染色体中读取基因temp1=DecodeChromosome; temp2=DecodeChromosome;x1=4

19、.0*temp1; /xa, b;x2=4.0*temp2; / populationi.value=100*x2;/ 函数表达式voidCalculateFitnessValue /针对不同函数类型计算个体适应度inti;doubletemp;for i=0;iif /函数类型为求解最大值 if0.0temp=Cmin+populationi.value;elsetemp=0.0;elseif /函数类型为求解最小值ifpopulationi.valuetemp=Cmax-populationi.value;elsetemp=0.0;populationi.fitness=temp;void

20、FindBestAndWorstIndividual inti;doublesum=0.0;bestindividual=population0;worstindividual=population0;for i=1;iif bestindividual.fitness bestindividual=populationi;best_index=i;elseif populationi.fitness worstindividual=populationi;worst_index=i;sum+=populationi.fitness; if currentbest=bestindividual

21、; elseif=currentbest.fitness currentbest=bestindividual;voidPerformEvolution /执行进化if currentbest.fitnesscurrentbest=populationbest_index;elsepopulationworst_index=currentbest;voidSelectionOperator /选取最优进化代inti,index;doublep,sum=0.0; doublecfitnessPOPSIZE; structindividualnewpopulationPOPSIZE; fori=0;i sum+=populationi.fitness; fori=0;icfitnessi=populationi.fitness/sum; / 个体的适应度比例 fori=1;icfitnessi=cfitnessi-1+cfitnessi; for i=0;i p=rand%1000/1000.0; index=0;while cfitnessindexindex+;newpopulationi=populationindex; fori=0;ipopulationi=newpopulationi; voidCrossoverOperator /染色体交叉i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论