文章目录
- 1 概念
- 2 粒子群算法分析
- 2.1 问题抽象
- 2.2 更新规则
- 3 粒子群算法的流程图和伪代码
- 4 举个例子
- 5 代码
1 概念
粒子群优化算法PSO:Particle swarm optimization 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.
PSO的优势:优化一些简单、容易实现、参数不多的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。
2 粒子群算法分析
2.1 问题抽象
鸟被抽象为没有质量和体积的微粒(点),并延伸到N维空间,粒子i在N维空间的位置表示为矢量Xi=(x1,x2,…,xN),飞行速度表示为矢量Vi=(v1,v2,…,vN)。
每个粒子都有一个由目标函数决定的适应值(fitness value),并且知道自己到目前为止发现的最好位置(pbest)和现在的位置。这个可以看作是粒子自己的飞行经验。
除此之外,每个粒子还知道到目前为止整个群体中所有粒子发现的最好位置(gbest)(gbest是pbest中的最好值),这个可以看作是粒子同伴的经验
粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。
粒子群优化算法,设计一种无质量的粒子来模拟鸟群中的鸟。
粒子具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。
每个粒子在搜索空间中单独的搜寻最优解(参考),并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。
2.2 更新规则
- pbest:自己发现的最好的值
- gbest:同伴发现的最好的值
PSO初始化为一群随机粒子(随机解),然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest
)来更新自己的极值。
在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。
说明:
公式(1)的第一部分称为【记忆项】,表示上次速度大小和方向的影响;
公式(1)的第二部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;
公式(1)的第三部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。
粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。
以上面两个公式为基础,形成了PSO的标准形式。
注意:
w的引入,使 PSO 算法性能有了很大提高。
针对不同的搜索问题,可以调整全局和局部搜索能力,使得PSO算法可以应用到很多实际问题中。
3 粒子群算法的流程图和伪代码
4 举个例子
, 其中 -10 ≤ ≤ 10, 用粒子群优化算法求解的最小值。
5 代码
- 目标:求出
- 可以直接运行
- 如果你觉得本文对你有帮助,麻烦点赞收藏哦!你们的收藏是我更新的动力!
import numpy as np
import random
import matplotlib.pyplot as plt
# ----------------------PSO参数设置-----------------------------------------------------------------------------
class PSO:
def __init__(self, pN, dim, max_iter):
self.w = 0.8 # 公式里的参数(随机初始化)
self.c1 = 2 # 公式里的参数(随机初始化)
self.c2 = 2 # 公式里的参数(随机初始化)
self.r1 = 0.6 # 公式里的参数(随机初始化)
self.r2 = 0.3 # 公式里的参数(随机初始化)
self.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 ** 2 - 4 * X + 3
# ---------------------初始化种群-------------------------------------------------------------------------------
def init_Population(self):
for i in range(self.pN):
for j in range(self.dim):
self.X[i][j] = random.uniform(0, 1)
self.V[i][j] = random.uniform(0, 1)
self.pbest[i] = self.X[i]
tmp = self.function(self.X[i])
self.p_fit[i] = tmp
if tmp < self.fit:
self.fit = tmp
self.gbest = self.X[i]
# ----------------------更新粒子位置----------------------------------------------------------------------
def iterator(self):
fitness = []
for t in range(self.max_iter):
for i in range(self.pN): # 更新gbest\pbest
temp = self.function(self.X[i])
if temp < self.p_fit[i]: # 更新个体最优
self.p_fit[i] = temp
self.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)
print(t)
print(fitness)
参考博客: