日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

粒子群算法python(含例程代码与详解)

發布時間:2023/12/14 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 粒子群算法python(含例程代码与详解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 1.算法簡介
  • 2.算法流程
  • 3.算法示例
  • 4.算法實現
  • 5.算法應用

1.算法簡介

粒子群算法的思想源于對鳥類捕食行為的研究,模擬鳥集群飛行覓食的行為,鳥之間通過集體的協作使群體達到最優目的。
設想這樣的一個場景,一群鳥在隨機的搜索食物,在某塊區域里有一塊食物,所有的鳥都不知道食物在哪里,但是他們可以感受到當前的位置離食物還有多遠,此時找到食物的最優策略是什么?答案是:搜尋目前離食物最近的鳥的周圍區域,根據自己的飛行經驗判斷食物的所在。

PSO正是從這種模型中得到了啟發:
1.每個尋優問題的解都被想象成一只鳥,稱為‘粒子’,所有的粒子都在一個D維空間進行搜索。
2.所有的粒子都由一個fitness function確定適應值以判斷目前位置的好壞。
3.每一個粒子都被賦予記憶功能,能記住所搜尋到的最佳位置
4.每一個粒子還有一個速度以決定飛行的距離和方向。這個速度根據本身的飛行經驗及同伴的飛行經驗進行動態調整。
5.可以看出粒子群算法的基礎在于信息的社會共享

D維空間中,有N個粒子;
粒子i位置:xi=(xi1,xi2,…xiD),將xi代入適應函數f(xi)求適應值;
粒子i速度:vi=(vi1,vi2,…viD)
粒子i個體經歷過的最好位置:pbesti=(pi1,pi2,…piD)
種群所經歷過的最好位置:gbest=(g1,g2,…gD)

通常,在第d(1≤d≤D)維的位置變化范圍限定在(Xmin,d,Xmax,dX_{min,d},X_{max,d}Xmin,d?,Xmax,d?)內,
速度變化范圍限定在(?Vmax,d,Vmax,d-V_{max,d},V_{max,d}?Vmax,d?,Vmax,d?) 內(即在迭代中若
超出了邊界值,則該維的速度或位置被限制為該維最大速度或邊界
位置)
速度及位置的更新公式
有了上面的了解后,一個很關鍵的問題就是粒子的速度以及位置如何更新?

粒子i的第d維速度更新公式

粒子i的第d維位置更新公式

vidkv_{id}^kvidk?:第k次迭代粒子i的飛行速度矢量的第d維分量
xidkx_{id}^kxidk?:第k次迭代粒子i位置矢量的第d維分量
c1,c2:加速度常數,調節學習最大步長(超參數)
r1,r2:兩個隨機函數,取值范圍[0,1],以增加隨機性
w:慣性權重,非負數,調節對解空間的搜索范圍。(超參數)
可以看出pso算法一共含有3個超參數。

對于粒子速度更新公式這里多介紹一些:
其速度更新公式包含三個部分
第一部分為粒子先前的速度
第二部分為‘認知’部分,表示粒子本身的思考,可理解為粒子i當前位置與自己最好位置之間的距離
第三部分為‘社會部分’,表示粒子間的信息共享和合作,可理解為粒子i當前位置與群體最好位置之間的距離。
如下圖所示,粒子其運動的過程受以上三個方面的影響:

2.算法流程

  • Initial:
    初始化粒子群體(群體規模為n),包括隨機位置和速度。
  • Evaluation:
    根據fitness function ,評價每個粒子的適應度。
  • Find the Pbest:
    對每個粒子,將其當前適應值與其個體歷史最佳位置(pbest)對應的適應值做比較,如果當前的適應值更高,則將用當前位置更新歷史最佳位置pbest。
  • Find the Gbest:
    對每個粒子,將其當前適應值與全局最佳位置(gbest)對應的適應值做比較,如果當前的適應值更高,則將用當前粒子的位置更新全局最佳位置gbest。
  • Update the Velocity:
    根據公式更新每個粒子的速度與位置。
  • 如未滿足結束條件,則返回步驟2
    通常算法達到最大迭代次數或者最佳適應度值的增量小于某個給定的閾值時算法停止。
  • 該算法的流程圖如下:

    3.算法示例








    4.算法實現

    以上面的例子為例,該算法的實現如下,如果需要優化其他問題,只需要調整下fitness function即可。

    import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3Ddef fit_fun(x): # 適應函數return sum(100.0 * (x[0][1:] - x[0][:-1] ** 2.0) ** 2.0 + (1 - x[0][:-1]) ** 2.0)class Particle:# 初始化def __init__(self, x_max, max_vel, dim):self.__pos = np.random.uniform(-x_max, x_max, (1, dim)) # 粒子的位置self.__vel = np.random.uniform(-max_vel, max_vel, (1, dim)) # 粒子的速度self.__bestPos = np.zeros((1, dim)) # 粒子最好的位置self.__fitnessValue = fit_fun(self.__pos) # 適應度函數值def set_pos(self, value):self.__pos = valuedef get_pos(self):return self.__posdef set_best_pos(self, value):self.__bestPos = valuedef get_best_pos(self):return self.__bestPosdef set_vel(self, value):self.__vel = valuedef get_vel(self):return self.__veldef set_fitness_value(self, value):self.__fitnessValue = valuedef get_fitness_value(self):return self.__fitnessValueclass PSO:def __init__(self, dim, size, iter_num, x_max, max_vel, tol, best_fitness_value=float('Inf'), C1=2, C2=2, W=1):self.C1 = C1self.C2 = C2self.W = Wself.dim = dim # 粒子的維度self.size = size # 粒子個數self.iter_num = iter_num # 迭代次數self.x_max = x_maxself.max_vel = max_vel # 粒子最大速度self.tol = tol # 截至條件self.best_fitness_value = best_fitness_valueself.best_position = np.zeros((1, dim)) # 種群最優位置self.fitness_val_list = [] # 每次迭代最優適應值# 對種群進行初始化self.Particle_list = [Particle(self.x_max, self.max_vel, self.dim) for i in range(self.size)]def set_bestFitnessValue(self, value):self.best_fitness_value = valuedef get_bestFitnessValue(self):return self.best_fitness_valuedef set_bestPosition(self, value):self.best_position = valuedef get_bestPosition(self):return self.best_position# 更新速度def update_vel(self, part):vel_value = self.W * part.get_vel() + self.C1 * np.random.rand() * (part.get_best_pos() - part.get_pos()) \+ self.C2 * np.random.rand() * (self.get_bestPosition() - part.get_pos())vel_value[vel_value > self.max_vel] = self.max_velvel_value[vel_value < -self.max_vel] = -self.max_velpart.set_vel(vel_value)# 更新位置def update_pos(self, part):pos_value = part.get_pos() + part.get_vel()part.set_pos(pos_value)value = fit_fun(part.get_pos())if value < part.get_fitness_value():part.set_fitness_value(value)part.set_best_pos(pos_value)if value < self.get_bestFitnessValue():self.set_bestFitnessValue(value)self.set_bestPosition(pos_value)def update_ndim(self):for i in range(self.iter_num):for part in self.Particle_list:self.update_vel(part) # 更新速度self.update_pos(part) # 更新位置self.fitness_val_list.append(self.get_bestFitnessValue()) # 每次迭代完把當前的最優適應度存到列表print('第{}次最佳適應值為{}'.format(i, self.get_bestFitnessValue()))if self.get_bestFitnessValue() < self.tol:breakreturn self.fitness_val_list, self.get_bestPosition()if __name__ == '__main__':# test 香蕉函數pso = PSO(4, 5, 10000, 30, 60, 1e-4, C1=2, C2=2, W=1)fit_var_list, best_pos = pso.update_ndim()print("最優位置:" + str(best_pos))print("最優解:" + str(fit_var_list[-1]))plt.plot(range(len(fit_var_list)), fit_var_list, alpha=0.5)

    5.算法應用

    注意該算法在解決具體問題時需要注意以下幾點:
    1.種群大小m
    m很小很容易陷入局部最優,m很大,pso的優化能力很好,當種群數目增長至一定水平時,再增長將不再有顯著的作用。
    2.權重因子
    對于粒子的速度更新的三部分:
    a. 慣性因子w=1表示基本的粒子群算法,w=0表示失去對粒子本身的速度記憶。
    b. 自我認知部分的學習因子c1=0表示無私型的粒子群算法,只有社會,沒有自我,這樣會使群體喪失多樣性,從而容易導致陷入局部最優而無法跳出。
    c. 社會經驗部分的學習因子c2=0表示自我型的粒子群算法,只有自我沒有社會,這樣導致沒有信息的社會共享,算法收斂速度緩慢
    這三個參數的選擇非常重要,如何調整這三個參數使算法避免早熟又可以比較快的收斂,對于解決實際問題意義較大。
    3.最大速度
    速度限制的作用為:維護算法的探索能力與開發能力的平衡。
    VmV_mVm?較大時,探索能力強,但是粒子容易飛過最優解
    VmV_mVm?較小時,開發能力強,但是容易陷入局部最優解
    VmV_mVm?一般設定為每維變量變化范圍的10%~20%
    4.停止準則
    a.最大迭代次數
    b.可以接受的滿意解(通過fitness function判斷是否滿意)
    5.粒子空間的初始化
    較好地選擇粒子的初始化空間,將大大縮短收斂時間.初始化空間根據具體問題的不同而不同,根據具體問題進行設定. 該算法為數不多的關鍵參數的設置卻對算法的精度和效率有
    著顯著影響.
    6.線性遞減權值(未測)

    wmaxw_{max}wmax?最大慣性權重,wminw_{min}wmin?最小慣性權重,run當前迭代次數,runmaxrun_{max}runmax?為算法迭代總次數

    較大的w有較好的全局收斂能力,較小的w則有較強的局部收斂能力。因此,隨著迭代次數的增加,慣性權重w應不斷減少,從而使得粒子群算法在初期具有較強的全局收斂能力,而晚期具有較強的局部收斂能力。
    7.收縮因子法(未測)

    1999年,Clerc引入收縮因子以保證算法的收斂性,即速度更新公式改為上式,其中,收縮因子K為受φ1 φ2 限制的w。φ1 φ2是需要預先設定的模型參數。

    收縮因子法控制系統行為最終收斂,且可以有效搜索不同區域,該法能得到較高質量的解。
    8.算法的鄰域拓撲結構(未測)
    粒子群算法的鄰域拓撲結構包括兩種,一種是將群體內所有個體都作為粒子的鄰域,另一種是只將群體中的部分個體作為粒子的鄰域.鄰域拓撲結構決定群體歷史最優位置,因此該算法分為全局粒子群算法和局部粒子群算法,上面我實現的是全局粒子群算法。
    全局粒子群算法
    1. 粒子自己歷史最優值
    2. 粒子群體的全局最優值
    局部粒子群算法
    1. 粒子自己歷史最優值
    2. 粒子鄰域內粒子的最優值
    鄰域隨迭代次數的增加線性變大,最后鄰域擴展到整個粒子群。
    實踐證明:全局版本的粒子群算法收斂速度快,但是容易陷入局部最優。局部版本的粒子群算法收斂速度慢,但是很難陷入局部最優。現在的粒子群算法大都在收斂速度與擺脫局部最優這兩個方面下功夫。其實這兩個方面是矛盾的。看如何更好的折中了。

    總結

    以上是生活随笔為你收集整理的粒子群算法python(含例程代码与详解)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。