Python程式設計實現粒子群演算法 PSO 詳解

2021-08-19 20:01:39 字數 2841 閱讀 9390

粒子群演算法是群智慧型一種,是基於對鳥群覓食行為的研究和模擬而來的。假設在鳥群覓食範圍,只在乙個地方有食物,所有鳥兒看不到食物(不知道食物的具體位置),但是能聞到食物的味道(能知道食物距離自己位置)。最好的策略就是結合自己的經驗在距離鳥群中距離食物最近的區域搜尋。

利用粒子群演算法解決實際問題本質上就是利用粒子群演算法求解函式的最值。因此需要事先把實際問題抽象為乙個數學函式,稱之為適應度函式。在粒子群演算法中,每只鳥都可以看成是問題的乙個解,這裡我們通常把鳥稱之為粒子,每個粒子都擁有:

粒子群演算法的過程

pso流程圖

初始化。包括根據給定的粒子個數,初始化粒子,包括初始化一下的值:

更新。包括兩部分:

上面公式中:i表示粒子編號;t表示時刻,反映在迭代次數上;w是慣性權重,一般設定在0.4左右;c表示學習因子,一般都取值為2;xpbest表示的是粒子i的經驗,也即是粒子i所到過最佳位置;xgbest代表的是全域性最優粒子的位置;r是0到1之間的隨機值。

判斷結束條件。結束條件包括最大迭代次數和適應度的閾值。

首先需要解決的是粒子的儲存,我第一反應是利用結構體來儲存,但是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)

definitbirds

(self, size, solutionspace)

: birds =

for i in range(size):

position = random.uniform(solutionspace[0], solutionspace[1])

speed = 0

fit = self.fitfunc(position)

best = birds[0]

for bird in

birds:

if bird.fit > best.fit:

best = bird

return birds,best

defupdatebirds

(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

defsolve

(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 詳解

1 原理 粒子群演算法是群智慧型一種,是基於對鳥群覓食行為的研究和模擬而來的。假設在鳥群覓食範圍,只在乙個地方有食物,所有鳥兒看不到食物 不知道食物的具體位置 但是能聞到食物的味道 能知道食物距離自己位置 最好的策略就是結合自己的經驗在距離鳥群中距離食物最近的區域搜尋。利用粒子群演算法解決實際問題本...

粒子群演算法實現之python

python實現粒子群演算法 粒子群演算法 pso 又可以叫做鳥群演算法,是學者觀察模仿鳥群的行為而發展的一種智慧型搜尋演算法,和遺傳演算法一樣,也是一種群智慧型演算法。總的來說,粒子群演算法也是一種進化演算法,粒子分布在空間中,粒子在空間中的座標組成的向量可以看做成遺傳演算法中的個體,或者是鳥群中...