%進(jìn)化開始
for k=1:Iter %迭代步數(shù)
time(k)=k;
for j=1:Size %生成50組 x和y,即所有的個體組成的種群
M=P(j,:); %生成個體,即取P的每一行
x1=0;y1=0;
%計算 x
for i=1:Bitlen
x1=x1+M(i)*2^(Bitlen-i); %計算前Bitlen列變成十進(jìn)制數(shù)
end
x=(max-min)*x1/(2^Bitlen-1)+min;
%計算y
for i=1:Bitlen
y1=y1+M(Bitlen+i)*2^(Bitlen-i);%計算后Bitlen列變成十進(jìn)制數(shù)
end
y=(max-min)*y1/(2^Bitlen-1)+min;
%計算適應(yīng)值,并尋找當(dāng)代最優(yōu)個體及最優(yōu)適應(yīng)值
F(j)=0.9*exp(-((x+5)^2+(y+5)^2)/10)+0.99996*exp(-((x-5)^2+(y-5)^2)/20);
%F(j)=sin(x)*sin(y)/(x*y);
if j==1
BestF(k)=F(j);
BestX(k)=x;
BestY(k)=y;
BestM=M;
else
if F(j)>BestF(k)
BestF(k)=F(j);
BestX(k)=x;
BestY(k)=y;
BestM=M;
end
end
end
%計算所有個體的適應(yīng)值之和
sum=0;
for i=1:Size
sum=sum+F(i);
end
%計算個體的適應(yīng)度
for i=1:Size
Fitness(i)=F(i)/sum;
end
%選擇,賭輪盤算法,每次產(chǎn)生一個選擇因子bet
for j=1:1:Size
bet=rand(1); %產(chǎn)生隨機(jī)因子
psum=0;select=1;
while(psum<bet)
psum=psum+Fitness(select);
select=select+1;
end
tempP(i,:)=P(i,:);
end
%保護(hù)最優(yōu)個體
tempP2=randint(1,5,[1,Size]); % 隨機(jī)產(chǎn)生5個位置
for i=1:5
tempP(tempP2(i),:)=BestM;
end
%交叉
C=randint(1,Nc,[1,Size]); %隨機(jī)選擇交換個體
for i=1:2:(Nc-1)
p=randint(1,1,[1,2*Bitlen-Bitlen/2]);%從1-Bitlen中產(chǎn)生一個交叉點
temp=tempP(C(i),p:p+Bitlen/2);
tempP(C(i),p:p+Bitlen/2)=tempP(C(i+1),p:p+Bitlen/2);
tempP(C(i+1),p:p+Bitlen/2)=temp;
end
%變異
M=randint(1,Nm,[1,Size]);%隨機(jī)選擇變異個體
for i=1:Nm
P=randint(1,4,[1,2*Bitlen]);%產(chǎn)生4個變異位置
for j=1:4
if(tempP(M(i),P(j))==0)
tempP(M(i),P(j))=1;
else tempP(M(i),P(j))=0;
end
end
end