?? pso,matlab.txt
字號:
[算法]帶交叉因子的粒子群優化算法matlab源程序
網上資源
sunshine 發表于 2007-11-20 20:04:56
帶交叉因子的粒子群優化算法matlab源程序
大明 發表于 2006-8-26 17:04:00
程序源代碼:其中PSOGA.m文件,也就是主程序如下
%-----------------------------------------------
%------名稱:帶交叉因子的改進PSO算法
%------功能:求解多維無約束優化問題
%------特點:收斂性強,還可以加入變異算子
%------作者:孫明杰 <dreamsun2001@126.com>
%------單位:中國礦業大學計算數學碩2005
%------日期:2006年8月26日
%-----------------------------------------------
%格式標準化
clear all;
clc;
format long;
%初始化各個因子
c1=1.4962; %學習因子c1
c2=1.4962; %學習因子c2
w=0.7298; %慣性權重w
N=20; %粒子群規模
D=6; %搜索空間維數(本程序適合3維及以上,不能求解1,2維)
eps=10^(-6); %滿足條件限制的誤差(在不知道最小值時候不用設置)
MaxDT=500; %粒子群繁殖的代數
%初始化粒子的速度和位置,數據結構用矩陣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
%計算各個粒子的適應度
for i=1:N
A(i,3*D+1)=fitness(A(i,1:D),D);
end
%對粒子的適應度進行排序
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
%交叉結束,進行更新
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
%根據粒子群公式進行迭代(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
%下面進入主要循環,循環到最大次數得到最優解和最小值
%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
%交叉結束,進行更新
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
%根據粒子群公式進行迭代
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
%算法結束,得到的結果顯示如下:
disp('****************************************************')
disp('最后得到的最優位置為:')
X=Pbest'
disp('得到的函數最小值為:')
Minimize=fitness(Pbest,D)
disp('****************************************************')
%繪制進化代數和適應度關系曲線圖
xx=linspace(1,MaxDT,MaxDT);
yy=Pg(xx);
plot(xx,yy,'b-')
hold on
grid on
title('帶交叉因子的粒子群優化算法進化代數與適應度值關系曲線圖')
legend('粒子適應度曲線走勢')
%------算法結束---DreamSun GL & HF-------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -