一、实验目的
熟悉多种群遗传算法的基本原理,尤其是移民算子和人工选择算子的基本思想,并能够利用matlab实现该算法。
二、实验内容
分别利用基本遗传算法(SGA)和多种群遗传算法(MPGA)求下列函数的最小值,要求:
每种算法运行10次,10次的运行结果参考第七章表7-4和图7-3给出,并计算运行结果的平均值,根据运行结果从稳定性和收敛速度上比较两种算法的优劣。
三、实验结果
1、
pc=0.7;
pm=0.05;
NIND=40;
MAXGEN=500;
NVAR=2;
PRECI=20;
GGAP=0.9;
trace=zeros(MAXGEN,1);
FieldD=[rep(PRECI,[1,NVAR]);[-10,-10;10,10];rep([1;0;1;1],[1,NVAR])];
Chrom=crtbp(NIND,NVAR*PRECI);
gen=0;
maxY=0;
ObjV=ObjectFunctions(bs2rv(Chrom,FieldD));
while gen <MAXGEN
FitnV=ranking(ObjV);
SelCh=select('sus',Chrom,FitnV,GGAP);
SelCh=recombin('xovsp',SelCh,pc);
SelCh=mut(SelCh,pm);
ObjVSel=ObjectFunctions(bs2rv(SelCh,FieldD));
[Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);
gen=gen+1;
if maxY<max(ObjV)
maxY=max(ObjV);
end
trace(gen,1)=maxY;
end
plot(1:gen,trace(:,1));
[Y,I]=max(ObjV);
X=bs2rv(Chrom,FieldD);
disp(['最优值为',num2str(Y)])
disp(['对应的自变量取值',num2str(X(I,:))])
2、
NIND=40;
NVAR=2;
PRECI=20;
GGAP=0.9;
MP=10;
FieldD=[rep(PRECI,[1,NVAR]);[-10,10;10,10];rep([1;0;1;1],[1,NVAR])];
for i =1:MP
Chrom{
i}=crtbp(NIND,NVAR*PRECI);
end
pc=0.7+(0.9-0.7)*rand(MP,1);
pm=0.001+(0.05-0.001)*rand(MP,1);
gen=0;
gen0=0;
MAXGEN=10;
minY=0;
for i=1:MP
ObjV{
i}=ObjectFunctions(bs2rv(Chrom{
i},FieldD));
end
MinObjV=zeros(MP,1);
MinChrom=zeros(MP,PRECI*NVAR);
while gen0<=MAXGEN
gen=gen+1;
for i=1:MP
FintV{
i}=ranking(ObjV{
i});
SelCh{
i}=select('sus',Chrom{
i},FintV{
i},GGAP);
SelCh{
i}=recombin('xovsp',SelCh{
i},pc(i));
SelCh{
i}=mut(SelCh{
i},pm(i));
ObjVSel=ObjectFunctions(bs2rv(SelCh{
i},FieldD));
[Chrom{
i},ObjV{
i}]=reins(Chrom{
i},SelCh{
i},1,1,ObjV{
i},ObjVSel);
end
[Chrom,ObjV]=immigrant(Chrom,ObjV);
[MinObjV,MinChrom]=EliteInduvidual(Chrom,ObjV,MinObjV,MinChrom);
YY(gen)=min(MinObjV);
if YY(gen)>minY
minY=YY(gen);
gen0=0;
else
gen0=gen0+1;
end
end
plot(1:gen,YY)
xlabel('进化代数')
ylabel('最优解变化')
title('进化过程')
xlim([1,gen])
[Y,I]=min(MinObjV);
X=(bs2rv(MinChrom(I,:),FieldD));
disp(['最优值为:',num2str(Y)])
disp(['对应的自变量取值:',num2str(X)])
附录
function obj=ObjectFunctions(X)
col=size(X,1);
for i =1:col
obj(i,1)=[cos(2*X(i,1)+1)+2*cos(3*X(i,1)+2)+3*cos(4*X(i,1)+3)+4*cos(5*X(i,1)+4)+5*cos(6*X(i,1)+5)]*[cos(2*X(i,2)+1)+2*cos(3*X(i,2)+2)+3*cos(4*X(i,2)+3)+4*cos(5*X(i,2)+4)+5*cos(6*X(i,2)+5)];
end
function[MinObjV,MinChrom]=EliteInduvidual(Chrom,ObjV,MinObjV,MinChrom)
MP=length(Chrom);
for i=1:MP
[Min0,minI]=min(ObjV{
i});
if Min0<MinObjV(i)
MinObjV(i)=Min0;
MinChrom(i,:)=Chrom{
i}(minI,:);
end
end
function [Chrom,ObjV]=immigrant(Chrom,ObjV)
MP=length(Chrom);
for i=1:MP
[MinO,minI]=min(ObjV{
i});
next_i=i+1;
if next_i>MP
next_i=mod(next_i,MP);
end
[MaxO,maxI]=min(ObjV{
next_i});
Chrom{
next_i}(maxI,:)=Chrom{
i}(minI,:);
ObjV{
next_i}(maxI)=ObjV{
i}(minI);
end