clc;
clear;
close all;
tic; %%% 记录程序运行时间 %%%
%%%%%%%%%%%%%% 1 初始化种群 %%%%%%%%%%%%%
M0=30; %%% 初始种群个体数 %%%
Mmax=50; %%%% 最大种群个体数 %%%%%
itmax=2000; %%%% 迭代次数 %%%%
dim=30; %%%%%% 问题维数 %%%%%
smax=5; %%%%% 最大种子数 %%%%%
smin=2; %%%%%% 最小种子数 %%%%
n=3; %%% 调和指数 计算方差时要用的,是设好的固定值 %%%%%
delta_initial=10; %%% 方差最大值 %%%%
delta_final=0.001; %%% 方差最小值 %%%%
xmax=100;
xmin=-100; %%%% 问题解的最大最小 范围 %%%%%%%%
X=xmin+(xmax-xmin)*rand(M0,dim); %%%%% 随机产生初始种群 %%%%%
fit=fitness(X); %%% 计算种群的适应度函数值 %%%%%%
best=0; %%% 定义一个数,用来存储最优解 %%%
evrybest=[]; %%% 定义一个空阵,用来存储每代的最优解 %%%
%%%%%%%%%%%%%%%%%%%%%%%%%主程序%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
iter=1;
while iter<=itmax %%%%%% 循环迭代 %%%%
%%%%%%%%%%%% 2 生长繁殖 产生种子 %%%%%%%%%%%%%
Nseed=round(-(smax-smin)/(max(fit)-min(fit))*(fit-min(fit))+smax);
%%%%%%%%%%%% 3 空间扩散 以正态随机分布 %%%%%%%%%%%%%
delta_iter=(itmax-iter)^n/(itmax)^n*(delta_initial-delta_final)+delta_final;
%%%% 上面的式子求正态分布的方差 %%%%
l=size(X);
X1=[];
for i=1:l(1) %%% 对于每个个体 %%%
for j=1:Nseed(i) %%% 对于每个个体产生的种子数 %%%%
Xnew=normrnd(X(i,:),delta_iter^2); %%%% 产生正态分布随机数 %%%
if Xnew(:)>xmax
Xnew(:)=xmax;
end
if Xnew(:)<xmin
Xnew(:)=xmin;
end %%%%% 限制解的范围 解决实际问题时,这步可有可无 %%%%%
X1=[X1;Xnew]; %%% 将产生的所有子代存在X1中 %%%%
end
end %%%%%% 上面一段是 产生子代的过程 %%%%%%%%%
fit_seed=fitness(X1); %%% 计算子代适应度值 %%%
%%%%%%%%%%%% 4 竞争排除 %%%%%%%%%%%%%%
X2=[X;X1]; %% 把父代和子代个体一起存到X2里 %%%
f=[fit fit_seed]; %% 把父代和子代的适应度值一起存在f里 %%
[p q]=sort(f); %% 把f排序,返回f从小到大的数存在p里,对应的位置存在q里 %%%
X=[]; %%% 清空X %%%%
l1=size(X2);
fit=[]; %%% 清空fit %%%
if l1(1)>Mmax
for i=1:Mmax
X(i,:)=X2(q(i),:);
fit(i)=f(q(i));
end
else
X=X2;%%% 父代和子代一起,选出适应度值好的前Mmax个个体,存在X里%%%%%%
fit=f;%%% 对应的适应度值存在fit里 %%%
end
best=max(fit); %% 存储最优值%%
evrybest=[evrybest,best]; %%% 每代最优的适应度值 %%%
iter=iter+1
end
%%%%%%%%%%%%循环结束,输出结果%%%%%%%%%%%%%
best %% 输出最优解 %%%
plot(1:itmax,evrybest) %% 画出适应度值曲线 %%%%%
toc %%% 显示程序运行时间 %%%