目錄
一、粒子羣優化算法簡介
粒子羣優化算法是一種全局搜索算法,作爲進化計算的一個分支,同時它也是一種模擬自然界的生物活動以及羣體智能的隨機搜索算法。因此粒子羣優化算法一方面吸取了人工生命、鳥羣覓食、魚羣學習和羣理論的思想,另一方面又具有進化算法的特點,和遺傳算法、進化策略、進化規劃等算法有相似的搜索和優化能力。
PSO中,每個優化問題的解都是粒子,所有的粒子都有一個由被優化的函數決定的適應值,粒子會追隨當前的最優粒子在解空間中搜索。PSO初始化爲一羣隨機粒子,然後通過迭代找到最優解,在每一次疊代中,粒子通過跟蹤兩個“極值”來更新自己。第一個就是粒子本身所找到的最優解,這個解叫做個體極值pBest,另一個極值是整個種羣找到的最優解,這個極值是全局極值gBest。另外也可以不用整個種羣而只是用其中一部分最優粒子的鄰居,那麼在所有鄰居中的極值就是局部極值。
二、算法流程
1.初始化粒子羣體、隨機位置和速度
2.根據fitness function評價每個粒子的適應度
3.對每個粒子,將其當前適應值與其個體歷史最佳位置pbest對應的適應值做比較,如果當前的適應值更高,則將用當前位置更新歷史最佳位置pbest
4.對每個粒子,將其當前適應值與全局最佳位置gbest對應的適應值做比較,如果當前的適應值更高,則將用當前粒子的位置更新全局最佳位置pbest
5.根據公式更新每個粒子的速度和位置
6.如果未滿足結束條件,則返回步驟2,通常算法達到最大迭代次數Gmax或者最佳適應度值的增量小於某個給定的閾值時算法停止
三、參數設置比較
初始情況運行結果圖如下:
函數使用如下:
fun.m
function y = fun(x,label)
%函數用於計算粒子適應度值
%x input 輸入粒子
%y output 粒子適應度值
if label==1
y=Rastrigin(x);
elseif label==2
y=Schaffer(x);
else
y= Griewank(x);
end
Drawfunc.m
function Drawfunc(label)
x=-5:0.05:5;%41列的向量
if label==1
y = x;
[X,Y] = meshgrid(x,y);
[row,col] = size(X);
for l = 1 :col
for h = 1 :row
z(h,l) = Rastrigin([X(h,l),Y(h,l)]);
end
end
surf(X,Y,z);
shading interp
xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis');
title('mesh');
end
if label==2
y = x;
[X,Y] = meshgrid(x,y);
[row,col] = size(X);
for l = 1 :col
for h = 1 :row
z(h,l) = Schaffer([X(h,l),Y(h,l)]);
end
end
surf(X,Y,z);
shading interp
xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis');
title('mesh');
end
if label==3
y = x;
[X,Y] = meshgrid(x,y);
[row,col] = size(X);
for l = 1 :col
for h = 1 :row
z(h,l) = Griewank([X(h,l),Y(h,l)]);
end
end
surf(X,Y,z);
shading interp
xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis');
title('mesh');
end
1.改變C1參數
c2=1.49445,sizepop=200,dim=10
(1)c1=1.49445
10次的運行結果最優適應度分別爲:3.979836,6.964713,3.979836,3.979836,3.979836,0.000000,2.984877,2.984877,5.969754,5.969754,平均值爲4.079331。
(2)c1=1
10次的運行結果最優適應度分別爲:4.974795,17.909248,0.994959,2.984877,1.199664,0.000000,2.984877,4.974795,6.964713,3.979836,平均值爲4.696776。
(3)c1=1.2
10次的運行結果最優適應度分別爲:2.984877,4.974795,5.969754,8.954632,4.974795,3.979836,0.994959,5.969754,3.979836,1.023095,平均值爲4.380633。
(4)c1=1.4
10次的運行結果最優適應度分別爲:3.979836,0.000000,6.964713,4.974795,4.974795,0.994959,5.969754,1.989918,6.964708,3.979836,平均值爲4.079331。
(5)c1=1.6
10次的運行結果最優適應度分別爲:1.170269,1.989918,4.974795,1.989918,0.994959,4.974795,3.979836,5.969754,1.989918,0.000000,平均值爲2.8034162。
(6)c1=1.8
10次的運行結果最優適應度分別爲:7.959672,4.974795,1.989918,1.056934,5.969754,6.964713,2.984877,3.979836,5.969754,4.974795,平均值爲4.6828203。
(7)c1=2
10次的運行結果最優適應度分別爲:3.979836,3.979836,4.974795,8.954632,4.974795,1.989918,4.974795,2.984877,6.964713,0.994959,平均值爲4.477316。
2.改變C2參數
同理在c1最好的情況下求c1=1.49445,sizepop=200,dim=10
c2=1時平均值爲3.382862,c2=1.2時平均值爲2.188910,c2=1.4時平均值爲3.815412,c2=1.6時平均值爲2.686411,c2=1.8時平均值爲4.178827,c2=2時平均值爲4.079356。
由實驗結果可知c1=1.6,c2=1.6左右的時候最好。c1是自己的經驗,c2是社會經驗,當二者爲1.6的時候是最優的。加速係數c1和c2代表了向自身極值pbest和全局極值gbest推進的加速權值;c1和c2通常爲2,代表着對兩個引導方向的同等重視,也存在一些c1和c2不相等的設置,但其範圍都在0-4之間;將c1線性減少,c2線性增大的設置能動態平衡算法的多樣性和收斂性。
3.改變w的範圍
c1=1.6,c2=1.6,sizepop=200,dim=10
(1)w範圍設置爲0.4-0.9,10次的運行結果最優適應度分別爲:0.000000,1.989918,1.989918,5.969754,4.974795,2.984877,0.994964,8.954632,0.994959,7.959672,平均值爲3.681348。
(2)w範圍設置爲0.6-0.9,10次的運行結果最優適應度分別爲:2.986192,2.984877,0.994959,0.994959,2.984877,4.974795,4.974795,2.984877,0.000000,7.959672,平均值爲2.984000。
(3)w範圍設置爲0.4-0.7,10次的運行結果最優適應度分別爲:3.979836,0.000000,0.994959,0.994959,7.959672,3.979836,0.000000,8.954626,4.974795,3.979836,平均值爲3.581851。
(4)w範圍設置爲0.4-0.8,10次的運行結果最優適應度分別爲:1.989918,0.000000,4.974795,4.974795,1.989918,2.984877,1.989918,4.974795,6.964713,4.974795,平均值爲3.581852。
w線性遞減,由實驗結果可知w範圍設置爲w=0.6-0.9是最優的。慣性權重控制着前一速度對當前速度的影響,用於平衡算法的探索和開發能力,一般設置爲從0.9線性遞減到0.4,也有非線性遞減的設置方案,慣性權重設爲0.729的同時將c1和c2設爲1.49445有利於算法的收斂。
4.改變sizepop參數
c1=1.6,c2=1.6,w=0.6-0.9,dim=10
(1)sizepop=20
10次的運行結果最優適應度分別爲:0.000002,0.994963,24.873951,3.979836,3.979836,5.969757,3.979837,2.984877,2.984877,7.959672,平均值爲5.770760。
(2)sizepop=40
10次的運行結果最優適應度分別爲:8.954626,5.969754,2.984878,1.989918,8.954626,3.979836,2.984877,8.954626,10.944545,2.984878,平均值爲5.870256。
(3)sizepop=100
10次的運行結果最優適應度分別爲:2.984877,4.974795,4.974795,5.969754,2.984877,5.969754,0.000000,0.994960,5.969754,7.959673,平均值爲4.278323。
(4)sizepop=200
10次的運行結果最優適應度分別爲:1.989918,3.979836,6.964713,0.000000,3.979836,1.989918,2.984877,6.964713,3.979836,4.974795,平均值爲3.780844。
(5)sizepop=300
10次的運行結果最優適應度分別爲:0.994959,0.994959,4.974795,5.969754,0.000000,0.000000,0.000000,0.994959,0.994959,5.969754,平均值爲2.089413。
(6)sizepop=500
10次的運行結果最優適應度分別爲:0.000000,3.979836,4.974795,4.974795,0.000000,3.979836,0.000000,2.984877,1.989921,4.974795,平均值爲2.785885。
是實驗結果得sizepop=300是最優的,隨着種羣規模的增大,算法用時也在增加,當在種羣規模到500的時候,可以明顯感覺到時間比之前久。種羣規模影響者算法的搜索能力和計算量,pos對種羣規模要求不高,一般取20-40就可以達到很好的求解效果,不過對於比較難的問題或者特定類別的問題,粒子數可以較高。
5.改變dim參數
c1=1.6,c2=1.6,w=0.6-0.9,sizepop=300
(1)dim=4
10次的運行結果最優適應度都爲:0.000000,平均值爲0.000000。
(2)dim=7
10次的運行結果最優適應度都爲:0.000000,平均值爲0.000000。
(3)dim=10
10次的運行結果最優適應度分別爲:12.934458,2.984877,1.990186,0.000000,0.994959,3.979874,1.989918,4.974795,2.984877,5.969754,平均值爲3.527608。
(4)dim=9
10次的運行結果最優適應度分別爲:2.984877,0.994959,3.979836,4.974795,1.989918,4.974795,0.000000,0.000000,3.979836,3.979836,平均值爲2.785885。
(5)dim=8
10次的運行結果最優適應度分別爲:0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.316742,0.000000,0.000000,0.000000,平均值爲0.031674。
由實驗結果得dim=7-8之間是臨界最優的。
四、POS的優點
簡單易行,收斂速度快,設置參數少,是一類不確定算法,概率型的全局優化算法,具有本質並行性等。
五、核心代碼
%% 清空環境
clc
clear
%% 參數初始化
%粒子羣算法中的三個參數
c1 = 1.6;%加速因子
c2 = 1.6;
%w=0.8 %慣性權重
wmax = 0.6;
wmin = 0.9;
maxgen=1000; % 進化次s數
sizepop=300; %種羣規模
Vmax=1; %限制速度圍
Vmin=-1;
popmax=5; %變量取值範圍
popmin=-5;
dim=8; %適應度函數維數
func=1; %選擇待優化的函數,1爲Rastrigin,2爲Schaffer,3爲Griewank
Drawfunc(func);%畫出待優化的函數,只畫出二維情況作爲可視化輸出
%% 產生初始粒子和速度
for i=1:sizepop
%隨機產生一個種羣
pop(i,:)=popmax*rands(1,dim); %初始種羣
V(i,:)=Vmax*rands(1,dim); %初始化速度
%計算適應度
fitness(i)=fun(pop(i,:),func); %粒子的適應度
end
%% 個體極值和羣體極值
[bestfitness bestindex]=min(fitness);
gbest=pop(bestindex,:); %全局最佳
pbest=pop; %個體最佳
fitnesspbest=fitness; %個體最佳適應度值
fitnessgbest=bestfitness; %全局最佳適應度值
%% 迭代尋優
for i=1:maxgen
fprintf('第%d代,',i);
fprintf('最優適應度%f\n',fitnessgbest);
for j=1:sizepop
w = wmax - (wmax-wmin)/maxgen*i;
%速度更新
V(j,:) = w*V(j,:) + c1*rand*(pbest(j,:) - pop(j,:)) + c2*rand*(gbest - pop(j,:)); %根據個體最優pbest和羣體最優gbest計算下一時刻速度
V(j,find(V(j,:)>Vmax))=Vmax; %限制速度不能太大
V(j,find(V(j,:)<Vmin))=Vmin;
%w = w-(j*(w-0.3))/maxgen;
%for k=0.4:w
% w=k+0.1;
%end
%種羣更新
pop(j,:)=pop(j,:)+0.5*V(j,:); %位置更新
pop(j,find(pop(j,:)>popmax))=popmax;%座標不能超出範圍
pop(j,find(pop(j,:)<popmin))=popmin;
if rand>0.98 %加入變異種子,用於跳出局部最優值
pop(j,:)=rands(1,dim);
end
%更新第j個粒子的適應度值
fitness(j)=fun(pop(j,:),func);
end
for j=1:sizepop
%個體最優更新
if fitness(j) < fitnesspbest(j)
pbest(j,:) = pop(j,:);
fitnesspbest(j) = fitness(j);
end
%羣體最優更新
if fitness(j) < fitnessgbest
gbest = pop(j,:);
fitnessgbest = fitness(j);
end
end
yy(i)=fitnessgbest;
end
%% 結果分析
figure;
plot(yy)
title('最優個體適應度','fontsize',12);
xlabel('進化代數','fontsize',12);ylabel('適應度','fontsize',12);