进化参考资料算法程序.docx

上传人:b****3 文档编号:3943203 上传时间:2022-11-26 格式:DOCX 页数:28 大小:204.66KB
下载 相关 举报
进化参考资料算法程序.docx_第1页
第1页 / 共28页
进化参考资料算法程序.docx_第2页
第2页 / 共28页
进化参考资料算法程序.docx_第3页
第3页 / 共28页
进化参考资料算法程序.docx_第4页
第4页 / 共28页
进化参考资料算法程序.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

进化参考资料算法程序.docx

《进化参考资料算法程序.docx》由会员分享,可在线阅读,更多相关《进化参考资料算法程序.docx(28页珍藏版)》请在冰豆网上搜索。

进化参考资料算法程序.docx

进化参考资料算法程序

 

进化算法作业

 

 

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

ifrand

cpoint=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(rand

mpoint=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

ifrand

cpoint=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(rand

mpoint=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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 卡通动漫

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1