使用遗传算法求解函数最大值

使用遗传算法求解函数最大值

ID:15140626

大小:205.87 KB

页数:11页

时间:2018-08-01

使用遗传算法求解函数最大值_第1页
使用遗传算法求解函数最大值_第2页
使用遗传算法求解函数最大值_第3页
使用遗传算法求解函数最大值_第4页
使用遗传算法求解函数最大值_第5页
资源描述:

《使用遗传算法求解函数最大值》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、使用遗传算法求解函数最大值题目使用遗传算法求解函数fx,y=x*sin6*y+y*cos⁡(8*x)在x∈[1,2]及y∈[1,2]的最大值。解答算法使用遗传算法进行求解,篇末所附源代码中带有算法的详细注释。算法中涉及不同的参数,参数的取值需要根据实际情况进行设定,下面运行时将给出不同参数的结果对比。定义整体算法的结束条件为,当种群进化次数达到maxGeneration时停止,此时种群中的最优解即作为算法的最终输出。设种群规模为N,首先是随机产生N个个体,实验中定义了类型Chromosome表示一个个体,并且在默认构造函数中即进行了随机

2、的操作。然后程序进行若干次的迭代,在每次迭代过程中,进行选择、交叉及变异三个操作。一选择操作首先计算当前每个个体的适应度函数值,这里的适应度函数即为所要求的优化函数,然后归一化求得每个个体选中的概率,然后用轮盘赌的方法以允许重复的方式选择选择N个个体,即为选择之后的群体。但实验时发现结果不好,经过仔细研究之后发现,这里在x、y取某些值的时候,目标函数计算出来的适应值可能会出现负值,这时如果按照把每个个体的适应值除以适应值的总和的进行归一化的话会出现问题,因为个体可能出现负值,总和也可能出现负值,如果归一化的时候除以了一个负值,选择时就会

3、选择一些不良的个体,对实验结果造成影响。对于这个问题,我把适应度函数定为目标函数的函数值加一个正数,保证得到的适应值为正数,然后再进行一般的归一化和选择的操作。实验结果表明,之前的实验结果很不稳定,修正后的结果比较稳定,趋于最大值。二交叉操作首先是根据交叉概率probCross选择要交叉的个体进行交叉。这里根据交叉参数crossnum进行多点交叉,首先随机生成交叉点位置,允许交叉点重合,两个重合的交叉点效果互相抵消,相当于没有交叉点,然后根据交叉点进行交叉操作,得到新的个体。三变异操作首先是根据变异概率probMutation选择要变异

4、的个体。变异时先随机生成变异的位置,然后把改位的01值翻转。经过一定的进化之后得到最终种群,从中选择最优的个体即可得到最终的结果。运行结果借助matlab软件,我们可以知道该函数在该定义域下的图像为:以下设置不同的参数值进行对比试验:表1不同参数的对比实验NlencrossnummaxGenerationprobCrossprobMutate实验一实验二11010410000.850.152.614332042.7469711725010450000.850.152.871765122.88383150320020450000.850.

5、152.892027452.893073594200304100000.850.152.894406562.888525515200305100000.80.22.888068212.8916507363004041000000.850.152.893637392.89445359以上我们主要对种群规模N,个体染色体长度len,迭代次数maxGeneration进行比较。可以看出,随着种群规模的增大,染色体长度的增长,迭代次数的增加,算法得到的结果越来越精确。当参数规模达到一定程度时,再增加参数的值会明显地增加程序运行时间,但却不一定能

6、明显改善解的质量,反而可能因为一些随机因数而产生质量更差的解,如第6组实验一所示。同时也大概比较了一下多点交叉的交叉点个数crossnum,交叉概率probCross,变异概率probMutate等参数,由于参数太多,这里没有一一进行控制变量的比较。大致估算可知,交叉概率及交叉点的个数影响交叉操作产生新个体的质量,过多的交叉及变化过大的交叉可能会产生不好的结果,而过多的变异也应该会造成算法的不稳定。下面给出以上几个实验结果的实验截图,其中到现在为止结果最好的一个为:其余若干个为:算法改进以上实验得到的最好结果仍然是差强人意,这里对算法做

7、一个小的优化,即添加防止种群退化的操作。记录当前位置所得到的最优值及对应的个体,每次更新种群之后,计算新种群的最优值,如果最优值变差了,则把之前较优的个体替换进新种群,防止种群退化;否则更新最优值。改进之后的效果如下所示,显然比之前更优,且实验结果显示对于前面对比实验中的参数值,这里只需要较小的参数(如迭代次数只需2000次)值即可稳定收敛到此最大值,可知改进非常有效。增加输出精度之后为,于是得到最优的结果为2.894471354862841源代码改进后的源代码如下:#include#include

8、#include#include#includeusingnamespacestd;//程序欲分配内存的数组大小constintmxn=10000;//最大

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。