【问题标题】:Particle Swarm Optimization粒子群优化
【发布时间】:2026-02-08 11:30:01
【问题描述】:

我在 java 中使用粒子群优化(PSO)。我对我们的工作知之甚少。因为,我正在申请生物信息学的multiple sequence alignment

我们需要找到对齐这些序列的位置和速度。我需要关于 PSO 的详细解释和参考,以及在 PSO 中计算速度和位置的需要。如果可能的话,我需要简单的例子来解释 Java 中的 PSO。实际上,我需要了解它如何优化问题。

public class Position {
 private double x;
 private double y;

 public Position(double x, double y) {
 this.x = x;
 this.y = y;
 }

 public double getX() {
 return x;
 }

 public void setX(double x) {
 this.x = x;
 }

 public double getY() {
 return y;
 }

 public void setY(double y) {
 this.y = y;
 }
}

这里是用getter和setter表示粒子位置的类

其他课程同样可用here

【问题讨论】:

  • 您可能还想对 Velocity 使用“class Position extends Point2D.Double”。 ;)
  • Math.pow(x ,2)x * x很多
  • 在浏览我得到这段代码时,我真的需要通过示例了解粒子群优化。我无法理解 PSO 在此示例中的工作原理。如果有人有解释 PSO 的示例 java 代码也可以。
  • 我确信这是一个 Java 编程问题,但以前可能有人这样做过。
  • 可用的信息非常少,因为我在实施数值算法方面的经验非常少。如果我通过示例对 PSO 进行解释,这将节省我的时间。

标签: java numerical particle-swarm


【解决方案1】:

粒子群优化:

  1. 在随机位置随机初始化一组粒子 搜索空间;
  2. 评估所有位置并更新全球最佳 位置和个人最佳位置;
  3. 更新每个速度 基于全局最佳位置的相对位置, 粒子的当前速度,个人最佳位置 粒子和一些随机向量;
  4. 转到 2。

【讨论】:

  • 书:swarm intelligence,纸:pso,维基:pso
  • 谢谢,我们必须在什么基础上发现问题必须使用 PSO 进行优化。也就是说,如何针对给定问题更新粒子、速度。
【解决方案2】:

一般概述

粒子群优化 (PSO) 是一种基于种群的随机搜索方法。种群中每个个体或粒子的位置代表了优化问题的可能解决方案。

搜索空间中给定位置的好坏/得分由目标函数衡量,目标函数是被优化的函数。

粒子在搜索空间中移动以寻找最优解。

粒子在搜索中移动的方式是魔法发生的地方。假设您使用的是惯性权重模型,这由三个不同的因素控制:惯性分量、社会分量和认知分量。

惯性分量本质上引入了一种动量形式,因此粒子的运动从一次迭代到下一次迭代不会太不稳定。认知组件允许粒子记忆其先前在哪里找到了影响其运动方向的良好解决方案。社交组件允许其他群体成员的知识(即群体中的其他成员在哪里找到了好的解决方案)来影响粒子的运动。

更新方程

在迭代t中,给定粒子的位置由x(t)表示。其下一次迭代的新位置根据以下公式计算:

x(t+1) = x(t) + v(t+1)

其中 v(t+1) 表示粒子在下一次迭代中的速度。请注意,上面的每个值都是向量。这些向量的长度将等于问题维数/目标函数的输入变量数。 (为我糟糕的符号道歉;我没有足够的声誉来发布漂亮的方程式)。粒子的速度计算公式为:

v(t+1) = w*v(t) + c1*r1*(pBest(t) - x(t)) + c2*r2*(gBest(t) - x(t) )

前面描述的三个不同的组成部分(惯性、认知和社会)分别由上述等式中的三个项之一表示。

w 称为惯性权重,调节动量分量的作用。 c1c2 是认知和社会加速系数,它们分别调节认知和社会成分的重要性。 r1 和 r2 是随机数向量(从 0 到 1 之间的 unifrom 分布中采样),用于缩放差异向量的每个分量。

第一个差分向量(pBest(t) - x(t)) 允许粒子移动到其个人最佳/pBest - 粒子迄今为止遇到的最佳位置。 (为了实现该算法,因此粒子有必要检查它遇到的每个位置并保存它,如果它是迄今为止最好的)。

第二个差分向量(gBest(t) - x(t)) 允许粒子使用来自群中其他粒子的信息。在这个表达式中,gBest(t) 表示到目前为止 swarm 找到的最佳位置。 (所以为了实现,在每次迭代之后,应该检查所有粒子的分数,以便保存最好的粒子以供将来使用)。

粒子根据这些方程在搜索空间中移动多次迭代,直到希望它们都收敛到同一点。然后可以将全局最佳作为算法产生的最终解决方案。

希望这能让 PSO 的内部运作更加清晰。在每次迭代中,每个粒子都会朝着由其个人最佳和全局最佳决定的方向移动。假设目标函数的最优值在这两个点附近,粒子很可能最终会遇到越来越好的解。

其他注意事项

请注意,上述过程有许多不同的变化。例如,可以只允许在群体粒子的一个子集之间共享知识。给定粒子可以与之通信的粒子子集称为其邻域。然后粒子将朝着在其附近找到的最佳解决方案的方向移动,即“局部最佳”而不是全局最佳。

此外,还有许多其他可能的陷阱,例如 wc1c2 的值。虽然在这里可以做一些花哨的事情,但一般的经验法则是设置:

w = 0.729844

c1 = c2 = 1.49618

正如http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=870279&tag=1 所建议的那样导致收敛行为(即所有粒子最终将收敛到大致相同的点)。

通常,粒子在整个搜索空间中随机初始化。尽管也可以随机初始化它们的速度,但这不是必需的,并且可能会导致不同的行为,因此只需将速度作为 0 向量开始即可。

有些人还建议使用速度钳制(其中每个速度分量的上下都以某个最大值和最小值为界;如果粒子的速度超过该值,则将其钳制为最大/最小值)。如果 w、c1c2 选择正确,并且 gBest 和 pBest 仅在搜索空间范围内时更新,则通常不需要这样做。

【讨论】: