利用遗传算法求解函数最大值题目利用遗传算法求解函数f(x,y)=x∗sin(6∗y)+y∗cos(8∗x)在x∈[1,2]及y∈[1,2]的最大值。解答算法利用遗传算法进行求解,篇末所附源代码中带有算法的详细注释。算法中涉及不同的参数,参数的取值需要依如实际情形进行设定,下面运行时将给出不同参数的结果对照。概念整体算法的终止条件为,当种群进化次数达到maxGeneration时停止,现在种群中的最优解即作为算法的最终输出。设种群规模为N,第一是随机产生N个个体,实验中概念了类型Chromosome表示一个个体,而且在默许构造函数中即进行了随机的操作。然后程序进行假设干次的迭代,在每次迭代进程中,进行选择、交叉及变异三个操作。一选择操作第一计算当前每一个个体的适应度函数值,那个地址的适应度函数即为所要求的优化函数,然后归一化求得每一个个体选中的概率,然后用轮盘赌的方式以许诺重复的方式选择选择N个个体,即为选择以后的群体。但实验时发觉结果不行,通过认真研究以后发觉,那个地址在x、y取某些值的时候,目标函数计算出来的适应值可能会显现负值,这时若是依照把每一个个体的适应值除以适应值的总和的进行归一化的话会显现问题,因为个体可能显现负值,总和也可能显现负值,若是归一化的时候除以了一个负值,选择时就会选择一些不良的个体,对实验结果造成阻碍。对于那个问题,我把适应度函数定为目标函数的函数值加一个正数,保证取得的适应值为正数,然后再进行一样的归一化和选择的操作。实验结果说明,之前的实验结果很不稳固,修正后的结果比较稳固,趋于最大值。二交叉操作第一是依照交叉概率probCross选择要交叉的个体进行交叉。那个地址依照交叉参数crossnum进行多点交叉,第一随机生成交叉点位置,许诺交叉点重合,两个重合的交叉点成效相互抵消,相当于没有交叉点,然后依照交叉点进行交叉操作,取得新的个体。三变异操作第一是依照变异概率probMutation选择要变异的个体。变异时先随机生成变异的位置,然后把改位的01值翻转。通过必然的进化以后取得最终种群,从中选择最优的个体即可取得最终的结果。运行结果借助matlab软件,咱们能够明白该函数在该概念域下的图像为:以下设置不同的参数值进行对如实验:表1不同参数的对如实验1N10len10crossnummaxGenerationprobCrossprobMutate410000.850.15实验一实验二2.614332042.7469711723456502002002003001020303040444545000500010000100001000000.850.850.850.80.850.150.150.150.20.152.871765122.883831502.892027452.893073592.894406562.888525512.888068212.891650732.893637392.89445359以上咱们要紧对种群规模N,个体染色体长度len,迭代次数maxGeneration进行比较。能够看出,随着种群规模的增大,染色体长度的增加,迭代次数的增加,算法取得的结果愈来愈精准。当参数规模达到必然程度时,再增加参数的值会明显地增加程序运行时刻,但却不必然能明显改善解的质量,反而可能因为一些随机因数而产生质量更差的解,如第6组实验一所示。同时也可能比较了一下多点交叉的交叉点个数crossnum,交叉概率probCross,变异概率probMutate等参数,由于参数太多,那个地址没有一一进行操纵变量的比较。大致估算可知,交叉概率及交叉点的个数阻碍交叉操作产生新个体的质量,过量的交叉及转变过大的交叉可能会产生不行的结果,而过量的变异也应该会造成算法的不稳固。下面给出以上几个实验结果的实验截图,其中到此刻为止结果最好的一个为:其余假设干个为:算法改良以上实验取得的最好结果仍然是差强人意,那个地址对算法做一个小的优化,即添加避免种群退化的操作。记录当前位置所取得的最优值及对应的个体,每次更新种群以后,计算新种群的最优值,若是最优值变差了,那么把之前较优的个体替换进新种群,避免种群退化;不然更新最优值。改良以后的成效如下所示,显然比之前更优,且实验结果显示关于前面对如实验中的参数值,那个地址只需要较小的参数(如迭代次数只需2000次)值即可稳固收敛到此最大值,可知改良超级有效。增加输出精度以后为,于是取得最优的结果为2.894471354862841源代码改良后的源代码如下:#include