matlab实现多种群遗传算法,求解复杂多元最值问题

学习内容:

今天学习的是多种群的遗传算法,该算法主要由移民函数、选择函数,目标值函数组成,相比于普通遗传函数,降低了遗传控制参数的不当设定对规划结果的影响,对抑制未成熟收敛的发生有着明显的效果。在下面的代码中,除了有多种群算法的遗传函数,也有普通遗传算法函数,大家可以运行代码试一试,就会发现普通遗传函数在解复杂多目标极值问题会产生陷入局部极值或在局部极值间震荡的情况,而多种群遗传函数则能避免这种情况的发生。
详细信息均在代码以及注释中。
该问题两自变量范围

学习产出:

一、移民函数

function [Chrom,ObjV] = immigrant(Chrom,ObjV)
%%该函数用于实现各个种群间精英个体的交流
%将前一个种群中的精英个体放入后一个,不断循环
%将最后一个种群的精英个体放入第一个种群中
%输入:
%Chrom   cell      每个元胞单位为一个种群的编码
%ObjV    cell      每个元胞单位为一个种群所有个体的目标值
%输出:
%Chrom   cell      移民后(同上)
%ObjV    cell      移民后(同上)
MP = length(Chrom);
for i = 1:MP
   [MaxO,maxI] = max(ObjV{i});
   next_i = i + 1;
   if next_i > MP;
       next_i = mod(next_i,MP);
   end
   [MinO,minI] = min(ObjV{next_i});
   %种群和目标值进行交换
   Chrom{next_i}(minI,:) = Chrom{i}(maxI,:);
   ObjV{next_i}(minI) = ObjV{i}(maxI);
end
end

二、人工选择算子

function [MaxObjV,MaxChrom] = EliteInduvidual(Chrom,ObjV,MaxObjV,MaxChrom)
%%本函数为人工选择算子
%输入:
%Chrom    cell      每一个元胞为移民前的一个种群编码
%ObjV     cell      每一个元胞为移民前的一个种群中所有个体的目标值
%MaxObjV  Double    各个种群中当前最优个体的目标值(选择前)
%MaxChrom Double    各个种群中当前最优个体的编码(选择后)
%输出:
%MaxObjV  Double    选择后的
%MaxChrom Double    选择后的
MP = length(Chrom);
for i = 1:MP 
    [MaxO,maxI] = max(ObjV{i});
    if MaxO > MaxObjV(i)        %判断更新
       MaxObjV(i) = MaxO;
       MaxChrom(i,:) = Chrom{i}(maxI,:);
    end
end
end

三、目标函数

function obj = ObjectFunction(X)
%该函数为目标函数
%输入:
%X     n行2列的向量
%输出:
%obj   计算得到结果
col = size(X,1);
for i = 1:col
    obj(i,1) = 21.5 + X(i,1)*sin(4*pi*X(i,1)) + X(i,2)*sin(20*pi*X(i,2));
end
end

四、普通遗传函数(主函数)

clear all;clc;close all;
%%普通遗传算法
NIND = 40;                %种群的大小
MAXGEN = 500;             %最大迭代次数
NVAR = 2;                 %变量的维度
PRECI = 20;               %变量编码的长度
GGAP = 0.9;               %代沟
pc = 0.3;                 %重组的概率
pm = 0.01;                %变异的概率
trace = zeros(MAXGEN,1);  %记录最优值
FieldD = [rep(PRECI,[1,NVAR]);[-3,4.1;12.1,5.8];rep([1;0;1;1],[1,NVAR])];
Chrom = crtbp(NIND,NVAR*PRECI);
gen = 0;
maxY = 0;
ObjV = ObjectFunction(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 = ObjectFunction(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,:))]);

五、多种群遗传函数(主函数)

clear all;clc;close all;
%多种群遗传函数
NIND = 40;
NVAR = 2;       %变量的维数
PRECI = 20;     %变量的二进制表示位数
GGAP = 0.9;     %代沟
MP = 10;        %种群的数目
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;                                     %最大最优值迭代次数
maxY = 0;
FieldD = [rep(PRECI,[1,NVAR]);[-3,4.1;12.1,5.8];rep([1;0;1;1],[1,NVAR])];
for i = 1:MP
    Chrom{i} = crtbp(NIND,NVAR*PRECI);                   %创建初始种群
end

for i = 1:MP
    ObjV{i} = ObjectFunction(bs2rv(Chrom{i},FieldD));    %初始化种群的目标值
end
MaxObjV = zeros(MP,1);
MaxChrom = zeros(MP,PRECI*NVAR);                         %初始化完毕
%% 开始迭代
while gen0 <= MAXGEN
    gen = gen + 1;
    for i = 1:MP
        FitnV{i} = ranking(-ObjV{i});                    %适应度
        SelCh{i} = select('sus',Chrom{i},FitnV{i},GGAP); %选择
        SelCh{i} = recombin('xovsp',SelCh{i},pc(i));     %重组
        SelCh{i} = mut(SelCh{i},pm(i));                  %变异
        ObjVSel = ObjectFunction(bs2rv(SelCh{i},FieldD));
        [Chrom{i},ObjV{i}] = reins(Chrom{i},SelCh{i},1,1,ObjV{i},ObjVSel);
    end
    [Chrom,ObjV] = immigrant(Chrom,ObjV);                               %移民精英
    [MaxObjV,MaxChrom] = EliteInduvidual(Chrom,ObjV,MaxObjV,MaxChrom);  %挑选精英
    YY(gen) = max(MaxObjV);
    if YY(gen) > maxY
        maxY = YY(gen);
        gen0 = 0;
    else
        gen0 = gen0 + 1;
    end
end
%% 绘图
%画出最优解的变化过程
plot(1:gen,YY);
xlabel('进化代数');
ylabel('最优解变化');
title('进化过程');
xlim([1,gen]);
%输出最优值以及对应自变量的取值
[Y,I] = max(MaxObjV);
X = (bs2rv(MaxChrom(I,:),FieldD));
disp(['最优值为:',num2str(Y)]);
disp(['对应自变量取值为',num2str(X)]);
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值