使用遗传算法求解函数最大值
题目
使用遗传算法求解函数
f(x,y)=x*sin(6*y)+y*cos(8*x)在xG[1,2]及yG[1,2]的最大值。
解答
算法
使用遗传算法进行求解,篇末所附源代码中带有算法的详细注释。算nji+4~)
iff!flag)
swap([i][i];)j
i==crct5spoint[j]J
if{
//如果若干个交叉点重合_■则效果叠加
//輙个交叉点效杲相当于没有交叉点
whilefj:trOEsnumMi==trosspoint[j]
j+Bflag=!flag;}
三变异操作
首先是根据变异概率probMutation选择要变异的个体。
JJ根据变异畴进行娈异for(inti=§_;if■十)
if(random01()<probMutation)
mutate(groLip[i])j
变异时先随机生成变异的位置,然后把改位的01值翻转。
H变异操作
□voidmutaChronoso-me-1
{//随机选择T锻行翻转
=randQSlenj
<=-E[i]=!c_g[i]i
经过一定的进化之后得到最终种群,从中选择最优的个体即可得到最终的结果。
//菽取种群最刖休
EintgctOptimal(Chramsomegroui:[mKn]jd?ub-le&Xjdoubl亡呂y,doubledv^'.){//计算适应值,遍历彳昙到最优值井进行解码
doubl亡fitnfS5HN]_[inKn]j
for(inti=0;i<Nji-i-i-)fitnessVal[i]=fitne53(g-oup[i]Jj
intid=曲;
for(inti=1;i<Nji-i-i-)
if(fitressVal[i]>fitne£sVal[id])
id=i;
deccde(group[id]j,);
™i=ffx,y};
returnid:
运行结果
借助matlab软件,我们可以知道该函数在该定义域下的图像为:
4
2
□
-2
2
1
1
-4
2
函数脳,y)=x*sin(6*y)+fcos(6*x)的囲像
以下设置不同的参数值进行对比试验:
表1不同参数的对比实验
N
len
crossnum
maxGeneration
probCross
probMutate
实验一
实验二
1
10
10
4
1000
2
50
10
4
5000
3
200
20
4
5000
4
200
30
4
10000
5
200
30
5
10000
6
300
40
4
100000
以上我们主要对种群规模N,个体染色体长度len,迭代次数maxGeneration进行比较。可以看出,随着种群规模的增大,染色体长度的增长,迭代次数的增加,算法得到的结果越来越精确。当参数规模达到一定程度时,再增加参数的值会明显地增加程序运行时间,但却不一定能明显改善解的质量,反而可能因为一些随机因数而产生质量更差的解,如第6组实验一所示。
同时也大概比较了一下多点交叉的交叉点个数crossnum,交叉概率probCross,变异概率probMutate等参数,由于参数太多,这里没有一一进行控制变量的比较。大致估算可知,交叉概率及交叉点的个数影响交叉操作产生新个体的质量,过多的交叉及变化过大的交叉可能会产生不好的结果,而过多的变异也应该会造成算法的不稳定。
下面给出以上几个实验结果的实验截图,其中到现在为止结果最好的一个为:
算法改进
以上实验得到的最好结果仍然是差强人意,这里对算法做一个小的优化,即添加防止种群退化的操作。记录当前位置所得到的最优值及对应的个体,每次更新种群之后,计算新种群的最优值,如果最优值变差了,则把之前较优的
使用遗传算法求解函数最大值 来自淘豆网m.daumloan.com转载请标明出处.