%%
%**************************************************************************
%*******************注意,此程序以适应度值最大作为最优***********************
%**************************************************************************
clc
clear all
format long
%% 参数初始化
X_min=-30; %区间大小
X_max=30;
G_SIZE=5; %初始杂草个数
P_SIZE=10; %最大杂草个数
D=2; %问题的维数
iter_max=350; %迭代次数
stepLength_ini=300; %初始标准差
stepLength_final=0.05; %最终标准差
seed_max=20; %最大种子数
seed_min=0; %最小种子数
n=3; %非线性因子
F=@(x)objectFun(x); %测试函数
test_now=1; %当前独立运行的次数
test_all=2; %独立运行的总次数
%% 第一次独立运行
while test_now<test_all
%% 初始化
weed_now=[]; %杂草
weed_next=[]; %种子
for i=1:G_SIZE
% temp1=[];
% temp1=chaos(X_min,X_max,D,rand(1));
% weed_now(i,:)=temp1(2:end);
weed_now(i,:)=X_min+(X_max-X_min).*rand(1,D); %D维空间中随即分布的G_SIZE个可行解
end
weed_next=weed_now;
iter =1 ; %迭代次数初始化为1
%进化
while iter <iter_max
weed_now=[];
weed_now=weed_next;
N=size(weed_now,1);
fitness=[];
%% 计算步长,即当前标准差
stepLength_now=(iter_max-iter)^n*(stepLength_ini-stepLength_final)/(iter_max)^n+stepLength_final;
%% 计算杂草的适应度值
for i=1:N
fitness(i)=-F(weed_now(i,:));
end
BestFitness=max(fitness);
WorstFitness=min(fitness);
%% 计算种子个数并产生种子
weed_g_new=[]; %全部种子
for i=1:N
%计算各个杂草所产生的种子个数
num=(seed_max-seed_min)*(fitness(i)-WorstFitness)/(BestFitness-WorstFitness)+seed_min;
num=ceil(num); %向上取整
if num>0
weed_temp=[];
weed_change=[];
weed_temp=repmat(weed_now(i,:),num,1); %产生num*1个weed_now(i:)矩阵,维数为num*D
weed_change=normrnd(0,stepLength_now,num,D); %产生均值为0,标准差为stepLength_now的正态矩阵,维数为num*D
weed_new=weed_temp+weed_change; %某一个杂草的后代种子
weed_g_new=[weed_g_new;weed_new]; %加入到全部种子中
end
end
weed_now=[weed_now;weed_g_new];
%% 计算种子的适应度值
NN=size(weed_g_new,1); %后代种子的个数
for i=(N+1):(N+NN)
fitness(i)=-F(weed_now(i,:));
end
%% 对杂草和种子排序
weed_sort=[];
weed_sort=[fitness',weed_now];
B=[];
[B,Index]=sortrows(weed_sort,-1); %将矩阵行按第一列元素值降序排列,
weed_next=[];
if size(B,1)>P_SIZE
weed_next=B(1:P_SIZE,2:(D+1)); %选出适应度高的P_SIZE个个体,维数为10*2
% for i=2:P_SIZE
% disp('每个个体和最优个体的距离')
% if sqrt(sum((weed_next(i,:)-weed_next(1,:)).^2,2))<1
% temp1=[];
% temp1=chaos(min(weed_next(1,:)),max(weed_next(1,:)),D,0.01);
% weed_next(i,:)=temp1(2:end);
% end
% end
else
weed_next=B(:,2:(D+1));
end
%% 保存每代最佳个体
best_per_generation(iter)=-B(1,1);
iter;
%disp('最优适应度值——>');
-B(1,1);
%disp('最优位置——>');
B(1,2:(D+1));
iter=iter+1;
end
x1=B(:,2);
x2=B(:,3);
% plot(best_per_generation,'-'); %绘制一次独立运行的图
plot(x1,x2,'o'); %绘制种群分布图
Save(test_now)=-B(1,1); %保存每次独立运行后的最优适应度值
pause(0.5);
test_now=test_now+1;
end
Save'
% 30次独立运行结果中的最小值
MinHistory=min(Save)
% 30次独立运行结果的平均值
MeanHistory=mean(Save)
% 30次独立运行结果中的最大值
MaxHistory=max(Save)
% 30次独立运行结果的方差
StdHistory=std(Save)