遗传算法优化求解.docx
《遗传算法优化求解.docx》由会员分享,可在线阅读,更多相关《遗传算法优化求解.docx(19页珍藏版)》请在冰豆网上搜索。
![遗传算法优化求解.docx](https://file1.bdocx.com/fileroot1/2023-1/10/6ce5509a-e668-450f-ab57-ec62ff354b8a/6ce5509a-e668-450f-ab57-ec62ff354b8a1.gif)
遗传算法优化求解
第1题
图1J.D.SchafferFunction图像
图2各代最优值与遗传代数坐标表示图
输出结果:
Q=
0.9980
A=
137
ans=
-0.0352
ans=
0.0274
其中Q为最优值;A为最优值对应的代数;对应的x1=-0.0352,x2=0.0274。
第3题
图3GeneralizedRosenbrockValleyFunction图像
图4适应度最优与遗传代数的坐标表示
图5各代函数最小值与遗传代数的坐标表示
输出结果:
z=
3.9059e+003
index=
88
Q=
0.0053
A=
88
ans=
0.9870
ans=
0.9669
其中:
Z为适应度的最大值,对应在index=88代时产生;
Q为函数最小值,A与index意义相同;
对应坐标x1=0.9870,x2=0.9669
图6遗传算法流程简图
存在问题或缺陷:
没有从根本上深入实现遗传算法的优点,算法内存在具有类似功能的重复模块,例如对对种群适应度的计算,在一次循环(遗传一代)中会进行两次计算,在这一方面有待改进。
算法的另一个缺陷:
由于没有实现对群体适应度平均值的评价,不能从直观上看出有“遗传优化”的效果,即不能看出最优值逐渐变好的趋势。
第1题Matlab程序代码:
clear
clf
popsize=50;%种群大小
chromlength=10;
G=200;%遗传代数(终止代数)
pc=0.6;%交叉概率
pm=0.001;%变异概率
umax=4;
umin=-4;
pop=round(rand(popsize,2*chromlength));%产生初始种群
forj=1:
G
[pxpy]=size(pop);
forr=1:
px%解码
m=pop(r,:
);
y1=0;y2=0;
m1=m(1:
chromlength);
fori=1:
chromlength
y1=y1+m1(i)*2^(i-1);
end
x1=(umax-umin)*y1/1023+umin;
m2=m(chromlength+1:
2*chromlength);
fori=1:
chromlength
y2=y2+m2(i)*2^(i-1);
end
x2=(umax-umin)*y2/1023+umin;
objvalue(r,:
)=0.5-((sin(sqrt(x1.^2+x2.^2))).^2-0.5)/(1+0.001*(x1^2+x2^2)).^2;%计算每个个体函数值
end
globalCmin;
Cmin=0;
[px,py]=size(objvalue);
fori=1:
px%计算适应度
ifobjvalue(i)-Cmin>0
temp=objvalue(i)-Cmin;
else
temp=0.0;
end
fitvalue(i)=temp;
end
fitvalue=fitvalue';
totalfit=sum(fitvalue);%该代种群适应度累加
fitprb=fitvalue/totalfit;%每个个体被选择的概率
fitprb=cumsum(fitprb);%例如fitvalue=[1234]cumsum(fitvalue)=[13610]
[px,py]=size(pop);
%复制部分:
ms=sort(rand(px,1));%从小到大排列
fitin=1;
newin=1;
whilenewin<=px%复制
if(ms(newin))pop(newin)=pop(fitin);
newin=newin+1;
else
fitin=fitin+1;
end
end
%交叉部分
[px,py]=size(pop);
fori=1:
2:
px-1%交叉
if(randcpoint=round(rand*py);
if(cpoint==0)
cpoint=round(rand*py);
end
newpop(i,:
)=[pop(i,1:
cpoint),pop(i+1,cpoint+1:
py)];
newpop(i+1,:
)=[pop(i+1,1:
cpoint),pop(i,cpoint+1:
py)];
else
newpop(i,:
)=pop(i,:
);
newpop(i+1,:
)=pop(i+1,:
);
end
end
pop=newpop;
%变异部分
[px,py]=size(pop);%变异
fori=1:
px
if(randmpoint=round(rand*20);
ifmpoint==0
mpoint=round(rand*20);
end
ifpop(i,mpoint)==0
pop(i,mpoint)=1;
else
pop(i,mpoint)=0;
end
end
newnewpop(i,:
)=pop(i,:
);
end
%计算最大适应值函数值
pop=newnewpop;
[pxpy]=size(pop);
forr=1:
px
m=pop(r,:
);
y1=0;y2=0;
m1=m(1:
chromlength);
fori=1:
chromlength
y1=y1+m1(i)*2^(i-1);
end
x1=(umax-umin)*y1/1023+umin;
m2=m(chromlength+1:
2*chromlength);
fori=1:
chromlength
y2=y2+m2(i)*2^(i-1);
end
x2=(umax-umin)*y2/1023+umin;
objvalue(r,:
)=0.5-((sin(sqrt(x1.^2+x2.^2))).^2-0.5)/(1+0.001*(x1^2+x2^2)).^2;
end
globalCmin;
Cmin=0;
[px,py]=size(objvalue);
fori=1:
px
ifobjvalue(i)-Cmin>0
temp=objvalue(i)-Cmin;
else
temp=0.0;
end
fitvalue(i)=temp;
end
fitvalue=fitvalue';
[px,py]=size(pop);
bestindividual=pop(1,:
);
bestfit=fitvalue
(1);
fori=2:
px-1
iffitvalue(i)>bestfit
bestindividual=pop(i,:
);
bestfit=fitvalue(i);
end
end
w(j)=bestfit;%确定该代最佳适应值
bestpop=bestindividual;%确定该代最佳个体
[qx,qy]=size(bestindividual);%解码计算相应的最佳函数值
forc=1:
1:
qx
m=bestindividual(c,:
);
y1=0;y2=0;
m1=m(1:
1:
qy/2);
fori=1:
1:
qy/2
y1=y1+m1(i)*2^(i-1);
end
x1=(umax-umin)*y1/1023+umin;
m2=m(qy/2+1:
1:
qy);
fori=1:
1:
qy/2
y2=y2+m2(i)*2^(i-1);
end
x2=(umax-umin)*y2/1023+umin;
end
resultmax(j)=0.5-((sin(sqrt(x1.^2+x2.^2))).^2-0.5)/(1+0.001*(x1^2+x2^2)).^2;
bestx1(j)=x1;
bestx2(j)=x2;
pop=newnewpop;
end
figure
(1)
x=[1:
j];
plot(x,w,'--r');
holdon;
figure
(2)
x=linspace(-4,4,100);
y=linspace(-4,4,100);
[xx,yy]=meshgrid(x,y);
zz=0.5-((sin(sqrt(xx.^2+yy.^2))).^2-0.5)./(1+0.001.*(xx^2+yy^2)).^2;
mesh(xx,yy,zz);
[zindex]=max(w)%所有代中最大适应值及其位置
[QA]=max(resultmax)%所有代中最大函数值及其位置
bestx1(A)%对应x1
bestx2(A)%对应x2
第3题Matlab程序代码:
clear
clf
popsize=50;%种群大小
chromlength=10;%基因长度
G=200;
pc=0.6;%交叉概率
pm=0.001;%变异概率
umax=2.048;
umin=-2.048;
pop=round(rand(popsize,2*chromlength));%产生初始种群
forj=1:
G%G为遗传代数
[pxpy]=size(pop);
forr=1:
px%解码及计算函数值
m=pop(r,:
);
y1=0;y2=0;
m1=m(1:
chromlength);
fori=1:
chromlength
y1=y1+m1(i)*2^(i-1);
end
x1=(umax-umin)*y1/1023+umin;
m2=m(chromlength+1:
2*chromlength);
fori=1:
chromlength
y2=y2+m2(i)*2^(i-1);
end
x2=(umax-umin)*y2/1023+umin;
objvalue(r,:
)=100*(x2-x1.^2).^2+(1-x1).^2;
end
globalCmax;
Cmax=3905.9262;
[px,py]=size(objvalue);
fori=1:
px%适应度计算
ifCmax-objvalue(i)>0
temp=Cmax-objvalue(i);
else
temp=0.0;
end
fitvalue(i)=temp;
end
fitvalue=fitvalue';
totalfit=sum(fitvalue);
fitprb=fitvalue/totalfit;
fitprb=cumsum(fitprb);%例如fitvalue=[1234]cumsum(fitvalue)=[13610]
复制部分
[px,py]=size(pop);
ms=sort(rand(px,1));%´ÓСµ½´óÅÅÁÐ
fitin=1;
newin=1;
whilenewin<=px%¸´ÖÆ(Ñ¡Ôñ)
if(ms(newin))pop(newin)=pop(fitin);
newin=newin+1;
else
fitin=fitin+1;
end
end
交叉部分
[px,py]=size(pop);
fori=1:
2:
px-1%½»²æ
if(randcpoint=round(rand*py);
if(cpoint==0)
cpoint=round(rand*py);
end
newpop(i,:
)=[pop(i,1:
cpoint),pop(i+1,cpoint+1:
py)];
newpop(i+1,:
)=[pop(i+1,1:
cpoint),pop(i,cpoint+1:
py)];
else
newpop(i,:
)=pop(i,:
);
newpop(i+1,:
)=pop(i+1,:
);
end
end
pop=newpop;
%变异部分
[px,py]=size(pop);%±äÒì
fori=1:
px
if(randmpoint=round(rand*20);
ifmpoint==0
mpoint=round(rand*20);
end
ifpop(i,mpoint)==0
pop(i,mpoint)=1;
else
pop(i,mpoint)=0;
end
end
newnewpop(i,:
)=pop(i,:
);
end
pop=newnewpop;
%计算函数值
[pxpy]=size(pop);%Çó³öȺÌåÖÐÊÊÓ¦Öµ×î´óµÄ¸öÌå¼°ÆäÊÊÓ¦Öµ
forr=1:
px%½âÂ룬¼ÆËãÄ¿±êº¯Êý
m=pop(r,:
);
y1=0;y2=0;
m1=m(1:
chromlength);
fori=1:
chromlength
y1=y1+m1(i)*2^(i-1);
end
x1=(umax-umin)*y1/1023+umin;
m2=m(chromlength+1:
2*chromlength);
fori=1:
chromlength
y2=y2+m2(i)*2^(i-1);
end
x2=(umax-umin)*y2/1023+umin;
objvalue(r,:
)=100*(x2-x1.^2).^2+(1-x1).^2;
end
%寻找该代最优适应度及对应函数值对应位置
globalCmax;
Cmax=3905.9262;
[px,py]=size(objvalue);
fori=1:
px%¼ÆËãȺÌåÖÐÿ¸ö¸öÌåµÄÊÊÓ¦¶È
ifCmax-objvalue(i)>0
temp=Cmax-objvalue(i);
else
temp=0.0;
end
fitvalue(i)=temp;
end
fitvalue=fitvalue';
[px,py]=size(pop);
bestindividual=pop(1,:
);
bestfit=fitvalue
(1);
fori=2:
px-1
iffitvalue(i)>bestfit
bestindividual=pop(i,:
);
bestfit=fitvalue(i);
end
end
w(j)=bestfit;
bestpop=bestindividual;%È·¶¨¸Ã´ú×îÓÅֵλÖÃ
[qx,qy]=size(bestindividual);
forc=1:
1:
qx
m=bestindividual(c,:
);
y1=0;y2=0;
m1=m(1:
1:
qy/2);
fori=1:
1:
qy/2
y1=y1+m1(i)*2^(i-1);
end
x1=(umax-umin)*y1/1023+umin;
m2=m(qy/2+1:
1:
qy);
fori=1:
1:
qy/2
y2=y2+m2(i)*2^(i-1);
end
x2=(umax-umin)*y2/1023+umin;
end
resultmin(j)=100*(x2-x1.^2).^2+(1-x1).^2;
bestx1(j)=x1;
bestx2(j)=x2;
pop=newnewpop;
end
figure
(1)
x=[1:
j];
plot(x,w,'--r');
xlabel('ÒÅ´«µÄ´úÊý')
ylabel('¸÷´úÊÊÓ¦¶È×îÓÅÖµ')
%holdon;
figure
(2)
x=[1:
j];
plot(x,resultmin,'--r');
xlabel('ÒÅ´«µÄ´úÊý')
ylabel('¸÷´úº¯Êý×îСֵ')
%holdon;
figure(3)
x=linspace(-2.048,2.048,100);
y=linspace(-2.048,2.048,100);
[xx,yy]=meshgrid(x,y);
zz=100*(yy-xx.^2).^2+(1-xx).^2;
mesh(xx,yy,zz);
[zindex]=max(w)%寻找适应度最优及代数