clc
clear
close all
% f=x1^2+...x30^2 [-30 30]
%% 初始参数
item_max=100;
% nu=[-30 30];
nu=[-10 10];
d=30;%自变量数量
num=20;%种群数量
f_b=0.7;%发现者比例
f_num=f_b*num;
%% 初始化
for jj=1:num
for ii=1:d
x1(jj,ii)=nu(1)+rand*(nu(2)-nu(1));
end
end
%% 迭代循环
for i=1:item_max
%计算目标函数
for jj=1:num
% f1(jj)=sum(x1(jj,:).^2);
f1(jj)=sum(abs(x1(jj,:).*sin(x1(jj,:))+0.1*x1(jj,:)));
end
%第一部分迭代,发现者
arf=rand(1);
Q=rand(1);
L=ones(1,d);
for j=1:f_num
temp=x1(j,:);
R2=rand(1);
ST=rand(1)*0.5+0.5;
if R2<ST
temp=temp*exp(-i/arf/item_max);
else
temp=temp+Q*L;
end
x1(j,:)=temp;
end
%第二部分迭代
for k=1:d
if rand(1)>0.5
A(k)=1;
else
A(k)=-1;
end
end
AA=A'*inv(A*A');
[~,index]=max(f1);
x_worst=x1(index(1),:);
for j=f_num+1:num
temp=x1(j,:);
[~,index]=min(f1(1:j));
xp=x1(index(1),:);
if j>num/2
temp=Q*exp((x_worst-temp)/j^2);
else
temp=xp+norm(temp-xp)*AA'.*L;
end
x1(j,:)=temp;
end
x1(x1>nu(2))=nu(2);
x1(x1<nu(1))=nu(1);
%第三部分迭代
j_b=rand*0.1+0.1;%比例
j_num=ceil(j_b*num);%取值
temp=randperm(num);
b=temp(1:j_num);
for jj=1:num
% f1(jj)=sum(x1(jj,:).^2);
f1(jj)=sum(abs(x1(jj,:).*sin(x1(jj,:))+0.1*x1(jj,:)));
end
beta=rand(1);
K=(rand(1)-0.5)*2;
[FG,index]=min(f1);
x_best=x1(index(1),:);
[FW,index]=max(f1);
x_worst=x1(index(1),:);
fg=FG(1);
fw=FW(1);
deta=10e-5;
for j=b
temp=x1(j,:);
fi=f1(j);
if fi>fg
temp=x_best+beta*norm(temp-x_best);
else
temp=temp+K*(norm(temp-x_worst)/(fi-fw+deta));
end
x1(j,:)=temp;
end
x1(x1>nu(2))=nu(2);
x1(x1<nu(1))=nu(1);
%计算迭代后的最优值
[FG,index]=min(f1);
x_best=x1(index(1),:);
%记录每次迭代下种群中的最优值
ff(i)=FG(1);
end
figure(1)
plot(1:size(ff,2),ff,'-k')
xlabel('x')
ylabel('f')
for i=1:size(ff,2)
ff2(i)=min(ff(1:i));
end
xlabel('迭代次数')
ylabel('函数值')
figure(2)
plot(1:size(ff2,2),ff2,'-r')
xlabel('x')
ylabel('f')
xlabel('迭代次数')
ylabel('历史最优值')
- 1
- 2
前往页