PSO 算法中的动态 objective 函数
dynamic objective function in PSO algorithm
我正在做一个人工智能领域的类游戏项目;其中我使用 PSO 算法让敌人找到玩家的位置。这是我的问题:
如何优化 PSO 以找到一个非静态且不断变化的 objective?
我想在这个游戏的不同关卡中实现一些群体智能算法。
在更新粒子速度之前(以及之后,在限制速度、位置之后),通常在 PSO 中,粒子最佳位置和群最佳位置都会更新 w.r.t。 objective 当前迭代中群体中每个粒子的函数值。让我们分别表示这些位置 particleBestPos(对于每个粒子)和 swarmBestPos。最后,对于每个粒子,令 particleCurrentPos 表示当前位置。
对于每个粒子,考虑一些静态 objective,由 f(...) 描述,要最小化,床位置根据以下内容更新:
if f(particleCurrentPos) < f(particleBestPos)
particleCurrentPos <-- particleBestPos
if f(particleCurrentPos) < f(swarmBestPos)
swarmBestPos <-- particleBestPos
现在,让 f(...) 成为一个 "dynamic" 函数来描述,比方说,从参数 (particleCurrentPos) 到玩家。问题是 particleBestPos 以及 swarmBestPos 位置在玩家不断移动时几乎没有价值。
对此的一个解决方案是保留每个粒子的历史记录,比如说,n 个最近的位置。在上面的 particle/swarm 最佳更新步骤中,对于每个粒子:滚动粒子的历史记录(n 个最新位置),并让 particleBestPos 成为关于粒子的最佳位置玩家此时的当前位置(和swarmBestPos类似)。
在这一步之后,粒子速度(和位置)像往常一样更新,但可以保证认知成分(权重朝向 particleBestPos)和社会成分(权重朝向swarmBestPos) 有些是最新的 w.r.t。球员的当前位置。每个粒子的n个最新位置的历史将作为粒子的记忆:
"From the viewpoint of my and my swarms' history of n positions: which historic position, of my own as well as my swarm, would be the most advantageous to drift toward with regard to the players' current position"
您允许的历史记忆越长,蜂群跟踪移动玩家的能力就越好(或更危险:))。
添加:由于您的 objective 函数(对粒子进行评估和评分)非常微不足道(当前到玩家的距离)并且最佳解决方案(位置)始终是已知的(x* = 玩家位置),也许在这种情况下,PSO 有点矫枉过正,您可以简单地将您的敌人建模为 boids,请参阅 Boids model.
您可以使用原始的空隙模型,但添加一个额外的(高权重)对齐规则;转向玩家。
请注意,Boids 模型 不是 和优化模型,而只是一种模拟群体行为的方法,其灵感来自成群结队的鸟类。就您而言,我认为这就足够了。附加对齐规则的权重大小也将是一种直接控制敌人跟踪玩家的好方法。
我正在做一个人工智能领域的类游戏项目;其中我使用 PSO 算法让敌人找到玩家的位置。这是我的问题:
如何优化 PSO 以找到一个非静态且不断变化的 objective?
我想在这个游戏的不同关卡中实现一些群体智能算法。
在更新粒子速度之前(以及之后,在限制速度、位置之后),通常在 PSO 中,粒子最佳位置和群最佳位置都会更新 w.r.t。 objective 当前迭代中群体中每个粒子的函数值。让我们分别表示这些位置 particleBestPos(对于每个粒子)和 swarmBestPos。最后,对于每个粒子,令 particleCurrentPos 表示当前位置。
对于每个粒子,考虑一些静态 objective,由 f(...) 描述,要最小化,床位置根据以下内容更新:
if f(particleCurrentPos) < f(particleBestPos)
particleCurrentPos <-- particleBestPos
if f(particleCurrentPos) < f(swarmBestPos)
swarmBestPos <-- particleBestPos
现在,让 f(...) 成为一个 "dynamic" 函数来描述,比方说,从参数 (particleCurrentPos) 到玩家。问题是 particleBestPos 以及 swarmBestPos 位置在玩家不断移动时几乎没有价值。
对此的一个解决方案是保留每个粒子的历史记录,比如说,n 个最近的位置。在上面的 particle/swarm 最佳更新步骤中,对于每个粒子:滚动粒子的历史记录(n 个最新位置),并让 particleBestPos 成为关于粒子的最佳位置玩家此时的当前位置(和swarmBestPos类似)。
在这一步之后,粒子速度(和位置)像往常一样更新,但可以保证认知成分(权重朝向 particleBestPos)和社会成分(权重朝向swarmBestPos) 有些是最新的 w.r.t。球员的当前位置。每个粒子的n个最新位置的历史将作为粒子的记忆:
"From the viewpoint of my and my swarms' history of n positions: which historic position, of my own as well as my swarm, would be the most advantageous to drift toward with regard to the players' current position"
您允许的历史记忆越长,蜂群跟踪移动玩家的能力就越好(或更危险:))。
添加:由于您的 objective 函数(对粒子进行评估和评分)非常微不足道(当前到玩家的距离)并且最佳解决方案(位置)始终是已知的(x* = 玩家位置),也许在这种情况下,PSO 有点矫枉过正,您可以简单地将您的敌人建模为 boids,请参阅 Boids model.
您可以使用原始的空隙模型,但添加一个额外的(高权重)对齐规则;转向玩家。
请注意,Boids 模型 不是 和优化模型,而只是一种模拟群体行为的方法,其灵感来自成群结队的鸟类。就您而言,我认为这就足够了。附加对齐规则的权重大小也将是一种直接控制敌人跟踪玩家的好方法。