杂草算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

杂草算法

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_f inal;

%%%% 上面的式子求正态分布的方差 %%%%

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(:)

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 %%% 显示程序运行时间 %%%

function FF=fitness(P)

[m,n]=size(P);

FF=[];

for i=1:m

x=sum(P(i,:).^2);

FF=[FF,x];

end

相关文档
最新文档