粒子羣算法(PSO)解決函數優化問題
本文轉載自:http://wenku.baidu.com/link?url=E6F5Nv6kW5nOQ2BD3mm4q5ld22o_pLQ48jPD-9N4q_1Sh-lJOrWVCo1Bc9SYB514goOOpXQJrk5sqTyzvrVthvnhXWqBnwzAMl4S8Miveka###
目錄
引言
本文主要利用粒子羣算法解決連續函數的最小值問題,粒子羣優化是一種新興的基於羣體智能的啓發式全局搜索算法,粒子羣優化算法通過粒子間的競爭和協作以實現在複雜搜索空間中尋找全局最優點。它具有易理解、易實現、全局搜索能力強等特點,倍受科學與工程領域的廣泛關注,已經成爲發展最快的智能優化算法之一。本文介紹了粒子羣優化算法的基本原理,分析了其特點,並將其應用於函數優化問題求解。
求函數最優值問題,對此問題,傳統的優化技術很容易陷入局部最優解,求得全局優化解的概率不高,可靠性低;爲此,建立儘可能大概率的求解全局優化解算法是求解函數優化的一個重要問題。本文采用粒子羣算法來解決這類問題。
一、 問題描述
1.1 連續函數求最大值問題
本文主要選取一個三維函數,利用matlab編寫粒子羣算法程序來求解,以驗證遺傳算法在解決函數優化問題中的有效性。本文選取的函數爲:f=x(1).^2+x(2).^2+x(3).^2,求它的最小值。
1.2 粒子羣算法
PSO從這種模型中得到啓示並用於解決優化問題。PSO 中,每個優化問題的潛在解都是搜索空間中的一隻鳥,稱之爲粒子。所有的粒子都有一個由被優化的函數決定的適值( fitness value) ,每個粒子還有一個速度決定它們飛翔的方向和距離。然後粒子們就追隨當前的最優粒子在解空間中搜索。
PSO初始化爲一羣隨機粒子(隨機解),然後通過迭代找到最優解。在每一次迭代中,粒子通過跟蹤兩個極值來更新自己;第一個就是粒子本身所找到的最優解,這個解稱爲個體極值;另一個極值是整個種羣目前找到的最優解,這個極值是全局極值。另外也可以不用整個種羣而只是用其中一部分作爲粒子的鄰居,那麼在所有鄰居中的極值就是局部極值。
假設在一個 維的目標搜索空間中,有 個粒子組成一個羣落,其中第 個粒子表示爲一個 維的向量
, 。
第 個粒子的“飛行 ”速度也是一個 維的向量,記爲
, 。
第 個粒子迄今爲止搜索到的最優位置稱爲個體極值,記爲
, 。
整個粒子羣迄今爲止搜索到的最優位置爲全局極值,記爲
在找到這兩個最優值時,粒子根據如下的公式(1.1)和( 1.2)來更新自己的速度和位置:
(1.1)
(1. 2)
其中: 和 爲學習因子,也稱加速常數(acceleration constant), 和 爲[0,1]範圍內的均勻隨機數。式(1.1)右邊由三部分組成,第一部分爲“慣性(inertia)”或“動量(momentum)”部分,反映了粒子的運動“習慣(habit)”,代表粒子有維持自己先前速度的趨勢;第二部分爲“認知(cognition)”部分,反映了粒子對自身歷史經驗的記憶(memory)或回憶(remembrance),代表粒子有向自身歷史最佳位置逼近的趨勢;第三部分爲“社會(social)”部分,反映了粒子間協同合作與知識共享的羣體歷史經驗。
二、算法設計
這部分內容主要是針對本文主要研究問題的類型確定粒子羣算法具體實現過程和一些參數的選擇。
2.1算法流程框圖
圖1 粒子羣算法流程圖
2.2 算法實現
算法的流程如下:
① 初始化粒子羣,包括羣體規模 ,每個粒子的位置 和速度
② 計算每個粒子的適應度值 ;
③ 對每個粒子,用它的適應度值 和個體極值 比較,如果 ,則用 替換掉 ;
④ 對每個粒子,用它的適應度值 和全局極值 比較,如果 則用 替 ;
⑤ 根據公式(1.1),(1.2)更新粒子的速度 和位置 ;
⑥ 如果滿足結束條件(誤差足夠好或到達最大循環次數)退出,否則返回②。
2.3 參數選擇
本算法中主要的參數變量爲 (慣性權值), , (加速因子),N (種羣數),M (迭代次數),D (粒子維數)。
(1)種羣規模
通常,種羣太小則不能提供足夠的採樣點,以致算法性能很差;種羣太大盡管可以增加優化信息,阻止早熟收斂的發生,但無疑會增加計算量,造成收斂時間太長,表現爲收斂速度緩慢。種羣規模一般設爲100~1000。本文選擇種羣規模爲100。
(2)最大迭代次數
迭代次數越多能保證解的收斂性,但是影響運算速度,本文選1000次。
(3)慣性權值
慣性權重 表示在多大程度上保留原來的速度。 較大,全局收斂能力強,局部收斂能力弱; 較小,局部收斂能力強,全局收斂能力弱。本文選0.6。
(4)加速因子
加速常數 和 分別用於控制粒子指向自身或鄰域最佳位置的運動。文獻[20]建議 ,並通常取 。本文也取 。
(5)粒子維數
本文中粒子維數取決於待優化函數的維數,例如本文取3。
需要說明的是,本文的程序允許改變這些參數,因爲本文編寫的程序參照matlab工具箱,留給用戶解決這類問題一個接口函數,上述的各個參數正是接口函數的參數,因此允許改變。另外對於 和c也可採用變參數法,即隨迭代次數增加,利用經驗公式使它們動態調整,本文采用固定值。
三、程序設計
程序主要由兩個m文件組成,pso.m是遺傳算法接口文件,fitness.m是待求解的問題函數,只需要修改fitness.m裏的目標函數就可實現不同問題的解。
(1)pso.m文件
function [xm,fv] = PSO(fitness,N,c1,c2,w,M,D)
%fitness-是要優化的目標函數,N-種羣數,c1,c2-學習因子,w-慣性權重,M-迭代次數,D-粒子維數。
format long;
%初始化種羣
for i=1:N
for j=1:D
x(i,j)=randn; %隨機初始化位子
v(i,j)=randn; %隨機初始化速度
end
end
%先計算各個粒子的適應度,並初始化pi-粒子個體極值和pg-全局極值
for i=1:N
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
pg = x(N,:); %pg爲全局極值
for i=1:(N-1)
if fitness(x(i,:))<fitness(pg)
pg=x(i,:);
end
end
%進入粒子羣算法主要循環
for t=1:M
for i=1:N
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:)=x(i,:)+v(i,:);
if fitness(x(i,:))<p(i)
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
if p(i)<fitness(pg)
pg=y(i,:);
end
end
Pbest(t)=fitness(pg);
end
xm = pg';
fv = fitness(pg);
(2)目標函數fitness.m文件
function f=fitness(x)
f=x(1).^2+x(2).^2+x(3).^2 ;
end
需要說明的是,針對不同的函數優化,只需要改變目標函數就可以。
(3)在命令行輸入或建立調用m文件
在命令行先後輸入[xm,fv] = PSO(@fitness,100,2,2,0.6,1000,3),或建立包涵該語句的m文件,運行即可得到結果。
四、 結果與分析
4.1 實驗結果
(1)對於目標函數f=x(1).^2+x(2).^2+x(3).^2 優化結果如下:
xm =1.0e-162 *
0.556163077454623
0.937292023592359
0.146573921409127
fv =0 , fv是最優值,xm爲最優值對應的自變量值。
4.2 分析
通過對實驗結果和已知最小值比較可知,該算法能有效解決這類問題,需要特別指出的是xm的取值只是近似值,另外,本文的粒子羣算法程序只是實現粒子羣算法的基本功能,該算法還有待進一步改進。
五、總結
本文利用粒子羣算法思想,通過編寫matlab程序,對一個三維連續函數進行優化得到了較好的仿真結果,證明粒子羣算法在解決這類問題的可行性。另外,在編寫本文的工作過程中,提高了自己對粒子羣算法的理解和應用能力。爲今後利用智能算法撰寫論文或進行科學研究打下了很好地基礎。