在全域版的標準粒子群演算法中,每個粒子的速度的更新是根據兩個因素來變化的,這兩個因素是:1. 粒子自己曆史最優值pi。2. 粒子群體的全域最優值pg。如果改變粒子速度更新公式,讓每個粒子的速度的更新根據以下兩個因素更新,A. 粒子自己曆史最優值pi。B. 粒子鄰域內粒子的最優值pnk。其餘保持跟全域版的標準粒子群演算法一樣,這個演算法就變為局部版的粒子群演算法。
一般一個粒子i 的鄰域隨著迭代次數的增加而逐漸增加,開始第一次迭代,它的鄰域為0,隨著迭代次數鄰域線性變大,最後鄰域擴充到整個粒子群,這時就變成全域版本的粒子群演算法了。經過實踐證明:全域版本的粒子群演算法收斂速度快,但是容易陷入局部最優。局部版本的粒子群演算法收斂速度慢,但是很難陷入局部最優。現在的粒子群演算法大都在收斂速度與擺脫局部最優這兩個方面下功夫。其實這兩個方面是矛盾的。看如何更好的折中了。
根據取鄰域的方式的不同,局部版本的粒子群演算法有很多不同的實現方法。
第一種方法:按照粒子的編號取粒子的鄰域,取法有四種:1,環形取法 2,隨機環形取法 3,輪形取法 4,隨機輪形取法。
1 環形2 隨機環形
3 輪形 4隨機輪形
因為後面有以環形取法實現的演算法,對環形取法在這裡做一點點說明:以粒子1為例,當鄰域是0的時候,鄰域是它本身,當鄰域是1時,鄰域為2,8;當鄰域是2時,鄰域是2,3,7,8;......,以此類推,一直到鄰域為4,這個時候,鄰域擴充到整個例子群體。據文獻介紹(國外的文獻),採用輪形拓撲結構,PSO的效果很好。
第二種方法:按照粒子的歐式距離取粒子的鄰域
在第一種方法中,按照粒子的編號來得到粒子的鄰域,但是這些粒子其實可能在實際位置上並不相鄰,於是Suganthan提出基於空間距離的劃分方案,在迭代中計算每一個粒子與群中其他粒子的距離。記錄任何2個粒子間的的最大距離為dm。對每一粒子按照||xa-xb||/dm計算一個比值。其中||xa-xb||是當前粒子a到b的距離。而選擇閾值frac根據迭代次數而變化。當另一粒子b滿足||xa-xb||/dm<frac時,認為b成為當前粒子的鄰域。
這種辦法經過實驗,取得較好的應用效果,但是由於要計算所有粒子之間的距離,計算量大,且需要很大的儲存空間,所以,該方法一般不經常使用。