日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

粒子群优化算法python实现

發(fā)布時(shí)間:2023/12/10 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 粒子群优化算法python实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 前言
  • 一、粒子群優(yōu)化算法是什么?
  • 二、算法流程
  • 三、算法的python實(shí)現(xiàn)
  • 實(shí)驗(yàn)結(jié)果


前言

首先簡單介紹粒子群優(yōu)化算法,粒子群優(yōu)化算法的python實(shí)現(xiàn)(含代碼)


一、粒子群優(yōu)化算法是什么?

粒子群優(yōu)化算法(Particle Swarm Optimization, PSO)作為進(jìn)化計(jì)算的一個(gè)分支,是由Eberhart和Kennedy于1995年提出的一種全局搜索算法,同時(shí)它也是一種模擬自然界的生物活動(dòng)以及群體智能的隨即搜索算法。
粒子群優(yōu)化算法起源于鳥群覓食的過程,一個(gè)核心機(jī)制是每只小鳥各自覓食,并記住一個(gè)離食物最近的位置,通過和其他的小鳥交流,得到整個(gè)鳥群已知的最佳位置,引導(dǎo)鳥群朝著這個(gè)方向繼續(xù)搜索。
還有兩個(gè)關(guān)鍵設(shè)置:粒子歷史最優(yōu)位置(pBest向量)、群體歷史最優(yōu)位置(gBest向量)
這里pBest向量是一組向量,它包含了每個(gè)粒子的歷史最優(yōu)位置,gBest向量為pBest向量中適應(yīng)值最高的向量,即全局最優(yōu)。
說明:算法中一般取要優(yōu)化的目標(biāo)函數(shù)作為適應(yīng)值函數(shù),評(píng)估適應(yīng)值的大小,然后更新pBest向量和gBest向量。

二、算法流程

(1)初始化所有個(gè)體(粒子),初始化它們的速度和位置,并且將個(gè)體的歷史最優(yōu)位置pBest設(shè)為當(dāng)前位置,而群體中最優(yōu)的個(gè)體作為當(dāng)前的gBest。
(2)在每一代的進(jìn)化中,計(jì)算各個(gè)粒子的適應(yīng)度函數(shù)值。
(3)如果該粒子當(dāng)前的適應(yīng)度函數(shù)值比其歷史最優(yōu)值要好,那么歷史最優(yōu)將會(huì)被當(dāng)前位置所代替。
(4)如果該粒子的歷史最優(yōu)比全局最優(yōu)要好,那么全局最優(yōu)將會(huì)被該粒子的歷史最優(yōu)所替代。
(5)對每個(gè)粒子i的第d維的速度和位置分別按照下列公式進(jìn)行更新。這兩個(gè)公式在二維空間中的關(guān)系如下圖。



ω是慣量權(quán)重,一般初始化為0.9,隨著迭代過程線性遞減到0.4 ; c1和c2是加速系數(shù)(也稱學(xué)習(xí)因子),傳統(tǒng)上取固定值2.0 ; rand1d是和rand2d是兩個(gè)[0,1]之間的隨機(jī)數(shù)。另外,設(shè)置一個(gè)Vmax限制速度的范圍,Vmax的每一維Vmaxd一般取相應(yīng)維的取值范圍的10%~20%。更新后檢查位置是否在問題空間內(nèi)。
這里ω做一個(gè)線性遞減是因?yàn)?#xff0c;在算法一開始,群體沒有一個(gè)方向做指導(dǎo),所以需要一個(gè)任意性,進(jìn)行搜索;而隨著算法的迭代,群體已經(jīng)有了一個(gè)指導(dǎo)方向,就不再需要很大的任意性,而是受個(gè)體歷史最優(yōu)和群體歷史最優(yōu)的影響越來越大。
(6)如果還沒有到達(dá)結(jié)束條件,轉(zhuǎn)到(2),否則輸出gBest并結(jié)束。
下圖為算法的流程圖。

三、算法的python實(shí)現(xiàn)

本算法以優(yōu)化目標(biāo)函數(shù):

為例,使用粒子群優(yōu)化算法進(jìn)行求解。
運(yùn)行環(huán)境:python3.6,jupyter notebook

# 目標(biāo)函數(shù)值計(jì)算 def f(C):return 1/(C[0]**2+C[1]**2+C[2]**2+C[3]**2+1) # 初始化種群 C=[[[x],[v]]] def init(N):C = np.zeros((N,2,4))global pBest,gBestfor i in range(N):for j in range(4):C[i][0][j] = np.random.uniform(-5,5)C[i][1][j] = np.random.uniform(-1,1)pBest[i] = C[i][0]gBest = pBest[np.argmax(Eval(C,N))].copy()return C # 判斷更新后是否還在問題空間內(nèi) def whether_out(C):for i in range(len(C)):for j in range(4):if C[i][0][j] < -5 :C[i][0][j] = -5elif C[i][0][j] > 5:C[i][0][j] = 5return C# 更新粒子的速度和位置 def update_C(C,N,w,c1,c2):'''C:種群 [[[x],[v]]]N:種群規(guī)模 100w:慣量權(quán)重 初始0.9,遞減到0.4c1、c2:加速系數(shù)pBest: 每個(gè)粒子的歷史最優(yōu)位置[[x]]gBest: 全局最優(yōu)位置[x]''' # print(C.shape)for i in range(N):for j in range(4):rand1 = np.random.random()rand2 = np.random.random()C[i][1][j] = w*C[i][1][j]+c1*rand1*(pBest[i][j]-C[i][0][j])+c2*rand2*(gBest[j]-C[i][0][j])C[i][0][j] += C[i][1][j]C = whether_out(C)return C# 評(píng)估函數(shù) def Eval(C,N):temp = np.array([])for i in range(N):temp = np.append(temp,f(C[i][0]))return temp # 更新粒子的歷史最優(yōu)和全局最優(yōu) def update_best(C,N,fitness):'''pBest: 每個(gè)粒子的歷史最優(yōu)位置,[[x]]gBest: 全局最優(yōu)位置,[x]fitness: 粒子當(dāng)前適應(yīng)值,[f(x)]'''global pBest,gBestfor i in range(N):if fitness[i] > f(pBest[i]):pBest[i] = C[i][0]if fitness[i] > f(gBest):gBest = C[i][0].copy() # w線性遞減 def w_degression(w,N):w -= 0.5/Nreturn w def PSO(length,N,w,c1,c2):global pBest,gBestC = init(N) # print('gBest:',gBest)for i in range(length):C = update_C(C,N,w,c1,c2)fitness = Eval(C,N)update_best(C,N,fitness)w=w_degression(w,N)if f(gBest)==1.0:breakreturn [f(gBest),gBest,i] start = time.time() c1,c2 = 2,2 # length:迭代次數(shù),N:種群規(guī)模 length,N=1000,30 w=0.9 pBest = np.zeros((N,4)) gBest = np.zeros(N) # PSO(length,N,w,c1,c2) end = time.time() print(PSO(length,N,w,c1,c2)) print('PSO運(yùn)行時(shí)間: %.2f s'%(end-start))

實(shí)驗(yàn)結(jié)果

當(dāng)種群數(shù)設(shè)置為100時(shí)

當(dāng)種群數(shù)設(shè)置為30時(shí)

總結(jié)

以上是生活随笔為你收集整理的粒子群优化算法python实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。