提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
多种群遗传算法
目标函数
function obj=ObjectFunction(XY)
col=size(XY,1);
for i=1:col
obj(i,1)=21.5+XY(i,1)*sin(4*pi*XY(i,1))+XY(i,2)*sin(20*pi*XY(i,2));
end
end
main 主函数
%% 多种群遗传算法
clear;
clc
close all;
%% 参数设置
NIND=40;%个体数目
NVAR=2;%变量的维数
PRECI=20;%变量的二进制位数
GGAP=0.9;%代沟
MP=10;%种群数目
FieldD=[PRECI PRECI;[-3,4.1;12.1,5.8];1 1;0 0;1 1;1 1];%区域描述器,译码矩阵
for i=1:MP
Chrom{i}=crtbp(NIND,PRECI*NVAR);%Chrom{1}表示一个种群中有40个个体
end
%在0.7-0.9区间内随机产生交叉概率
pc=0.7+(0.9-0.7).*rand(MP,1);
%在[0.001,0.05]区间内随机产生变异概率
pm=0.001+(0.05-0.001).*rand(MP,1);
%% 初始化种群
gen=0;%初始遗传代数
gen0=0;%初始保持代数
MAXGEN=10;%最优个体最少保持代数
maxY=0;%最优值
for i=1:MP
XY=bs2rv(Chrom{i},FieldD);
ObjV{i}=ObjectFunction(XY);%计算各初始种群个体的目标函数值
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));%变异操作
XY=bs2rv(SelCh{i},FieldD);%二进制转换为十进制
ObjVSel=ObjectFunction(XY);%计算子代目标函数值
[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);
%将二进制编码转换为十进制
x=bs2rv(MaxChrom,FieldD);
fprintf(['最大值=',num2str(YY(end)),'\nx=',num2str(x(1,1)),'\ny=',num2str(x(1,2))]);
人工选择算子
function [MaxObjV,MaxChrom]=EliteInduvidual(Chrom,ObjV,MaxObjV,MaxChrom)
%% 人工选择算子
MP=1:length(Chrom);%种群数
for i=1:MP
[MaxO,maxI]=max(ObjV{i});%各种群的最大目标函数值
%如果找到的目标函数值大于MaxObjV{i}则获取其对应的编码
if MaxO>MaxObjV(i)
MaxObjV(i)=MaxO;
MaxChrom(i,:)=Chrom{i}(maxI,:);
end
end
end
移民算子
function [Chrom,ObjV]=immigrant(Chrom,ObjV)
%% 移民算子
MP=length(Chrom);%计算种群数目
for i=1:MP
[MaxO,maxI]=max(ObjV{i});%找出第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