今天給大家介紹一種優化算法。
粒子群優化算法,也叫作鳥群算法,英文簡稱PSO算法。
現在假設這樣一個問題,在一個空間內,有一定數量的鳥群,在這個空間中的某個位置存放了食物,但是鳥群中的鳥不知道什麼位置存放了食物,僅知道其當前位置與食物的距離,問題就是我們的鳥群需要在最快的時間內找到食物的位置。
算法是這樣定義的,首先對於鳥群中的鳥,其所擁有的變量有三個,第一,是其當前的位置信息。第二,是其速度,這個速度(包含速度大小和速度方向)就決定了下一時刻該鳥的位置。然後,對於鳥群中的每個鳥,其在搜尋食物過中所經歷的最好位置(也就是距離食物的最近位置)記為pbest;對於整個種群,其每次整體遷移的過程中,總會有一個鳥距離食物的距離最近,那麼我們記這個鳥在這一時刻的位置為gbest。其次,對於速度的定義是這樣的
其中這個i就是第i個小鳥。
對於這裡的一些名詞,我們簡單解釋一下:
w 為非負數,稱為慣性因子。
c1和c2稱為加速常數。c1c1是根據個體自身的經驗進行判斷的常數;c2c2根據群體的經驗
r1和r2為[0,1]範圍內變換的隨機數。
a 稱為約束因子,目的是控制速度的權重。
然後我們取單位時間,那麼下一時刻的位置就變成了上一時刻的位置加上一時刻的速度。
最後,粒子的位置坐標對應於所求的目標函數的函數值,也就是適應度值。粒子群中的粒子中適應度值最好的那個粒子的坐標就是目標函數的解。
基於這些,我們的鳥群就可以找到食物了。
現在讓我們化身為鳥群裡的小鳥,來進行一次搜尋食物之旅。
假設現在有三隻小鳥:
第一隻叫坤坤,第二隻叫凡凡,第三隻叫帶帶大師兄。
現在進行搜索,凡凡,坤坤,大師兄,在森林裡漫無目的的飛啊飛。
每隔一段時間,坤坤,凡凡還有大師兄拿出手機互通電話,共享各自的位置。
然後坤坤和凡凡發現大師兄距離食物最近,就決定向大師兄那個方向飛去。
就這樣,坤坤和凡凡準備開始向大師兄靠攏。
但是凡凡想起來自己有一次的位置比大師兄現在的這個位置更好,他不知道怎麼辦,所以三個人就在微信群裡商量,就有了上面的速度公式。
然後,經過不斷的調整,三隻鳥兒會向食物方向聚集,達到目標。
對於我們的實際應用來說,我現在有一個需要優化的函數(一般是優化函數的最小值),有五個自變量,那麼我們的每個鳥兒的位置就會有五個,每個鳥兒的速度也會有五個,那麼我們的適應值就是將五個自變量帶入優化函數所得到的函數值。鳥群一共有三隻鳥,那麼我的鳥群所構成的數組就是一個三行五列的數組。
以下是粒子群的算法流程: