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