python實(shí)現(xiàn)粒子群算法
粒子群算法
粒子群算法源于復(fù)雜適應(yīng)系統(tǒng)(Complex Adaptive System,CAS)。CAS理論于1994年正式提出,CAS中的成員稱(chēng)為主體。比如研究鳥(niǎo)群系統(tǒng),每個(gè)鳥(niǎo)在這個(gè)系統(tǒng)中就稱(chēng)為主體。主體有適應(yīng)性,它能夠與環(huán)境及其他的主體進(jìn)行交流,并且根據(jù)交流的過(guò)程“學(xué)習(xí)”或“積累經(jīng)驗(yàn)”改變自身結(jié)構(gòu)與行為。整個(gè)系統(tǒng)的演變或進(jìn)化包括:新層次的產(chǎn)生(小鳥(niǎo)的出生);分化和多樣性的出現(xiàn)(鳥(niǎo)群中的鳥(niǎo)分成許多小的群);新的主題的出現(xiàn)(鳥(niǎo)尋找食物過(guò)程中,不斷發(fā)現(xiàn)新的食物)。
PSO初始化為一群隨機(jī)粒子(隨機(jī)解)。然后通過(guò)迭代找到最優(yōu)解。在每一次的迭代中,粒子通過(guò)跟蹤兩個(gè)“極值”(pbest,gbest)來(lái)更新自己。
在找到這兩個(gè)最優(yōu)值后,粒子通過(guò)下面的公式來(lái)更新自己的速度和位置。


i 表示第 i 個(gè)粒子, d 表示粒子的第 d 個(gè)維度。r1, r2 表示兩個(gè)位于 [0, 1] 的隨機(jī)數(shù)(對(duì)于一個(gè)粒子的不同維度,r1, r2 的值不同)。pbest[i] 是指粒子取得最高(低)適應(yīng)度時(shí)的位置,gbest[i] 指的是整個(gè)系統(tǒng)取得最高(低)適應(yīng)度時(shí)的位置。
實(shí)踐
我們用 PSO 算法求解如下函數(shù)的最小值

可以在空間畫(huà)出圖像

下圖是使用 5 個(gè)粒子的收斂情況

可以看到,fitness 在第 12 輪就幾乎收斂到 -10.0。
下面是完整代碼
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
INF = 1e5
def plot_cost_func():
"""畫(huà)出適應(yīng)度函數(shù)"""
fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
Z = (X**2 + Y**2) - 10
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
plt.show()
def fitness(x):
return x[0]**2 + x[1]**2 - 10
class PSOSolver(object):
def __init__(self, n_iter, weight=0.5, c1=2, c2=2, n_particle=5):
self.n_iter = n_iter
self.weight = weight
self.c1 = c1
self.c2 = c2
self.n_particle = n_particle
self.gbest = np.random.rand(2)
# gbest 對(duì)應(yīng)的函數(shù)值
self.gbest_fit = fitness(self.gbest)
# 將位置初始化到 [-5, 5]
self.location = 10 * np.random.rand(n_particle, 2) - 5
# 將速度初始化到 [-1, 1]
self.velocity = 2 * np.random.rand(n_particle, 2) - 1
self.pbest_fit = np.tile(INF, n_particle)
self.pbest = np.zeros((n_particle, 2))
# 記錄每一步的最優(yōu)值
self.best_fitness = []
def new_velocity(self, i):
r = np.random.rand(2, 2)
v = self.velocity[i]
x = self.location[i]
pbest = self.pbest[i]
return self.weight * v + self.c1 * r[0] * (pbest - x) + \
self.c2 * r[1] * (self.gbest - x)
def solve(self):
for it in range(self.n_iter):
for i in range(self.n_particle):
v = self.new_velocity(i)
x = self.location[i] + v
fit_i = fitness(x)
if fit_i < self.pbest_fit[i]:
self.pbest_fit[i] = fit_i
self.pbest[i] = x
if fit_i < self.gbest_fit:
self.gbest_fit = fit_i
self.gbest = x
self.velocity[i] = v
self.location[i] = x
self.best_fitness.append(self.gbest_fit)
if __name__ == '__main__':
plot_cost_func()
n_iter = 20
s = PSOSolver(n_iter)
s.solve()
print(s.gbest_fit)
plt.title("Fitness Curve")
plt.xlabel("iter")
plt.ylabel("fitness")
plt.plot(np.arange(n_iter), np.array(s.best_fitness))
plt.show()
以上就是python實(shí)現(xiàn)粒子群算法的詳細(xì)內(nèi)容,更多關(guān)于python 粒子群算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺析Python 3 字符串中的 STR 和 Bytes 有什么區(qū)別
Python2的str相當(dāng)于Python3的Bytes,而Unicode相當(dāng)于Python3的Bytes。這篇文章主要介紹了Python 3 字符串中的 STR 和 Bytes 究竟有什么區(qū)別?需要的朋友可以參考下2018-10-10
Empty test suite.(PyCharm程序運(yùn)行錯(cuò)誤的解決方法)
今天小編就為大家分享一篇Empty test suite.(PyCharm程序運(yùn)行錯(cuò)誤的解決方法),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
pyqt5 實(shí)現(xiàn)在別的窗口彈出進(jìn)度條
今天小編就為大家分享一篇pyqt5 實(shí)現(xiàn)在別的窗口彈出進(jìn)度條,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Python實(shí)現(xiàn)微信好友數(shù)據(jù)爬取及分析
這篇文章會(huì)基于Python對(duì)微信好友進(jìn)行數(shù)據(jù)分析,這里選擇的維度主要有:性別、頭像、簽名、位置,主要采用圖表和詞云兩種形式來(lái)呈現(xiàn)結(jié)果,其中,對(duì)文本類(lèi)信息會(huì)采用詞頻分析和情感分析兩種方法,感興趣的小伙伴可以了解一下2021-12-12
python實(shí)現(xiàn)測(cè)試工具(一)——命令行發(fā)送get請(qǐng)求
這篇文章主要介紹了python如何實(shí)現(xiàn)命令行發(fā)送get請(qǐng)求,幫助大家更好的利用python進(jìn)行測(cè)試工作,感興趣的朋友可以了解下2020-10-10
Python開(kāi)發(fā)自定義Web框架的示例詳解
這篇文章主要為大家詳細(xì)介紹了python如何開(kāi)發(fā)自定義的web框架,我文中示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
解決pycharm回車(chē)之后不能換行或不能縮進(jìn)的問(wèn)題
今天小編就為大家分享一篇解決pycharm回車(chē)之后不能換行或不能縮進(jìn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01

