使用粒子群优化进行适当编码

Appropriate encoding using Particle Swarm Optimization

问题

我一直在研究粒子群优化,所以我说我会把它付诸实践。

我要解决的问题是平衡分区问题 - 或者简单地简化为子集和问题(其中和是所有数字的一半)。

似乎更新粒子速度的通用公式是

不过这个问题我就不多说了。

由于没有针对子集和问题的在线 PSO 尝试,我转而查看了旅行商问题。

他们更新速度的方法涉及获取一组访问过的城镇,从另一个城镇中减去一个城镇,然后对其进行一些操作。

我发现它与上面的公式没有关系。

我的方法

所以我放弃了公式并尝试了自己的方法来解决子集和问题。

我基本上使用 gbestpbest 来确定将特定元素删除或添加到子集中的概率。

即 - 如果我的问题 space 是 [1,2,3,4,5](目标是 78),并且我当前的粒子(子集)有 [1,None,3,None,None] , 而 gbest[None,2,3,None,None] 那么有更高的概率保留 3, 添加 2 和删除 1, 基于 gbest

我可以 post 编码,但认为没有必要,你懂的(我正在使用 python 顺便说一句 - 因此 None)。

基本上,这在一定程度上奏效了,我找到了不错的解决方案,但在处理较大的数据集和值时速度非常慢。

我的问题

我是否以巧妙的方式对问题进行编码并更新粒子 "velocities"?

有没有办法确定这是否会正确收敛?

是否有我可以用来学习如何为特定问题 space 创建收敛 "update" 公式的资源?

非常感谢!

编码

是的,你的编码是正确的:你的每个位图(这实际上是你的 5 元素列表)是一个粒子。

概念

你的方程的概念性问题是因为你的问题 space 是一个离散的点阵图,它不适合立即更新步骤。例如,如果你想通过调整你的学习率来获得更细的粒度,你通常会减少一些小的因素(比如,3)。在这个 space 中,步数只有原来的 1/3 是什么意思?这就是你遇到问题的原因。

我看到的主要可能性是创建 3 倍多的粒子,然后将转换概率全部除以 3。这仍然不能很好地满足,但它确实模拟了这个过程。

离散步骤

如果您有一个非常大的图表,其中高速可以在一步中为您提供数十个转换,您可以使用更平滑的距离(损失或错误)函数来指导您的模型。这么小的东西,任何两个位置之间的距离不超过 5 步,很难用这样的概念来工作。

相反,您使用基于到解决方案的估计距离的误差函数。最简单的方法是用较近的 7 或 8 减去粒子的总数。更难的方法是根据该差异和粒子元素 "in play".

来估计距离

收敛性证明

是的,有办法做到这一点,但它需要一些功能分析。通常,您想证明误差函数在粒子 space 上是凸的。换句话说,你必须证明你的误差函数是一个可靠的距离度量,至少就相对位置而言(即证明较低的误差 does 意味着你是更接近解决方案)。

正在创建更新公式

不,这是一个启发式领域,基于由粒子坐标、误差函数和运动特征定义的问题形状 space。

额外推荐

您当前允许的转换是 "add" 和 "delete" 元素。 包括 "swap elements":用一名在场成员交换一名缺席成员。这将允许平凡误差函数为您定义一个凸 space,您将在很短的时间内收敛。