?? smpso_f2.m
字號:
% A SIMPLE IMPLEMENTATION OF THE PARTICLE SWARM OPTIMIZATION
clear;
clc;
for iii=1:1:100
iii=iii
% *************************************************************************
% 單純形微粒群優(yōu)化算法求解----smPSO
% *************************************************************************
% 初始化
PopSize=40; MaxIt=4000;
maxw=1.8; minw=0.02; c1=2.0; c2=2.0; dim=2;
popul=rand(2,PopSize)*200.0-100.0; % 位置初始化
vel=rand(dim,PopSize); % 速度初始化
for i=1:PopSize
fit(i)=(sin(sqrt((popul(1,i)-50.0)^2+(popul(2,i)-50.0)^2)+exp(1)))/(sqrt((popul(1,i)-50.0)^2+(popul(2,i)-50.0)^2)+exp(1))+1.0;
end
ibestpos=popul; % 個(gè)體最好位置初始化---inCHEpso
ibestfit=fit; % 各個(gè)體的適應(yīng)值
[bestpart,g]=max(fit); % 找全局最好的適應(yīng)值
gbestfit=bestpart; % 全局最好的適應(yīng)值
gbestpos=popul(:,g);
gbestchange=gbestfit;
gbestchangecounter=0;
% 主程序開始運(yùn)行
iter=0;
while (iter<MaxIt), % 迭代開始
iter=iter+1;
w=minw+(maxw-minw)*(1+cos((iter-1)*pi/(MaxIt-1)))/2.0;
for i=1:PopSize
A(:,i)=gbestpos;
end
R1=rand(dim,PopSize); R2=rand(dim,PopSize);
vel=0.8*(w*vel+c1*R1.*(ibestpos-popul)+c2*R2.*(A-popul)); % 速度計(jì)算
popul=popul+vel; % 位置計(jì)算
clear A; clear R1; clear R2;
for i=1:PopSize
for j=1:dim
if popul(j,i)>100.0,
popul(j,i)=100.0;
end
if popul(j,i)<-100.0,
popul(j,i)=-100.0;
end
end
end
for i=1:PopSize
fit(i)=(sin(sqrt((popul(1,i)-50.0)^2+(popul(2,i)-50.0)^2)+exp(1)))/(sqrt((popul(1,i)-50.0)^2+(popul(2,i)-50.0)^2)+exp(1))+1.0;
end
for i=1:PopSize
if fit(i)>ibestfit(i)
ibestfit(i)=fit(i);
ibestpos(:,i)=popul(:,i);
end
end
[bestpart,g]=max(fit);
if bestpart>gbestfit;
gbestfit=bestpart;
gbestpos=popul(:,g);
end
if gbestfit>gbestchange
gbestchange=gbestfit;
gbestchangecounter=0;
else
gbestchangecounter=gbestchangecounter+1;
end
if gbestchangecounter>=1
[OderF,IndexF]=sort(fit); % 從小到大排列適應(yīng)值
x1=gbestpos; % 選單純形的頂點(diǎn)
x2=popul(:,IndexF(ceil(PopSize*3/4)));
x3=popul(:,IndexF(ceil(PopSize/2)));
clear OderF; clear IndexF;
for tempii=1:6 % 進(jìn)行6次單純形法搜索
fx1=(sin(sqrt((x1(1)-50.0)^2+(x1(2)-50.0)^2)+exp(1)))/(sqrt((x1(1)-50.0)^2+(x1(2)-50.0)^2)+exp(1))+1.0;
fx2=(sin(sqrt((x2(1)-50.0)^2+(x2(2)-50.0)^2)+exp(1)))/(sqrt((x2(1)-50.0)^2+(x2(2)-50.0)^2)+exp(1))+1.0;
fx3=(sin(sqrt((x3(1)-50.0)^2+(x3(2)-50.0)^2)+exp(1)))/(sqrt((x3(1)-50.0)^2+(x3(2)-50.0)^2)+exp(1))+1.0;
fx(1)=fx1; fx(2)=fx2; fx(3)=fx3;
x(:,1)=x1; x(:,2)=x2; x(:,3)=x3;
[OrderF,IndexF]=sort(fx);
x1=x(:,IndexF(3)); x2=x(:,IndexF(2)); x3=x(:,IndexF(1));
fx1=OrderF(3); fx2=OrderF(2); fx3=OrderF(1);
clear OrderF; clear IndexF; clear fx; clear x;
error=sqrt((x1(1)-x2(1))^2+(x1(2)-x2(2))^2);
if error<0.000001
a1=gbestpos(1,1); a2=gbestpos(2,1);
x2(1)=(rand(1,1)-0.5)*2*200.0/10+a1; % 位置初始化
x2(2)=(rand(1,1)-0.5)*2*200.0/10+a2; % 位置初始化
end
error=sqrt((x1(1)-x3(1))^2+(x1(2)-x3(2))^2);
if error<0.000001
a1=gbestpos(1,1); a2=gbestpos(2,1);
x3(1)=(rand(1,1)-0.5)*2*200.0/10+a1; % 位置初始化
x3(2)=(rand(1,1)-0.5)*2*200.0/10+a2; % 位置初始化
end
error=sqrt((x2(1)-x3(1))^2+(x2(2)-x3(2))^2);
if error<0.000001
a1=gbestpos(1,1); a2=gbestpos(2,1);
x3(1)=(rand(1,1)-0.5)*2*200.0/10+a1; % 位置初始化
x3(2)=(rand(1,1)-0.5)*2*200.0/10+a2; % 位置初始化
end
clear error; clear a1; clear a2;
for i=1:2
if x2(i)>100.0,
x2(i)=100.0;
end
if x2(i)<-100.0,
x2(i)=-100.0;
end
end
for i=1:2
if x3(i)>100.0,
x3(i)=100.0;
end
if x3(i)<-100.0,
x3(i)=-100.0;
end
end
fx1=(sin(sqrt((x1(1)-50.0)^2+(x1(2)-50.0)^2)+exp(1)))/(sqrt((x1(1)-50.0)^2+(x1(2)-50.0)^2)+exp(1))+1.0;
fx2=(sin(sqrt((x2(1)-50.0)^2+(x2(2)-50.0)^2)+exp(1)))/(sqrt((x2(1)-50.0)^2+(x2(2)-50.0)^2)+exp(1))+1.0;
fx3=(sin(sqrt((x3(1)-50.0)^2+(x3(2)-50.0)^2)+exp(1)))/(sqrt((x3(1)-50.0)^2+(x3(2)-50.0)^2)+exp(1))+1.0;
fx(1)=fx1; fx(2)=fx2; fx(3)=fx3;
x(:,1)=x1; x(:,2)=x2; x(:,3)=x3;
[OrderF,IndexF]=sort(fx);
x1=x(:,IndexF(3)); x2=x(:,IndexF(2)); x3=x(:,IndexF(1));
fx1=OrderF(3); fx2=OrderF(2); fx3=OrderF(1);
clear OrderF; clear IndexF; clear fx; clear x;
x4=x1+x2-x3; % 反射
for i=1:2
if x4(i)>100.0,
x4(i)=100.0;
end
if x4(i)<-100.0,
x4(i)=-100.0;
end
end
fx4=(sin(sqrt((x4(1)-50.0)^2+(x4(2)-50.0)^2)+exp(1)))/(sqrt((x4(1)-50.0)^2+(x4(2)-50.0)^2)+exp(1))+1.0;
kzxs=1.5;
if fx4>fx1 % 擴(kuò)張操作
x5=(x1+x2)/2+kzxs*(x4-(x1+x2)/2);
for i=1:2
if x5(i)>100.0,
x5(i)=100.0;
end
if x5(i)<-100.0,
x5(i)=-100.0;
end
end
fx5=(sin(sqrt((x5(1)-50.0)^2+(x5(2)-50.0)^2)+exp(1)))/(sqrt((x5(1)-50.0)^2+(x5(2)-50.0)^2)+exp(1))+1.0;
x3=x2; x2=x1; % 新的單純形頂點(diǎn)
if fx5>=fx4
x1=x5;
else
x1=x4;
end
end
clear x5; clear fx5; clear kzxs;
if fx4<=fx1 % 不壓縮也不擴(kuò)張
if fx4>=fx2
x3=x2; x2=x4; x1=x1; % 新的單純形頂點(diǎn)
end
end
if fx4<fx2 % 壓縮
if fx4>=fx3
xa=x4; fxa=fx4;
else
xa=x3; fxa=fx3;
end
x6=(x1+x2)/2+0.7*(xa-(x1+x2)/2);
for i=1:2
if x6(i)>100.0,
x6(i)=100.0;
end
if x6(i)<-100.0,
x6(i)=-100.0;
end
end
fx6=(sin(sqrt((x6(1)-50.0)^2+(x6(2)-50.0)^2)+exp(1)))/(sqrt((x6(1)-50.0)^2+(x6(2)-50.0)^2)+exp(1))+1.0;
if fx6>=fxa
x3=x6; x2=x2; x1=x1; % 壓縮
else
x7=x2+(x1-x2)/2; % 收縮
x8=x3+(x1-x3)/2;
x1=x1; x2=x7; x3=x8;
end
end
clear xa; clear fxa; clear x6; clear fx6; clear x7; clear x8;
end
% iter=iter+1;
gbestchangecounter=0;
[OderF,IndexF]=sort(fit); % 從小到大排列適應(yīng)值
popul(:,IndexF(1))=x1; % 將單純形法搜索后的頂點(diǎn)回代給PSO
popul(:,IndexF(2))=x2;
popul(:,IndexF(3))=x3;
clear OderF; clear IndexF;
fx(1)=(sin(sqrt((x1(1)-50.0)^2+(x1(2)-50.0)^2)+exp(1)))/(sqrt((x1(1)-50.0)^2+(x1(2)-50.0)^2)+exp(1))+1.0;
fx(2)=(sin(sqrt((x2(1)-50.0)^2+(x2(2)-50.0)^2)+exp(1)))/(sqrt((x2(1)-50.0)^2+(x2(2)-50.0)^2)+exp(1))+1.0;
fx(3)=(sin(sqrt((x3(1)-50.0)^2+(x3(2)-50.0)^2)+exp(1)))/(sqrt((x3(1)-50.0)^2+(x3(2)-50.0)^2)+exp(1))+1.0;
x(:,1)=x1; x(:,2)=x2; x(:,3)=x3;
[OderF,IndexF]=sort(fx);
gbestfittemp=OderF(3);
if gbestfittemp>=gbestfit
gbestfit=gbestfittemp;
gbestpos=x(:,IndexF(3));
end
clear OderF; clear IndexF; clear fx; clear x; clear gbestfittemp;
clear x1; clear x2; clear x3; clear x4; clear fx1; clear fx2;
clear fx3; clear fx4;
end
end
smPSOgbestfit(iii)=gbestfit; % 需要保留
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -