【计算智能实验】多种群遗传算法(MPGA)的Matlab实现

一、实验目的

熟悉多种群遗传算法的基本原理,尤其是移民算子和人工选择算子的基本思想,并能够利用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

猜你喜欢

转载自blog.csdn.net/qq_44762986/article/details/112655912