?? pso3.m
字號:
%------名稱:帶交叉因子的改進PSO算法
%格式標(biāo)準(zhǔn)化
clear all;
clc;
format long;
%初始化各個因子
c1=1.4962; %學(xué)習(xí)因子c1
c2=1.4962; %學(xué)習(xí)因子c2
w=0.7298; %慣性權(quán)重w
N=20; %粒子群規(guī)模
D=6; %搜索空間維數(shù)(本程序適合3維及以上,不能求解1,2維)
eps=10^(-6); %滿足條件限制的誤差(在不知道最小值時候不用設(shè)置)
MaxDT=500; %粒子群繁殖的代數(shù)
%初始化粒子的速度和位置,數(shù)據(jù)結(jié)構(gòu)用矩陣A表示
for i=1:N
for j=1:2*D
A(i,j)=rand;
end
end
for i=1:N
for j=2*D+1:3*D
A(i,j)=A(i,j-2*D);
end
end
%計算各個粒子的適應(yīng)度
for i=1:N
A(i,3*D+1)=fitness(A(i,1:D),D);
end
%對粒子的適應(yīng)度進行排序
B=sortrows(A,3*D+1);
%排序后適應(yīng)度低的前面一半粒子直接進入下一代
NextGeneration=zeros(N,3*D+1);
for i=1:N/2
for j=1:3*D+1
NextGeneration(i,j)=B(i,j);
end
end
%后一半粒子進行遺傳選擇和交叉操作
for i=1:N/2
for j=1:3*D+1
Cross(i,j)=B(i+N/2,j);
end
end
%產(chǎn)生一個隨機的交叉位置
for i=1:N/4
Anumber=randperm(D-1);
if Anumber(1)~=1
position=Anumber(1);
else
position=Anumber(2);
end
%交叉進行
for j=position:D-1
temp=Cross(i,j);
Cross(i,j)=Cross(N/2-i+1,j);
Cross(N/2-i+1,j)=temp;
end
end
%交叉結(jié)束,進行更新
for i=1:N/2
Cross(i,3*D+1)=fitness(Cross(i,1:D),D);
if Cross(i,3*D+1)<B(i+N/2,3*D+1)
for j=2*D+1:3*D
Cross(i,j)=Cross(i,j-2*D);
end
else
for j=2*D+1:3*D
Cross(i,j)=B(i,j);
end
end
end
%下面選擇最好的粒子N/2個進入下一代
Pool=zeros(N,3*D+1);
for i=1:N/2
for j=1:3*D+1
Pool(i,j)=B(i+N/2,j);
end
end
for i=1+N/2:N
for j=1:3*D+1
Pool(i,j)=Cross(i-N/2,j);
end
end
%POOLX表示排序后的粒子選擇池
PoolX=sortrows(Pool,3*D+1);
for i=1+N/2:N
for j=1:3*D+1
NextGeneration(i,j)=PoolX(i-N/2,j);
end
end
Pbest=NextGeneration(i,2*D+1:3*D);
for i=2:N
if NextGeneration(i,3*D+1)<fitness(Pbest,D)
Pbest=NextGeneration(i,2*D+1:3*D);
end
end
%根據(jù)粒子群公式進行迭代(Stander PSO Step)
%速度更新
for i=1:N
for j=D+1:2*D
A(i,j)=w*NextGeneration(i,j)+c1*rand*(NextGeneration(i,j+D)-NextGeneration(i,j-D))+c2*rand*(Pbest(j-D)-NextGeneration(i,j-D));
end
end
%位置更新
for i=1:N
for j=1:D
A(i,j)=NextGeneration(i,j)+A(i,j+D);
end
A(i,3*D+1)=fitness(A(i,1:D),D);
if A(i,3*D+1)<NextGeneration(i,3*D+1)
for j=2*D+1:3*D
A(i,j)=A(i,j-2*D);
end
else
for j=2*D+1:3*D
A(i,j)=NextGeneration(i,j-2*D);
end
end
end
%下面進入主要循環(huán),循環(huán)到最大次數(shù)得到最優(yōu)解和最小值
%DDTime=1;
for time=1:MaxDT
B=sortrows(A,3*D+1);
NextGeneration=zeros(N,3*D+1);
for i=1:N/2
for j=1:3*D+1
NextGeneration(i,j)=B(i,j);
end
end
%遺傳選擇交叉
for i=1:N/2
for j=1:3*D+1
Cross(i,j)=B(i+N/2,j);
end
end
for i=1:N/4
Anumber=randperm(D-1);
if Anumber(1)~=1
position=Anumber(1);
else
position=Anumber(2);
end
for j=position:D-1
temp=Cross(i,j);
Cross(i,j)=Cross(N/2-i+1,j);
Cross(N/2-i+1,j)=temp;
end
end
%交叉結(jié)束,進行更新
for i=1:N/2
Cross(i,3*D+1)=fitness(Cross(i,1:D),D);
if Cross(i,3*D+1)<B(i+N/2,3*D+1)
for j=2*D+1:3*D
Cross(i,j)=Cross(i,j-2*D);
end
else
for j=2*D+1:3*D
Cross(i,j)=B(i,j);
end
end
end
%下面選擇最好的粒子N/2個進入下一代
Pool=zeros(N,3*D+1);
for i=1:N/2
for j=1:3*D+1
Pool(i,j)=B(i+N/2,j);
end
end
for i=1+N/2:N
for j=1:3*D+1
Pool(i,j)=Cross(i-N/2,j);
end
end
PoolX=sortrows(Pool,3*D+1);
for i=1+N/2:N
for j=1:3*D+1
NextGeneration(i,j)=PoolX(i-N/2,j);
end
end
Pbest=NextGeneration(i,2*D+1:3*D);
for i=2:N
if NextGeneration(i,3*D+1)<fitness(Pbest,D)
Pbest=NextGeneration(i,2*D+1:3*D);
end
end
%根據(jù)粒子群公式進行迭代
for i=1:N
for j=D+1:2*D
A(i,j)=w*NextGeneration(i,j)+c1*rand*(NextGeneration(i,j+D)-NextGeneration(i,j-D))+c2*rand*(Pbest(j-D)-NextGeneration(i,j-D));
end
end
for i=1:N
for j=1:D
A(i,j)=NextGeneration(i,j)+A(i,j+D);
end
A(i,3*D+1)=fitness(A(i,1:D),D);
if A(i,3*D+1)<NextGeneration(i,3*D+1)
for j=2*D+1:3*D
A(i,j)=A(i,j-2*D);
end
else
for j=2*D+1:3*D
A(i,j)=NextGeneration(i,j-2*D);
end
end
end
Pg(time)=fitness(Pbest,D);
%DDTime=DDTime+1;
%if fitness(Pbest,D)<eps
%break;
%end
end
%算法結(jié)束,得到的結(jié)果顯示如下:
disp('****************************************************')
disp('最后得到的最優(yōu)位置為:')
X=Pbest'
disp('得到的函數(shù)最小值為:')
Minimize=fitness(Pbest,D)
disp('****************************************************')
%繪制進化代數(shù)和適應(yīng)度關(guān)系曲線圖
xx=linspace(1,MaxDT,MaxDT);
yy=Pg(xx);
plot(xx,yy,'b-')
hold on
grid on
title('帶交叉因子的粒子群優(yōu)化算法進化代數(shù)與適應(yīng)度值關(guān)系曲線圖')
legend('粒子適應(yīng)度曲線走勢')
%------算法結(jié)束---DreamSun GL & HF-------------------------
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -