粒子群算法(Particle Swarm Optimization,PSO)是于1995年被Kennedy等人提出的一種模擬自然界中鳥群進行覓食過程的一種群智能優(yōu)化算法,該算法將待求解問題的每一個候選解視作鳥群中的每一個個體的具體位置信息,每個候選解對應(yīng)的最優(yōu)適應(yīng)度值作為每個個體在該位置處所能搜索到的食物的量,通過個體間位置信息的相互交流來發(fā)現(xiàn)目標范圍內(nèi)的最優(yōu)適應(yīng)度值對應(yīng)的最優(yōu)候選解。
在使用粒子群算法進行優(yōu)化問題的求解時,需要進行理解的概念主要有兩個,一個是粒子的位置信息,一個是粒子的速度信息。
粒子的位置信息通常對應(yīng)著待優(yōu)化問題的候選解,最初需要對此位置信息在目標范圍內(nèi)進行初始化,然后通過此位置信息計算獲得此粒子的適應(yīng)度值,在每次迭代的過程中粒子需要對自己的位置信息進行更新,具體的更新公式如下:
該公式表示個體i在第t次迭代后的位置信息等于在第t次迭代前的位置信息加上第t次迭代時的速度。
在對個體的位置信息進行更新前,需要通過計算獲得個體新的速度信息,這一速度信息一般包括了個體在接下來的一次迭代過程中的移動方向和移動距離,其具體的計算公式如下:
等號右邊分成三部分,第一部分是慣性因子乘以上一次迭代時的速度,第二部分為自我學(xué)習(xí)部分,括號中是該個體歷史最優(yōu)位置信息減去該個體上一次迭代時的位置信息,第三部分為種群學(xué)習(xí)部分,括號中是該種群歷史最優(yōu)位置信息減去該個體上一次迭代時的位置信息。w為慣性因子,c1、c2為加速因子,其中前者為每個粒子的個體學(xué)習(xí)加速因子,后者為每個粒子的全局學(xué)習(xí)加速因子,通常這兩個數(shù)被設(shè)置為常數(shù)2,但也可設(shè)為其他的常數(shù),但其取值范圍處于[0,4]之間,r1與r2均為0到1之間的隨機數(shù)。
粒子群算法的算法步驟可以總結(jié)如下:
待求解問題:
Rosenbrock’s,取值范圍為[-10,10],取值范圍內(nèi)的理想最優(yōu)解為0,將其搜索的空間維度設(shè)為20。
實現(xiàn)源碼:
#庫的導(dǎo)入
import numpy as np
import random
import matplotlib.pyplot as plt
#待求解問題
def function(x):
y1 = 0
for i in range(len(x) - 1):
y2 = 100 * ((x[i + 1] - x[i] ** 2) ** 2) + (x[i] - 1) ** 2
y1 = y1 + y2
y = abs(0 - y1)
return y
rangepop=[-10,10] #取值范圍
pn=30 #種群數(shù)量
iterators = 1000 #迭代次數(shù)
w=0.9 #慣性因子
#兩個加速系數(shù)
c1=2
c2=2
#a1用于存儲種群個體位置信息,v用于存儲種群個體移動速度,fitness用于存儲個體適應(yīng)度值
a1=np.zeros((pn,20))
v = np.zeros((pn, 20))
fitness=np.zeros(pn)
#對種群個體、移動速度進行初始化,計算初始適應(yīng)度值
for j in range(pn):
a1[j] = np.random.uniform(low=-10, high=10,size=(1, 20))
v[j] = np.zeros((1,20))
fitness[j] = function(a1[j])
#allpg,bestpg分別表示種群歷史最優(yōu)個體和適應(yīng)度值
allpg,bestpg=a1[fitness.argmin()].copy(),fitness.min()
#poppn,bestpn分別存儲個體歷史最優(yōu)位置和適應(yīng)度值
poppn,bestpn=a1.copy(),fitness.copy()
#bestfitness用于存儲每次迭代時的種群歷史最優(yōu)適應(yīng)度值
bestfitness=np.zeros(iterators)
#開始迭代
for i in range(iterators):
print("generation:",i)
for m in range(pn):
r1 = np.random.rand()
r2 = np.random.rand()
#計算移動速度
v[m]=w*v[m]+c1*r1*(poppn[m]-a1[m])+c2*r2*(allpg-a1[m])
#計算新的位置
a1[m]=a1[m]+v[m]
#確保更新后的位置在取值范圍內(nèi)
a1[a1rangepop[1]]=rangepop[1]
#計算適應(yīng)度值
fitness[m] = function(a1[m])
#更新個體歷史最優(yōu)適應(yīng)度值
if fitness[m]'weight':'normal','size': 30})
x=range(1,1001,1)
plt.plot(x,bestfitness,color="red",label="PSO",linewidth=3.0, line)
plt.tick_params(labelsize=25)
plt.xlabel("Epoch",fontdict={'weight':'normal','size': 30})
plt.ylabel("Fitness value",fontdict={'weight':'normal','size': 30})
plt.xticks(range(0,1001,100))
plt.legend(loc="upper right",prop={'size':20})
plt.savefig("PSO.png")
plt.show()
圖中橫軸為迭代次數(shù),縱軸為最優(yōu)適應(yīng)度值。
參考源碼
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧