1

我正在做一个人工智能领域的游戏类项目;其中我使用 PSO 算法让敌人找到玩家的位置。这是我的问题:

如何优化 PSO 以找到一个非静态且不断变化的目标?

我想在这个游戏的不同关卡中实现一些群体智能算法。

4

1 回答 1

2

在更新粒子速度之前(以及之后,在限制速度、位置之后),通常在 PSO 中,粒子最佳位置和群体最佳位置会根据当前迭代中群体中每个粒子的目标函数值进行更新。让我们分别表示这些位置particleBestPos(对于每个粒子)和swarmBestPos。最后,对于每个粒子,让particleCurrentPos表示当前位置。

对于每个粒子,考虑到 f(...) 描述的一些静态目标,要最小化,床位置根据以下公式更新:

if f(particleCurrentPos) < f(particleBestPos)
    particleCurrentPos <-- particleBestPos
if f(particleCurrentPos) < f(swarmBestPos)
    swarmBestPos <-- particleBestPos

现在,让 f(...) 成为描述从参数( particleCurrentPos)到玩家的距离的“动态”函数应该没有问题。问题在于如果玩家不断移动, particleBestPosswarmBestPos位置几乎没有价值。

对此的一种解决方案是保留每个粒子的历史记录,例如 n 个最近的位置。在上面的粒子/群最佳更新步骤中,对于每个粒子:滚动遍历粒子的历史(n 个最新位置),并让particleBestPos为此时玩家当前位置中最好的(和swarmBestPos类似) .

在这一步之后,粒子速度(和位置)像往常一样更新,但可以保证认知部分(对particleBestPos的权重)和社会部分(对swarmBestPos的权重)在某种程度上是最新的,相对于玩家的当前位置。每个粒子的 n 个最新位置的历史将作为粒子的记忆:

“从我和我的群体的 n 个位置历史的角度来看:我自己和我的群体的哪个历史位置对于玩家当前的位置最有利漂移”

您允许的历史记忆越长,集群就越能更好地(或更危险:))跟踪移动的玩家。


补充:由于您的目标函数(评估和评分粒子)非常微不足道(当前到玩家的距离)并且最优解(位置)总是已知的(x* = 玩家位置),在这种情况下,也许 PSO 有点矫枉过正,并且您可以简单地将您的敌人建模为 boids,请参阅Boids 模型

您可以使用原始的空隙模型,但添加一个额外的(重加权)对齐规则;转向玩家。

请注意,Boids 模型不是优化模型,而只是一种模拟群体行为的方法,其灵感来自于成群结队的鸟类。在你的情况下,我相信它应该足够了。附加对齐规则上的权重大小也将是直接控制敌人跟踪玩家的好方法。

于 2015-12-06T01:14:40.770 回答