1 原理
粒子群演算法是群智慧型一種,是基於對鳥群覓食行為的研究和模擬而來的。假設在鳥群覓食範圍,只在乙個地方有食物,所有鳥兒看不到食物(不知道食物的具體位置),但是能聞到食物的味道(能知道食物距離自己位置)。最好的策略就是結合自己的經驗在距離鳥群中距離食物最近的區域搜尋。
利用粒子群演算法解決實際問題本質上就是利用粒子群演算法求解函式的最值。因此需要事先把實際問題抽象為乙個數學函式,稱之為適應度函式。在粒子群演算法中,每只鳥都可以看成是問題的乙個解,這裡我們通常把鳥稱之為粒子,每個粒子都擁有:
位置,可以理解函式的自變數的值;
經驗,也即是自身經歷過的距離食物最近的位置;
速度,可以理解為自變數程式設計客棧的變化值;
適應度,距離食物的位置,也就是函式值。
粒子群演算法的過程
pso流程圖
初始化。包括根據給定的粒子個數,初始化粒子,包括初始化一下的值:
位置:解空間內的隨機值;
經驗:與初始位置相等;
速度:0;
適應度:根據位置,帶入適應度函式,得到適應度值。
更新。包括兩部分:
粒子自身資訊:包括根據下面的公式更新粒子的速度、位置,根據適應度函式更新適應度,然後和用更新後的適應度和自身經驗進行比較,如果新的適應度由於經驗的適應度,就利用當前位置更新經驗;
速度更新公式
位置更新公式
上面公式中:i表示粒子編號;t表示時刻,反映在迭代次數上;w是慣性權重,一般設定在0.4左右;c表示學習因子,一般都取值為2;xpbest表示的是粒子i的經驗,也即是粒子i所到過最佳位置;xgbest代表的是全域性最優粒子的位置;r是0到1之間的隨機值。
種群資訊:把當前適應度和全域性最優位置的適應度進行比較,如果當前適應度優於全域性最優的適應度,那麼久用當前粒子替換群居最優。
判斷結束條件。結束條件包括最大迭代次數和適應度的閾值。
2 **
實驗環境為python 2.7.11。
這個**最初是用於求解一維最大熵分割影象問題的,因此是求解函式最大值,如果需要求解最小值,把**中的大於號全部改成小於號就可以了。
首先需要解決的是粒子的儲存,我第一反應是利用結構體來儲存,但是python並沒有相應的資料結構,所以我選擇用乙個類來表示粒子結構,該類的乙個物件就是乙個粒子,上**:
class bird:
"""speed:速度
position:位置
fit:適應度
lbestposition:經歷的最佳位置
lbestfit:經歷的最佳的適應度值
"""def __init__(self, speed, position, fit, lbestposition, lbestfit):
self.speed = speed
self.position = position
self.fit = fit
self.lbestfit = lbestposition
self.lbestposition = lpestfit
接下來就是粒子群演算法的主幹部分,用乙個類來封裝,**:
import random
class pso:
"""fitfunc:適應度函式
birdnum:種群規模
w:慣性權重
c1,c2:個體學習因子,社會學習因子
solutionspace:解空間,列表型別:[最小值,最大值]
"""def __init__(self, fitfunc, birdnum, w, c1, c2, solutionspace):
self.fitfunc = fitfunc
self.w = w
self.c1 = c1
self.c2 = c2
self.birds, self.best = self.initbirds(birdnum, solutionspace)
def initbirds(self, size, solutionspace):
birds =
for i in range(size):
position = random.uniform(solutionspace[0], solutionspace[1])
程式設計客棧speed = 0
fit = self.fitfunc(position)
birds.append(bird(speed, position, fit, position, fit))
best = birds[0]
for bird in birds:
if bird.fit > best.fit:
best = bird
return birds,best
def updatebirds(self):
for bird in self.birds:
# 更新速度
bird.speed = self.w * bird.speed + self.c1 * random.random() * (bird.lbestposition - bird.position) + self.c2 * random.random() * (self.best.position - bird.position)
# 更新位置
bird.position = bird.position + bird.speed
# 跟新適應度
bird.fit = self.fitfunc(bird.position)
# 檢視是否需要更新經驗最優
if bird.fit > bird.lbestfit:
bird.lbestfit = bird.fit
bird.lbestposition = bird.position
def solve(self, maxiter):
# 只考慮了最大迭代次數,如需考慮閾值,新增判斷語句就好
for i in range(maxiter):
# 更新粒子
self.updatebirds()
for bird in self.birds:
# 檢視是否需要更新全域性最優
if bird.fit > self.best.fit:
self.best = bird
有了以上**,只需要自定義適應度函式fitfunc就可以進行求解,但是需要注意的是只適用於求解 一維問題 。
總結
粒子群演算法python實現
1 概述 粒子群演算法作為一種優化演算法,在很多領域都有應用。所謂優化,我的理解是對乙個問題求出它足夠好的解,目前的優化演算法有很多,如蟻群演算法 遺傳演算法等。粒子群演算法相對於這些演算法來說,它更簡單,而且有很快的收斂速度。2 演算法描述 舉乙個優化問題的例子,若求 粒子群演算法思想 於實際生活...
Python程式設計實現粒子群演算法 PSO 詳解
粒子群演算法是群智慧型一種,是基於對鳥群覓食行為的研究和模擬而來的。假設在鳥群覓食範圍,只在乙個地方有食物,所有鳥兒看不到食物 不知道食物的具體位置 但是能聞到食物的味道 能知道食物距離自己位置 最好的策略就是結合自己的經驗在距離鳥群中距離食物最近的區域搜尋。利用粒子群演算法解決實際問題本質上就是利...
粒子群演算法實現之python
python實現粒子群演算法 粒子群演算法 pso 又可以叫做鳥群演算法,是學者觀察模仿鳥群的行為而發展的一種智慧型搜尋演算法,和遺傳演算法一樣,也是一種群智慧型演算法。總的來說,粒子群演算法也是一種進化演算法,粒子分布在空間中,粒子在空間中的座標組成的向量可以看做成遺傳演算法中的個體,或者是鳥群中...