杂草算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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