我在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表示粒子位置的类
同样明智的其他课程可用[{3}}
答案 0 :(得分:5)
粒子群优化:
答案 1 :(得分: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 被称为惯性权重并调节动量分量的影响。 c1 和 c2 是认知和社会加速系数,它们分别调节认知和社会成分的重要性。 r1和r2是随机数的向量(从0和1之间的unifrom分布中采样),用于缩放差异向量的每个分量。
第一个差异向量(pBest(t) - x(t))允许粒子向其个人最佳/ pBest移动 - 这是粒子到目前为止遇到的最佳位置。 (为了实现该算法,因此粒子必须检查它遇到的每个位置并保存它,如果它是迄今为止最好的。)
第二个差异向量(gBest(t) - x(t))允许粒子使用来自群中其他粒子的信息。在该表达式中, gBest(t)表示到目前为止由群发现的最佳位置。 (因此,为了实现,在每次迭代之后,应检查所有粒子的分数,以便保存最好的粒子以备将来使用)。
粒子基于这些方程在搜索空间中移动多次迭代,直到希望它们都收敛到同一点。然后,全局最佳可以作为算法产生的最终解决方案。
希望这使PSO的内部运作更加清晰。每次迭代,每个粒子都会朝着由个人最好和全球最好的方向运动。假设目标函数的最优值在这两点附近,则粒子最终可能会遇到更好更好的解。
请注意,上述过程有许多不同的变体。例如,可以仅允许在群组的粒子之间共享知识。给定粒子可以与之通信的粒子子集称为其邻域。然后,粒子将朝着其附近的最佳解决方案的方向移动,即当地最好的解决方案。而不是全球最好的。
此外,还有许多其他可能的缺陷,例如 w , c1 和 c2 的值。虽然可以在这里做一些奇特的事情,但一般的经验法则是设置:
w = 0.729844
c1 = c2 = 1.49618
由http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=870279&tag=1建议导致收敛行为(即所有粒子最终会收敛到大致相同的点)。
通常,粒子在整个搜索空间中随机初始化。虽然也可以随机初始化它们的速度,但这并不是必要的,并且可能导致不同的行为,因此将速度作为0向量启动是可以的。
有些人还建议使用速度钳制(其中每个速度分量在某个最大值和最小值之上和之下有界;如果粒子的速度超过该值,则将其钳制到最大值/最小值)。如果正确选择了 w,c1 和 c2 ,并且只有在搜索空间范围内才更新gBest和pBest,则通常不需要这样做。