进化算法程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进化算法作业
1全局优化问题
(1) min
f1x 4x:2.1x: 1 x f x1x24x f 4x;
st . 5 x i5,i 1,2
一.程序
(1)主函数:mai n.m
clear all;
clc;
popsize=60; %种群规模
chromlength=34; %二进制编码,编码精度为0.0001,所以串长I为17
pc=0.7; %杂交概率
pm=0.1; %变异概率
t=0; %进化代数初始为0
pop=in itpop(popsize,chromle ngth); % 随机产生初始种群
while t<500 %迭代次数
t=t+1;
[objvalue]=calobjvalue(pop); % 计算目标函数值
fitvalue=calfitvalue(objvalue); %计算群体中每个个体的适应度
[best in dividual,bestfit]=best(pop,fitvalue); %求出群体中适应度最大的个体及其适应度值
x1仁decodechrom(besti ndividual,1,14); % 将二进制数转换为十进制数
x22=decodechrom(besti ndividual,15,14);
x1(t)=-5+10*x11/(pow2(14)-1); %将二值域中的数转换为变量域的数
x2(t)=-5+10*x22/(pow2(14)-1);
y(t)=4*x1(t)A2-2.1*x1(t)A4+1/3*x1(t)A6+x1(t)*x2(t)-4*x2(t)A2+4*x2(t)A4; % 计算最佳个体的目标函数值
[n ewpop1]=select ion( pop,fitvalue); % 选择算子
[n ewpop2]=crossover( newpop1,pc); % 交叉算子
[n ewpop3]=mutati on(n ewpop2,pm); % 变异算子
objvalue1=calobjvalue (n ewpop3(1,:));
if objvalue1>y(t)
newpop3(1,:)=best in dividual; % 保留最佳个体
end
pop=newpop3; %产生新种群
end
y; %每代的最佳目标函数值
x1; %每代的最佳目标函数值对应的自变量
x2;
[gy,k]=min(y) %gy 为全局最优值,k 为最优值对应的进化代数
此问题的全局最优值f min 1.0316。
gx1=x1(k) %全局最优值对应的自变量
gx2=x2(k)
plot(y) %最优值收敛曲线
title(' 收敛性曲线');
xlabel(' 进化代数');
ylabel(' 函数值'); axis([0,500,-1.5,1.5]);
(2)初始种群:initpop.m
function pop=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);
0bjvalue=4*x1.A2-2.1*x1.A4+1/3*x1.A6+x1.*x2-4*x2.A2+4*x2.A4; % 计算目标函数
end
a.二进制转换为十进制:decodechrom.m
functi0n temp=dec0dechr0m(p0p,sp0int,length )
pop1=pop(:,spoint:spoint+length-1); %按变量个数分组转换,spoint 为起始点,length 为一个变量的长度
temp=decodebinary(pop1);
end
b.求二进制串对应的十进制数:decodeb in ary.m
function temp =decodebinary( pop)
[px,py]=size(pop); %求pop 行数和列数
for i=1:py
pop1(:,i)=24(py-i).*pop(:,i);
end
temp=sum(pop1,2); %每一行求和
end
(4)计算个体适应度:calfitvalue.m function fitvalue= 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);
for i=2:px;
if fitvalue>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;
while newin<=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)); for i=1:2:px-1 if rand 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)];