粒子群优化算法(PSO)

目录

问题场景

1 算法原理

1.1 初始化

1.2 更新速度

1.3 更新位置

 3 参数说明

3.1 粒子数 NP

3.2 粒子的长度(维数)

3.3 粒子的范围

3.4 最大速度 Vmax

3.5 学习因子 c1 和 c2

4 算法的不足和改进


问题场景

一群鸟在随机搜索食物,在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢?最简单有效的就是搜寻离食物最近的鸟的周围区域。
基于上述模型的启发,通过模拟鸟群的觅食行为, Eberhart 博士和 kennedy 博士最早提出了粒子群优化(PSO)算法,又可称为粒子群算法、微粒群算法或 微粒群优化算法。该算法一种基于群体协作的随机搜索算法,属于群集智能 (Swarm intelligence, SI)方法。

1 算法原理

在 PSO 算法中,优化问题的解代表搜索空间中的鸟(称为“粒子)”,所有 的粒子都有一个由被优化的函数决定的适应值(fitness value),以及每个粒子 有一个速度来决定它们飞翔的方向和距离。在具体搜索过程中,每一粒子通过跟 踪两个“极值”来更新自己。其中,第一个粒子是自身所找到的最优解,称为个 体极值 pbest;另一个是整个种群所找到的最优解,称为全局极值 gbest。
特别地,针对上节中的优化问题,PSO 算法的具体操作如下。

1.1 初始化

在问题的决策空间中随机生成 NP 个粒子,具体方式与 DE 算法相同
差分进化算法链接地址:http://t.csdn.cn/WDdQo

1.2 更新速度

对每一个粒子 x i ,找出其相应的 pbest 和 gbest,根据下式来更 新自己的速度 v i。

 

其中,w 为惯性权重, c 1 c 2 分别为认知加速常数或学习因子(cognitive acceleration coefficient)和社会加速常数或学习因子(social acceleration coefficient), r 1 r 2 为区间[0,1]内的两个随机值。

1.3 更新位置

根据上述更新后的速度更新自身的位置。具体过程如下:

 

注 2: 粒子的在每一维上的速度都应被限制在一个预先给定的范围内。当某一维的速 度超过Vmax 时,则将该维的速度限定为 Vmax。
2 算法流程
根据上述操作,PSO 算法的具体实现流程如下。
步 1:确定算法中的相关参数(包括粒子个数 NP、惯性权重 w、学习因子 c 1 c 2 ),确定适应度函数。
步 2:随机产生初始粒子群。
步 3:对初始粒子进行评价,即计算初始每个粒子的适应度值。
步 4:判断是否达到终止条件。若是,则终止搜索,将得到历史最佳粒子作 为最优解输出;若否,继续。
步 5:更新粒子速度和位置。
步 6:迭代次数 g=g+1,转步(4)

 3 参数说明

3.1 粒子数 NP

一般取 20–40。实际上,对于大部分的问题,一般取 10 个粒子 就可以得到好的结果。然而,对一些比较难(复杂)的问题或一些特定类别的问 题而言, 粒子数可以取到 100 或 200。

3.2 粒子的长度(维数)

由优化问题决定, 即问题解的维数。

3.3 粒子的范围

由优化问题决定,每一维可设定不同的范围。

3.4 最大速度 Vmax

决定粒子在搜索过程中的最大移动距离,通常设为粒子的范 围宽度。

3.5 学习因子 c1 和 c2

通常等于 2. 一些文献中也有其他的取值,但一般取 c1 等于 c2 且在 0 到 4 之间取值。

4 算法的不足和改进

与 DE 算法相似,PSO 算法随着迭代的进行,粒子之间的多样性也会降低,导 致过早收敛到局部极小点,或者发生停滞现象。 目前,为进一步提高 PSO 算法的性能,一些动态的参数控制方法及拓扑结构 被研究和引入。
(注:本资料来自导师田梦男上课讲义,转载请注明出处)
[1] R. Eberhart, J. Kennedy, Particle swarm optimization, in: Proceedings of the IEEE international conference on neural networks, Vol. 4, IEEE, 1995, pp. 1942–1948.
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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、付费专栏及课程。

余额充值