图解粒子群优化算法(PSO)

PSO:particle swarm optimization
注:以下的鸟就是粒子。

总体思想

有若干只鸟 x i x_i xi,位置可能各不相同,但是每只鸟需要记录下自己的个体历史最优解 p b e s t i pbest_i pbesti,并分享给大家,在这些个体历史最优解中,记最优的那个为全局最优解 g b e s t gbest gbest。然后,每只鸟都根据 p b e s t i pbest_i pbesti g b e s t gbest gbest来调整自己的位置,其实就是希望在这两者的中间部分搜寻。

算法双要素

每只鸟都有一个位置 x x x和速度 v v v,其中 v v v p b e s t i pbest_i pbesti g b e s t gbest gbest决定, x x x v v v决定。

1. 我们先说 x x x如何由 v v v决定。假设当前某只鸟的位置 x x x和速度 v v v如下:
在这里插入图片描述
则这只鸟的下一个位置为:
x = x + v x=x+v x=x+v
即:
在这里插入图片描述
2. 我们再说 v v v如何由 p b e s t i pbest_i pbesti g b e s t gbest gbest决定。假设当前某只鸟的位置 x i x_i xi、速度 v i v_i vi、该鸟的个体历史最优解 p b e s t i pbest_i pbesti,以及鸟群的全局最优解 g b e s t gbest gbest如下。(注: x i x_i xi等等三个也和 v i v_i vi一样,是一个向量,只是没显式地画出来而已。)
在这里插入图片描述

按照我们之前的思想,我们希望这只鸟既靠近 p b e s t i pbest_i pbesti又靠近 g b e s t gbest gbest,那么综合一下,就是往他们的中间方向靠近。

即做两个向量差,如下:
在这里插入图片描述
然后这两个向量加权相加,比如 y = 0.1 y 1 + 0.2 y 2 y=0.1y_1+0.2y_2 y=0.1y1+0.2y2,随便你设置,假设我们相加后的 y y y是这样的。
在这里插入图片描述
然后我们再进行 v i v_i vi的更新,即 v i = v i + y v_i=v_i+y vi=vi+y。即根据向量的加法得到红色的新 v i v_i vi
在这里插入图片描述
至此 v i v_i vi的更新完毕了,最后一步我们也一起做完吧。即 x i = x i + v i x_i=x_i+v_i xi=xi+vi。如下图,我们得到了新的粗蓝色新的 x i x_i xi
在这里插入图片描述

总结

PSO算法的标准形式:

在每只鸟分享完信息之后,先按公式1更新速度(下面的3个向量相加和我们上面的图解一模一样),然后按照公式2更新位置。
在这里插入图片描述
其中:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个解释一下,如果 v i ′ = v i + y v_i^{'}=v_i+y vi=vi+y,如果 v i ′ v_i^{'} vi的长度太大了,那么保留这个 v i ′ v_i^{'} vi的方向,但是截断其长度,使其为 v m a x v_{max} vmax的长度。

扩展

在这里插入图片描述

标准的PSO算法是上述公式(3)和公式(2),因为其引入了惯性因子 w w w,使得算法相对之前,更加灵活可变,成了标准。

上述其值较大,全局寻优能力强等等那里的分析,联系一下我们上面的图,向量相加那里,立马就能够理解了(全局寻优能力强就是迭代之后新的 x i x_i xi远远飞离现有的3个点:旧的 x i , p b e s t i , g b e s t x_i,pbest_i,gbest xi,pbesti,gbest,反之,如果迭代之后很靠近这三个点,就是局部寻优

参考:
https://blog.csdn.net/daaikuaichuan/article/details/81382794

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是一个简单的粒子优化算法PSO)的代码示例: ``` import random class Particle: def __init__(self, x0): self.position = [] self.velocity = [] self.best_position = [] self.fitness = -1 for i in range(0, num_dimensions): self.velocity.append(random.uniform(-1, 1)) self.position.append(x0[i]) def evaluate(self, cost_function): self.fitness = cost_function(self.position) if self.fitness < self.best_fitness: self.best_fitness = self.fitness self.best_position = self.position def update_velocity(self, best_global_position): w = 0.5 c1 = 1 c2 = 2 for i in range(0, num_dimensions): r1 = random.random() r2 = random.random() cognitive_velocity = c1 * r1 * (self.best_position[i] - self.position[i]) social_velocity = c2 * r2 * (best_global_position[i] - self.position[i]) self.velocity[i] = w * self.velocity[i] + cognitive_velocity + social_velocity def update_position(self, bounds): for i in range(0, num_dimensions): self.position[i] = self.position[i] + self.velocity[i] if self.position[i] > bounds[i][1]: self.position[i] = bounds[i][1] if self.position[i] < bounds[i][0]: self.position[i] = bounds[i][0] class PSO: def __init__(self, cost_function, x0, bounds, num_particles, max_iterations): global num_dimensions num_dimensions = len(x0) best_global_position = [] best_global_fitness = -1 swarm = [] for i in range(0, num_particles): swarm.append(Particle(x0)) for i in range(0, max_iterations): for j in range(0, num_particles): swarm[j].evaluate(cost_function) if swarm[j].fitness < best_global_fitness: best_global_fitness = swarm[j].fitness best_global_position = list(swarm[j].position) for j in range(0, num_particles): swarm[j].update_velocity(best_global_position) swarm[j].update_position(bounds) print('Best position:', best_global_position) print('Best fitness:', best_global_fitness) def cost_function(x): return sum([i**2 for i in x]) bounds = [(-10, 10), (-10, 10), (-10, 10)] PSO(cost_function, x0=[0, 0, 0], bounds=bounds, num_particles=15, max_iterations=30) ``` 这个代码演示了如何使用 PSO 来最小化一个简单的函数。需要注意的是,这个示例只展示了基本的 PSO 实现,实际上,PSO 还有很多改进和扩展,例如变异粒子优化算法(MPSO)、共生进化粒子优化算法(CEPSO)等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

音程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值