优化算法笔记|粒子群算法理解及Python实现
粒子群算法的理解及Python實現(xiàn)
- 1.粒子群算法概述
- 2 基本PSO算法流程圖
- 3 粒子群算法的Python實現(xiàn)
1.粒子群算法概述
粒子群算法 來源于對鳥群捕食模型的修正。
假設(shè)在一個n維空間中,有一群鳥(m只)在捕食,食物位于n維空間的某個點上。
假設(shè)鳥每次都能夠判斷離食物更近還是更遠了,這樣鳥在捕食的過程中會根據(jù)自己的經(jīng)驗以及鳥群中的 其他鳥的位置決定自己的速度,根據(jù)當(dāng)前的位置和速度,可得下一刻的位置,這樣每只鳥通過向自己和鳥群學(xué)習(xí)不斷更新自己的速度和位置,直到最終獲得食物,或者是離食物足夠近。
對于某一時刻的第i只鳥,可用兩個向量描述,鳥的位置向量Pi =(xi1,xi2,…xin), 鳥的速度 Vi =(Vi1,Vi2,…Vin)(i=1,2,…m)。
更新速度的表達式:
更新位置的表達式:
粒子 i 經(jīng)過的歷史最好位置:
種群經(jīng)過的歷史最好位置:
優(yōu)點:粒子群算法作為一種優(yōu)化算法,在解空間,粒子追隨最優(yōu)的粒子進行搜索。
它比蟻群算法、遺傳算法等更簡單,參數(shù)少,無需梯度信息,收斂速度更快。
設(shè)想這樣一個場景:
一群鳥在隨機搜索食物,在這個區(qū)域里只有一塊食物,所有的鳥都不知道食物在哪,但是他們知道自己當(dāng)前的位置距離食物還有多遠。
那么找到食物的最優(yōu)策略是什么?
最簡單有效的方法是:搜尋目前離食物最近的鳥的周圍區(qū)域。
2 基本PSO算法流程圖
3 粒子群算法的Python實現(xiàn)
import numpy as np import matplotlib.pyplot as pltclass PSO(object):def __init__(self, population_size, max_steps):self.w = 0.6 # 慣性權(quán)重self.c1 = self.c2 = 2self.population_size = population_size # 粒子群數(shù)量self.dim = 2 # 搜索空間的維度self.max_steps = max_steps # 迭代次數(shù)self.x_bound = [-10, 10] # 解空間范圍self.x = np.random.uniform(self.x_bound[0], self.x_bound[1],(self.population_size, self.dim)) # 初始化粒子群位置self.v = np.random.rand(self.population_size, self.dim) # 初始化粒子群速度fitness = self.calculate_fitness(self.x)self.p = self.x # 個體的最佳位置self.pg = self.x[np.argmin(fitness)] # 全局最佳位置self.individual_best_fitness = fitness # 個體的最優(yōu)適應(yīng)度self.global_best_fitness = np.min(fitness) # 全局最佳適應(yīng)度def calculate_fitness(self, x):return np.sum(np.square(x), axis=1)def evolve(self):fig = plt.figure()for step in range(self.max_steps):r1 = np.random.rand(self.population_size, self.dim)r2 = np.random.rand(self.population_size, self.dim)# 更新速度和權(quán)重self.v = self.w*self.v+self.c1*r1*(self.p-self.x)+self.c2*r2*(self.pg-self.x)self.x = self.v + self.xplt.clf()plt.scatter(self.x[:, 0], self.x[:, 1], s=30, color='k')plt.xlim(self.x_bound[0], self.x_bound[1])plt.ylim(self.x_bound[0], self.x_bound[1])plt.pause(0.01)fitness = self.calculate_fitness(self.x)# 需要更新的個體update_id = np.greater(self.individual_best_fitness, fitness)self.p[update_id] = self.x[update_id]self.individual_best_fitness[update_id] = fitness[update_id]# 新一代出現(xiàn)了更小的fitness,所以更新全局最優(yōu)fitness和位置if np.min(fitness) < self.global_best_fitness:self.pg = self.x[np.argmin(fitness)]self.global_best_fitness = np.min(fitness)print('best fitness: %.5f, mean fitness: %.5f' % (self.global_best_fitness, np.mean(fitness)))pso = PSO(100, 100) pso.evolve() plt.show()運行結(jié)果:
初始結(jié)果:
最后結(jié)果:
參考博客:
https://blog.csdn.net/chen_jp/article/details/7947059
https://blog.csdn.net/winycg/article/details/79120154
https://blog.csdn.net/zuochao_2013/article/details/53431767?ref=myread
總結(jié)
以上是生活随笔為你收集整理的优化算法笔记|粒子群算法理解及Python实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu下搭建MPI并行计算环境
- 下一篇: python:No module nam