% 测试函数为 ZDT1 自变量个数30
% 进化操作选取的是差分进化算法,在此基础上还采取了高斯变异
H=100; % 用户自定义正整数,根据该正整数及问题维度可确定种群数目N
M=2; % 问题维度
V=30; % 自变量个数
min_range=zeros(1,V); % 自变量下限 生成一个1*30的0矩阵
max_range=ones(1,V); % 自变量上限 生成一个1*30的1矩阵
Gen=200; % 最大迭代次数
T=20; % 领域中权重向量的个数
[Popsize,weights,neighbour]=Init_weights(H,M,T); % 初始化权重向量矩阵
[chrom,obj]=Init(Popsize,M,V,min_range,max_range); % 随机生成种群
[z,~]=min(obj); % 初始化参考点,参考点为所有个体的各个子目标函数值中的最小值组成
for i=1:Gen
for j=1:Popsize % 循环种群个体,下面的操作都是针对单个的个体j
newpoint=evolution(chrom,neighbour,j,V,T); % 进化操作后得到的新个体
newpoint=fixnew(newpoint,min_range,max_range); % 修复不合法的个体
newpoint=gaussian_mutate(newpoint,V,min_range,max_range); % 加高斯变异增加种群多样性
zz=evaluate(V,newpoint); % 评价得到的新个体
z=min(z,zz); % 更新参考点
nei=neighbour(j,:); % 取得当前个体j的领域权重序号向量
for t=1:T
k=nei(t); % 取得对应的权重序号
[chrom(k,:),obj(k,:)]=updates(weights(k,:),chrom(k,:),obj(k,:),newpoint,zz,z); % 更新领域解,注意传的参数
end
end
end
% 绘制前沿二维点图
obj(end,:)
scatter(obj(:,1),obj(:,2));