进化参考资料算法程序.docx
《进化参考资料算法程序.docx》由会员分享,可在线阅读,更多相关《进化参考资料算法程序.docx(28页珍藏版)》请在冰豆网上搜索。
进化参考资料算法程序
进化算法作业
1全局优化问题
(1)
,
此问题的全局最优值
。
一.程序
(1)主函数:
main.m
clearall;
clc;
popsize=60;%种群规模
chromlength=34;%二进制编码,编码精度为0.0001,所以串长l为17
pc=0.7;%杂交概率
pm=0.1;%变异概率
t=0;%进化代数初始为0
pop=initpop(popsize,chromlength);%随机产生初始种群
whilet<500%迭代次数
t=t+1;
[objvalue]=calobjvalue(pop);%计算目标函数值
fitvalue=calfitvalue(objvalue);%计算群体中每个个体的适应度
[bestindividual,bestfit]=best(pop,fitvalue);%求出群体中适应度最大的个体及其适应度值
x11=decodechrom(bestindividual,1,14);%将二进制数转换为十进制数
x22=decodechrom(bestindividual,15,14);
x1(t)=-5+10*x11/(pow2(14)-1);%将二值域中的数转换为变量域的数
x2(t)=-5+10*x22/(pow2(14)-1);
y(t)=4*x1(t)^2-2.1*x1(t)^4+1/3*x1(t)^6+x1(t)*x2(t)-4*x2(t)^2+4*x2(t)^4;%计算最佳个体的目标函数值
[newpop1]=selection(pop,fitvalue);%选择算子
[newpop2]=crossover(newpop1,pc);%交叉算子
[newpop3]=mutation(newpop2,pm);%变异算子
objvalue1=calobjvalue(newpop3(1,:
));
ifobjvalue1>y(t)
newpop3(1,:
)=bestindividual;%保留最佳个体
end
pop=newpop3;%产生新种群
end
y;%每代的最佳目标函数值
x1;%每代的最佳目标函数值对应的自变量
x2;
[gy,k]=min(y)%gy为全局最优值,k为最优值对应的进化代数
gx1=x1(k)%全局最优值对应的自变量
gx2=x2(k)
plot(y)%最优值收敛曲线
title('收敛性曲线');
xlabel('进化代数');
ylabel('函数值');
axis([0,500,-1.5,1.5]);
(2)初始种群:
initpop.m
functionpop=initpop(popsize,chromlength)
pop=round(rand(popsize,chromlength));%rand随机产生[0,1]区间的一个小数,rand四舍五入取整
end
(3)计算目标函数值:
:
calobjvalue.m
function[objvalue]=calobjvalue(pop)
temp1=decodechrom(pop,1,14);
temp2=decodechrom(pop,15,14);
x1=-5+(10*temp1)/(pow2(14)-1);%将二值域中的数转化为变量域中的数
x2=-5+(10*temp2)/(pow2(14)-1);
objvalue=4*x1.^2-2.1*x1.^4+1/3*x1.^6+x1.*x2-4*x2.^2+4*x2.^4;%计算目标函数
end
a.二进制转换为十进制:
decodechrom.m
functiontemp=decodechrom(pop,spoint,length)
pop1=pop(:
spoint:
spoint+length-1);%按变量个数分组转换,spoint为起始点,length为一个变量的长度
temp=decodebinary(pop1);
end
b.求二进制串对应的十进制数:
decodebinary.m
functiontemp=decodebinary(pop)
[px,py]=size(pop);%求pop行数和列数
fori=1:
py
pop1(:
i)=2.^(py-i).*pop(:
i);
end
temp=sum(pop1,2);%每一行求和
end
(4)计算个体适应度:
calfitvalue.m
functionfitvalue=calfitvalue(objvalue)
fitvalue=1./(1+exp(objvalue));
end
(5)种群中最大适应度个体及其值:
best.m
function[bestindividual,bestfit]=best(pop,fitvalue)
[px,py]=size(pop);
bestindividual=pop(1,:
);
bestfit=fitvalue
(1);
fori=2:
px;
iffitvalue>bestfit
bestindividual=pop(i,:
);
best=fitvalue(i);
end
end
end
(6)选择算子:
selection.m
function[newpop1]=selection(pop,fitvalue)
totalfit=sum(fitvalue);%适应度和
ps=fitvalue./totalfit;%单个个体被选择的概率
pss=cumsum(ps);%前几项累积和
[px,py]=size(pop);
ms=sort(rand(px,1));%随机产生px个0,1之间的数,并按升序排列
fitin=1;
newin=1;
whilenewin<=px
if(ms(newin)newpop1(newin,:
)=pop(fitin,:
);
newin=newin+1;
else
fitin=fitin+1;
end
end
end
(7)交叉算子:
crossover.m
function[newpop2]=crossover(pop,pc)
[px,py]=size(pop);
newpop2=ones(size(pop));
fori=1:
2:
px-1
ifrandcpoint=round(rand*py);%随机产生一个交叉位
newpop2(i,:
)=[pop(i,1:
cpoint),pop(i+1,cpoint+1:
py)];%交换相邻两个个体交叉位之后的基因
newpop2(i+1,:
)=[pop(i+1,1:
cpoint),pop(i,cpoint+1:
py)];
else
nwepop2(i,:
)=pop(i,:
);
newpop2(i+1,:
)=pop(i+1,:
);
end
end
end
(8)变异算子:
mutation.m
function[newpop3]=mutation(pop,pm)
[px,py]=size(pop);
newpop3=pop;
fori=1:
px
if(randmpoint=round(rand*py);%随机产生一个变异位
ifmpoint<=0
mpoint=1;
end
if(newpop3(i,mpoint)==0)%变为等为基因
newpop3(i,mpoint)=1;
else
newpop3(i,mpoint)=0;
end
end
end
end
二.独立运行程序30次的结果
x1
0.1590
-0.0900
-0.0888
-0.0894
-0.0809
0.0772
0.0876
0.1175
-0.1578
-0.0778
x2
-0.7016
0.7126
0.7102
0.6421
0.7120
-0.6247
-0.7023
-0.7138
0.7029
0.7090
y
-1.0115
-1.0316
-1.0316
-0.9751
-1.0313
-0.9763
-1.0308
-1.0287
-1.0125
-1.0310
x1
0.0900
-0.0015
-0.1566
-0.0888
-0.0882
-0.0089
0.1004
0.0766
-0.0900
-0.0876
x2
-0.7126
-0.7065
0.7169
0.7126
0.7029
-0.6931
-0.7029
-0.7132
0.7151
0.7102
y
-1.0316
-0.9989
-0.10147
-1.0316
-1.0309
-0.9922
-1.0303
-1.0309
-1.0316
-1.0316
x1
-0.919
0.0778
0.0906
0.0906
0.0931
0.0906
0.0906
-0.0925
-0.0705
-0.0919
x2
0.7126
-0.7114
-0.7138
-0.7126
-0.7816
-0.7132
-0.7096
0.7163
0.6986
0.7126
y
-1.0316
-1.0331
-1.0316
-1.0316
-0.9891
-1.0316
-1.0315
-1.0315
-1.0288
-1.0316
最好目标函数值:
-1.0316最差目标函数值:
-0.9751
平均目标函数值:
-0.9914标准方差:
0.0286
三.最好的一次结果
最好解:
x1=0.0919x2=-0.7126
最好值:
-1.0316
运行结果及收敛性曲线如下图:
运行结果收敛性曲线
(2)
,
此问题的全局最优值
。
一.程序
(1)主函数:
main.m
clearall;
clc
popsize=40;%种群规模
chromlength=28;%二进制编码,编码精度为0.001,所以串长l为14
pc=0.8;%杂交概率
pm=0.2;%变异概率
t=0;
pop=initpop(popsize,chromlength);%随机产生初始种群
whilet<500%迭代次数
t=t+1;
[objvalue]=calobjvalue(pop);%计算目标函数值
fitvalue=calfitvalue(objvalue);%计算群体中每个个体的适应度
[bestindividual,bestfit]=best(pop,fitvalue);%求出群体中适应度最大的个体及其适应度值
x11=decodechrom(bestindividual,1,14);%将二进制数转换为十进制数
x22=decodechrom(bestindividual,15,14);
x1(t)=-5+10*x11/(pow2(14)-1);%将二值域中的数转换为变量域的数
x2(t)=-5+10*x22/(pow2(14)-1);
y(t)=(x2(t)-5.1/(4*pi*pi).*x1(t).^2+5/pi.*x1(t)-6).^2+10.*(1-1/(8*pi)).*cos(x1(t))+10;%计算最佳个体的目标函数值
[newpop1]=selection(pop,fitvalue);%选择算子
[newpop2]=crossover(newpop1,pc);%杂交算子
[newpop3]=mutation(newpop2,pm);%变异算子
objvalue1=calobjvalue(newpop3(1,:
));
ifobjvalue1>y(t)
newpop3(1,:
)=bestindividual;%保留最佳个体
end
pop=newpop3;%产生新种群
end
y;%每代的最佳目标函数值
x1;%每代的最佳目标函数值对应的自变量
x2;
[gy,k]=min(y);%全局最优值
gy=vpa(gy,3)%设置输出精度
gx1=x1(k);%全局最优值对应的自变量
x1=vpa(gx1,4)
gx2=x2(k);
x2=vpa(gx2,4)
plot(y)%最优值收敛曲线
title('收敛性曲线');
xlabel('进化代数');
ylabel('函数值');
axis([0,500,0.2,1.5]);
(2)初始种群:
initpop.m
functionpop=initpop(popsize,chromlength)
pop=round(rand(popsize,chromlength));%rand随机产生[0,1]区间的一个小数,rand四舍五入取整
end
(3)计算目标函数值:
:
calobjvalue.m
function[objvalue]=calobjvalue(pop)
temp1=decodechrom(pop,1,14);
temp2=decodechrom(pop,15,14);
x1=-5+(10*temp1)/(pow2(14)-1);%将二值域中的数转化为变量域中的数
x2=-5+(10*temp2)/(pow2(14)-1);
objvalue=(x2-5.1/(4*pi*pi).*x1.^2+5/pi.*x1-6).^2+10.*(1-1/(8*pi)).*cos(x1)+10;
end
a.二进制转换为十进制:
decodechrom.m
functiontemp=decodechrom(pop,spoint,length)
pop1=pop(:
spoint:
spoint+length-1);%按变量个数分组转换,spoint为起始点,length为一个变量的长度
temp=decodebinary(pop1);
end
b.求二进制串对应的十进制数:
decodebinary.m
functiontemp=decodebinary(pop)
[px,py]=size(pop);%求pop行数和列数
fori=1:
py
pop1(:
i)=2.^(py-i).*pop(:
i);
end
temp=sum(pop1,2);%每一行求和
end
(4)计算个体适应度:
calfitvalue.m
functionfitvalue=calfitvalue(objvalue)
fitvalue=1./(1+exp(objvalue));
end
(5)种群中最大适应度个体及其值:
best.m
function[bestindividual,bestfit]=best(pop,fitvalue)
[px,py]=size(pop);
bestindividual=pop(1,:
);
bestfit=fitvalue
(1);
fori=2:
px;
iffitvalue>bestfit
bestindividual=pop(i,:
);
best=fitvalue(i);
end
end
end
(6)选择算子:
selection.m
function[newpop1]=selection(pop,fitvalue)
totalfit=sum(fitvalue);%适应度和
ps=fitvalue./totalfit;%单个个体被选择的概率
pss=cumsum(ps);%前几项累积和
[px,py]=size(pop);
ms=sort(rand(px,1));%随机产生px个0,1之间的数,并按升序排列
fitin=1;
newin=1;
whilenewin<=px
if(ms(newin)newpop1(newin,:
)=pop(fitin,:
);
newin=newin+1;
else
fitin=fitin+1;
end
end
end
(7)交叉算子:
crossover.m
function[newpop2]=crossover(pop,pc)
[px,py]=size(pop);
newpop2=ones(size(pop));
fori=1:
2:
px-1
ifrandcpoint=round(rand*py);%随机产生一个交叉位
newpop2(i,:
)=[pop(i,1:
cpoint),pop(i+1,cpoint+1:
py)];%交换相邻两个个体交叉位之后的基因
newpop2(i+1,:
)=[pop(i+1,1:
cpoint),pop(i,cpoint+1:
py)];
else
nwepop2(i,:
)=pop(i,:
);
newpop2(i+1,:
)=pop(i+1,:
);
end
end
end
(8)变异算子:
mutation.m
function[newpop3]=mutation(pop,pm)
[px,py]=size(pop);
newpop3=pop;
fori=1:
px
if(randmpoint=round(rand*py);%随机产生一个变异位
ifmpoint<=0
mpoint=1;
end
if(newpop3(i,mpoint)==0)%变为等为基因
newpop3(i,mpoint)=1;
else
newpop3(i,mpoint)=0;
end
end
end
end
二.独立运行程序30次的结果
x1
3.125
3.145
3.128
3.145
3.141
3.124
3.125
3.145
3.145
3.125
x2
2.285
2.265
2.500
2.265
2.276
2.290
2.305
2.265
2.273
2.287
y
0.399
0.398
0.445
0.398
0.398
0.399
0.400
0.398
0.398
0.399
x1
3.125
3.125
3.145
3.140
3.108
3.146
3.111
3.165
3.145
3.145
x2
2.265
2.287
2.265
2.265
2.500
2.276
2.500
2.187
2.270
2.265
y
0.400
0.399
0.398
0.398
0.443
0.398
0.443
0.405
0.398
0.398
x1
3.122
3.125
3.125
3.142
3.134
3.125
3.125
3.143
3.141
3.125
x2
2.284
2.286
2.285
2.274
2.286
2.344
2.285
2.275
2.276
2.288
y
0.400
0.399
0.399
0.398
0.398
0.402
0.399
0.398
0.398
0.399
最好目标函数值:
0.398最差目标函数值:
0.445
平均目标函数值:
0.403标准方差:
1.886e-004
三.最好的一次结果
最好解:
x1=3.145x2=2.265
最好值:
0.398
运行结果及收敛性曲线如下图:
运行结果收敛性曲线
(3)
,
此问题的全局最优值
。
本题采用十进制编码方式,与二进制编码方式相比较,效率不如二进制,但程序相比简单一些。
多次运行,自变量去平均值可得到最好结果。
一.程序
(1)主函数:
main.m
clearall;
clc
popsize=40;%种群规模
chromlength=10;%变量个数,十进制编码
pc=0.8;%杂交概率
pm=0.1;%变异概率
t=0;%进化代数
pop=initpop(popsize,chromlength);%初始种群
whilet<5000
t=t+1;
[objvalue]=calobjvalue(pop);%计算目标函数值
fitvalue=calfitvalue(objvalue);%计算群体中每个个体的适应度
[bestindividual,bestfit]=best(pop,fitvalue);%计算最佳个体的目标函数值
x(t,:
)=bestindividual;
y(t)=sum(x(t,:
).*x(t,:
));%每代最优解的值
[newpop1]=selection(pop,fitvalue);%选择算法
[newpop2]=crossover(newpop1,pc);%交叉算法
[newpop3]=mutation(newpop2,pm);%变异算法
objvalue1=calobjvalue(newpop3(1,:
));
ifobjvalue1>y(t)
newpop3(1,:
)=bestindividual;%保留最佳个体
end
pop=newpop3;%产生新种群
end
y;%每代的最佳目标函数值
x;%每代的最佳目标函数值对应的自变量
[gy,k]=min(y)%gy为全局最优值,k为最优值对应的进化代数
x=x(k,:
)%全局最优值对应的自变量
plot(y)%最优值收敛曲线
title('收敛性曲线');
xlabel('进化代数');
ylabel('函数值');
axis([0,5000,0,1]);
(2)初始种群:
initpop.m
functionpop=initpop(popsize,chromlength)
pop=-100+200.*rand(popsize,chromlength);%随机产生[-100,100]之间的数
end
(3)计算目标函数值:
:
calobjvalue.m
function[objvalue]=calobjvalue(pop)
[px,py]=size(pop);
fori=1:
py
x(:
i)=pop(:
i);
end
objvalue=sum(x.*x,2);
end
(4)计算个体适应度:
calfitvalue.m
functionfitvalue=calfitvalue(objvalue)
fitvalue=1./objvalue;
end
(5)种群中最大适应度个体及其值:
best.m
function[bestindividual,best