我正在进行一个与游戏相关的项目,涉及人工智能领域;在这个项目中,我使用PSO算法让敌人寻找玩家的位置。我的问题是:
如何优化PSO算法以找到一个非静态且持续变化的目标?
我想在游戏的不同关卡中实现一些群体智能算法。
回答:
在更新粒子速度之前(以及之后,限制速度和位置后),通常在PSO中,会根据当前迭代中群体中每个粒子的目标函数值更新粒子最佳位置和群体最佳位置。我们分别将这些位置记为particleBestPos(每个粒子的最佳位置)和swarmBestPos。最后,对于每个粒子,让particleCurrentPos表示当前位置。
对于每个粒子,考虑一个静态目标,由f(…)描述,需要最小化,更新最佳位置的方式如下:
if f(particleCurrentPos) < f(particleBestPos) particleCurrentPos <-- particleBestPosif f(particleCurrentPos) < f(swarmBestPos) swarmBestPos <-- particleBestPos
现在,让f(…)成为一个“动态”函数,例如描述从参数(particleCurrentPos)到玩家的距离,应该没有问题。问题在于,如果玩家不断移动,particleBestPos和swarmBestPos的位置就几乎没有价值了。
解决这个问题的一个方法是保留每个粒子的最近n个位置的历史记录。在上述粒子/群体最佳位置更新步骤中,对于每个粒子:遍历粒子的历史记录(最近n个位置),并让particleBestPos成为相对于玩家当前位置的最佳位置(swarmBestPos同理)。
在这一步之后,粒子速度(和位置)按常规更新,但可以确保认知成分(向particleBestPos的权重)和社会成分(向swarmBestPos的权重)相对于玩家的当前位置是相对更新的。每个粒子的最近n个位置的历史将作为粒子的记忆:
“从我和我的群体的n个位置历史来看:相对于玩家的当前位置,哪个历史位置对我自己以及我的群体来说是最有利的漂移方向?”
你允许的历史记忆越长,群体在跟踪移动的玩家时表现得越好(或越危险 🙂 )。
补充:由于你的目标函数(评估和评分粒子的函数)非常简单(当前到玩家的距离),并且最优解(位置)总是已知的(x* = 玩家位置),在这种情况下,PSO可能有点过度,你可以简单地将你的敌人建模为boids,请参阅Boids模型。
你可以使用原始的boids模型,但增加一个额外的(重权重的)对齐规则;以引导向玩家移动。
请注意,Boids模型不是一个优化模型,而只是模拟群体行为的一种方式,受到鸟群飞行的启发。在你的情况下,我认为这应该足够了。你在额外对齐规则上的权重大小也将是直接控制你的敌人跟踪玩家效果的好方法。