1.簡介
粒子群優化算法(PSO)是一種進化計算技術(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源於對鳥群捕食的行為研究 。該算法最初是受到飛鳥集群活動的規律性啟發,進而利用群體智能建立的一個簡化模型。粒子群算法在對動物集群活動行為觀察基礎上,利用群體中的個體對信息的共享使整個群體的運動在問題求解空間中產生從無序到有序的演化過程,從而獲得最優解。
2.基本思想
粒子群算法是模擬群體智能所建立起來的一種優化算法,粒子群算法可以用鳥類在一個空間內隨機覓食為例,所有的鳥都不知道食物具體在哪里,但是他們知道大概距離多遠,最簡單有效的方法就是搜尋目前離食物最近的鳥的周圍區域。對粒子群優化算法操作的一個簡單解釋如下:每一個粒子都代表了當前優化任務的一個可能解決方案。在每次迭代過程中,每個粒子都會朝着自己的最優解的方向加速,也會朝着種群中任何粒子迄今為止發現的全局最佳位置的方向加速。這意味着,如果一個粒子發現了一個更好的解,所有其他粒子都會靠近它,在這個過程中不斷地搜索最優解。可以總結出粒子群算法地三條簡單規則:(1)飛離最近的個體,以避免碰撞;(2)飛向目標;(3)飛向群體的中心。
假設存在一個維度為S的搜索空間,由m個粒子組成粒子種群,其中第i個粒子用一個S維的向量表示,具體為Xi=(xi1,xi2,…,xiS)
代入目標函數就可以算出其適應度值,適應度值的大小對應着粒子位置即可行解的好壞。另外,第i個粒子移動的速度是S 維向量,記為Vi=(vi1,vi2,…,viS)
第i個粒子搜索到的最優位置為Pi=(pi1,pi2,…,piS)整個粒子群搜索到的最優位置為Pg=(pg1,pg2,…,pgS)
3.算法流程
標准PSO算法的流程:
Step1:初始化一群微粒(群體規模為m),包括隨機位置和速度;
Step2:評價每個微粒的適應度;
Step3:對每個微粒,將其適應值與其經過的最好位置Pi
作比較,如果較好,則將其作為該粒子當前的最好位置Pi
Step4:對每個微粒,將其適應值與全局最好位置Pg
作比較,如果較好,則將其作為當前全局最好位置Pg
Step5:根據(2)、(3)式調整微粒速度和位置;
Step6:未達到結束條件則轉Step2。
迭代終止條件根據具體問題一般選為最大迭代次數kkk或(和)微粒群迄今為止搜索到的最優位置滿足預定最小適應閾值。
4.流程圖
5.代碼實現
%% 清空環境
clc
clear
%% 參數初始化
%粒子群算法中的三個參數
c1 = 1.49445;%加速因子
c2 = 1.49445;
maxgen=1000; % 進化次s數
sizepop=200; %種群規模
%慣性權重
Vmax=1; %限制速度圍
Vmin=-1;
popmax=5; %變量取值范圍
popmin=-5;
dim=10; %適應度函數維數
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
%w = 0.9 - 0.5*(i/maxgen)*(i/maxgen);
fprintf('第%d代,',i);
fprintf('最優適應度%f\n',fitnessgbest);
for j=1:sizepop
w = 0.9 - 0.5*(i/maxgen)*(i/maxgen);
%速度更新
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;
%種群更新
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);
6.參數對實驗結果的影響
6.1 慣性權重w
由於慣性權重w過大全局尋優能力強,局部尋優能力弱;過小全局尋優能力弱,局部尋優能力強。所以,動態w能在搜索過程中線性變化可以比固態w求得更好的結果。
這里將設置函數w = 0.9 - 0.5*(i/maxgen)*(i/maxgen) (maxgen是迭代次數)
運行結果
由圖可知在迭代到600次左右收斂,最優適應度為1.989918
6.2 學習因子c1,c2
令c1=c2 = 0.89886,運行結果
由圖可知迭代到680次左右,種群適應度為0,無法求得最優解
令c1=c2=2.55987 運行結果
由圖可知迭代50次左右 得到最優解5.969754
6.3種群規模sizepop對結果影響
令sizepop=20 運行結果
由圖可知當迭代到160次左右收斂 得到最優解
令sizepop=1000 運行結果
由圖可知迭代到970次左右收斂 求解速度慢
6.4 適應度函數維數dim對結果的影響
令dim=3 運行結果
由圖可知過早收斂無法取得最優解
令dim=100 運行結果
由圖可知迭代550次左右收斂
6.5 最大速度vmax對實驗結果的影響
令vmax=0.1 運行結果
由圖可知迭代到50次左右時收斂 過早得到最優解
令vmax=20 運行結果
由圖可知迭代到700次左右收斂
6.6經過大量的實驗令w=0.78812,c1=c2=1.49618 是一組比較好的組合
運行結果
6.7總結
①慣性權重w:w越大,微粒飛行速度越大,微粒將會以更長的步長進行全局搜索;w較小,則微粒步長小,趨向於精細的局部搜索;因此,采用動態改變w的值;在搜索初期設w取0.9,然后隨着迭代次數的不斷增加,逐漸降低w的值;從而達到全局最優。
②學習因子c1,c2:c1,c2具有自我總結和向優秀個體學習的能力,從而使微粒向群體內最優點靠近。c1,c2分別調節微粒向個體最優或者群體最優方向飛行的最大步長,決定微粒個體經驗和群體經驗對微粒自身運行軌跡的影響。學習因子較小時,可能使微粒不在最優區域移動,無法得到最優解;學習因子較大時,可使微粒迅速向最優區域移動,過早收斂。
③種群規模sizepop:種群規規模過小,算法收斂速度快,但是容易陷入局部最優;種群規模過大,算法收斂速度較慢;導致計算時間增加,而且群體數目增加到一定數目時,再增加微粒數目不再有顯著的效果。
④適應度函數維數dim:維度過小,算法早熟,陷入局部最優;維度過大,求解精度提高,但算法速度慢,比較耗時。
⑤最大速度vmax:vmax過大,粒子運動速度快,微粒探索能力強,但容易越過最優的搜索空間,錯過最優解;Vmax較小,容易進入局部最優,可能會使微粒無法運動足夠遠的距離以跳出局部最優,從而也可能找不到最優解
7.PSO算法優缺點
優點:沒有交叉和變異運算,靠粒子速度完成搜索,並在迭代中只有傳遞最優信息,搜索速度快,需要調整的參數不多,易於實現
缺點:缺乏速度的動態調節,容易陷入局部最優,導致收斂精度低和不易收斂;不能有效解決離散及組合優化問題;對於不同問題,參數不好選擇,不能高效取得最優解。