粒子群优化算法python
粒子群優化算法PSO
- 粒子群優化算法
- 基本原理
- 算法步驟
- 代碼實現
粒子群優化算法
一群鳥在隨機搜索食物,在這個區域里只有一塊食物。所有的鳥都不知道食物在那里。但是它們知道當前的位置離食物還有多遠。那么,找到食物的最簡單有效的方法就是搜尋離食物最近的鳥的周圍區域。如果將鳥抽象為沒有體積和質量的“粒子”,相當于問題的一個解,鳥群就相當于一個解集,離食物最近的鳥相當于解群中的最優粒子,食物的位置相當于全局最優解。
基本原理
粒子群算法是由 Kennedy 和 Eberhart 等通過模擬鳥群的覓食行為而提出的一種基于群體協作的隨機搜索算法。標準粒子群算法搜索尋優的基本框架如圖 所示:
每個粒子具有兩個屬性:
粒子位置 x
粒子速度 v
假設在一個 D 維的目標搜索空間中,有 N 個粒子組成一個群落。則:
第 i 粒子的位置為一個 D 維向量,表示為:
第 i 個粒子的飛行速度也是一個 D 維向量,表示為:
第 i 個粒子迄今為止搜索到的最優位置為個體極值,表示為:
整個粒子群迄今為止搜索到的最優位置為全局極值,表示為:
每個粒子追隨當前的最優粒子在解空間中運動,并根據如下公式來更新自己的速度和位置:
速度變換公式:
位置變換公式為:
其中,w 為慣性權值;c1 和 c2 為學習因子,分別反映粒子的自我學習能力和向群體 最 優 粒 子學 習 的 能 力 ; r1 和 r2 為 [0,1] 的 均 勻 隨 機數 ;vi為 粒 子 速 度,vi屬于[-vmax,vmax],vmax是用戶設定的一個常量,用來限制粒子的速度。
公式中,第一部分是粒子先前的速度與慣性權值的積,用來保證算法的全局
收斂性,第二部分是粒子自身的學習能力,第三部分是粒子的社會學習能力,表示粒子之間的信息共享與相互協作,第二、三部分是引起粒子速度變化的社會因素,使其在最優解附近具有局部搜索的能力。
算法步驟
基于上述流程,標準粒子群算法的具體步驟可描述如下:
步驟 1:在可行域中隨機初始化一群粒子,包括粒子的規模 N、位置 xi和速
度 vi;
步驟 2:根據目標函數計算每個粒子的適應度值 Fit[i] ;
步驟 3:比較每個粒子的適應度值Fit[i]與個體極值 Pbest[i],若Fit[i] > Pbest[i],
則用 Fit[i] 替換 Pbest[i];
步驟 4:比較每個粒子的適應度值 [i]itF 與當前的全局極值 gbest[i],若
Fit[i] > gbest[i],則用 Fit[i] 替換 gbest[i];
步驟 5:根據公式(2-1),(2-2)更新粒子的速度 vi 和位置 xi ;
步驟 6:判斷是否達到停止準則,如果達到設置的搜索精度或達到最大迭代次
數則退出,否則返回步驟 2。
代碼實現
# coding: utf-8 import numpy as np import random import matplotlib.pyplot as pltclass PSO():# PSO參數設置def __init__(self, pN, dim, max_iter):self.w = 0.8self.c1 = 2self.c2 = 2self.r1 = 0.6self.r2 = 0.3self.pN = pN # 粒子數量self.dim = dim # 搜索維度self.max_iter = max_iter # 迭代次數self.X = np.zeros((self.pN, self.dim)) # 所有粒子的位置和速度self.V = np.zeros((self.pN, self.dim))self.pbest = np.zeros((self.pN, self.dim)) # 個體經歷的最佳位置和全局最佳位置self.gbest = np.zeros((1, self.dim))self.p_fit = np.zeros(self.pN) # 每個個體的歷史最佳適應值self.fit = 1e10 # 全局最佳適應值#目標函數Sphere函數def function(self, X):return X**4-2*X+3#初始化種群def init_Population(self):for i in range(self.pN): #因為要隨機生成pN個數據,所以需要循環pN次for j in range(self.dim): #每一個維度都需要生成速度和位置,故循環dim次self.X[i][j] = random.uniform(0, 1)self.V[i][j] = random.uniform(0, 1)self.pbest[i] = self.X[i] #其實就是給self.pbest定值tmp = self.function(self.X[i]) #得到現在最優self.p_fit[i] = tmp 這個個體歷史最佳的位置if tmp < self.fit: #得到現在最優和歷史最優比較大小,如果現在最優大于歷史最優,則更新歷史最優self.fit = tmpself.gbest = self.X[i]# 更新粒子位置def iterator(self):fitness = []for t in range(self.max_iter): #迭代次數,不是越多越好for i in range(self.pN): # 更新gbest\pbesttemp = self.function(self.X[i])if temp < self.p_fit[i]: # 更新個體最優self.p_fit[i] = tempself.pbest[i] = self.X[i]if self.p_fit[i] < self.fit: # 更新全局最優self.gbest = self.X[i]self.fit = self.p_fit[i]for i in range(self.pN):self.V[i] = self.w * self.V[i] + self.c1 * self.r1 * (self.pbest[i] - self.X[i]) + \self.c2 * self.r2 * (self.gbest - self.X[i])self.X[i] = self.X[i] + self.V[i]fitness.append(self.fit)print(self.X[0], end=" ")print(self.fit) # 輸出最優值return fitness##輸出
#程序 my_pso = PSO(pN=30, dim=1, max_iter=100) my_pso.init_Population() fitness = my_pso.iterator() # 畫圖 plt.figure(1) plt.title("Figure1") plt.xlabel("iterators", size=14) plt.ylabel("fitness", size=14) t = np.array([t for t in range(0, 100)]) fitness = np.array(fitness) plt.plot(t, fitness, color='b', linewidth=3) plt.show()在上面我們計算 適應度函數
我們看一看結果:
1.迭代圖像
總結
以上是生活随笔為你收集整理的粒子群优化算法python的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#完美截断字符串(中文+非中文)
- 下一篇: 计算机二级python经典真题