8

具体来说,我正在谈论本次比赛的编程:http ://www.nodewar.com/about

比赛涉及您在二维世界中面对其他拥有大量宇宙飞船的团队。船只受到边界的限制(如果它们退出,它们就会死亡),并且它们必须不断地避开卫星(它们用它们的重力拉动船只)。目标是杀死对方的女王。

我试图编写一些相对基本的技术,但我觉得好像我缺少一些基本的东西。

例如,我实现了一些 boids 行为(http://www.red3d.com/cwr/boids/),但它们似乎缺乏……目标,可以这么说。

这类游戏是否有任何通用技术(或者,最好是技术组合)?

编辑

我只想用赏金再次打开它,因为我觉得我仍然缺少关键信息。以下是我的 NodeWar 代码:

boundary_field = (o, position) ->
  distance = (o.game.moon_field - o.lib.vec.len(o.lib.vec.diff(position, o.game.center)))
  return distance

moon_field = (o, position) ->
  return o.lib.vec.len(o.lib.vec.diff(position, o.moons[0].pos))

ai.step = (o) ->
  torque = 0;
  thrust = 0;
  label = null;

  fields = [boundary_field, moon_field]

  # Total the potential fields and determine a target.
  target = [0, 0]
  score = -1000000
  step = 1
  square = 1

  for x in [(-square + o.me.pos[0])..(square + o.me.pos[0])] by step
    for y in [(-square + o.me.pos[1])..(square + o.me.pos[1])] by step
      position = [x, y]
      continue if o.lib.vec.len(position) > o.game.moon_field
      value = (fields.map (f) -> f(o, position)).reduce (t, s) -> t + s
      target = position if value > score
      score = value if value > score

  label = target

  { torque, thrust } = o.lib.targeting.simpleTarget(o.me, target)  
  return { torque, thrust, label }

然而,我可能错误地实现了势场,因为我能找到的所有示例都是关于离散运动的(而 NodeWar 是连续的而不是精确的)。

主要问题是我的 AI 在游戏区域内停留的时间不会超过 10 秒而不会飞出屏幕或坠入月球。

4

2 回答 2

7

您可以轻松地让 boids 算法玩 Nodewar 的游戏,只需向您的 boids 添加额外的转向行为和/或修改默认行为。例如,您将添加一个转向行为以避开月球,并添加一个针对敌舰的转向行为(排斥或吸引力,取决于您与敌舰之间的位置)。然后应该调整吸引力/排斥力的权重(可能通过遗传算法,相互发挥不同的配置)。

我相信这种方法会给你一个相对强大的基线玩家,你可以开始添加协作策略等。

于 2013-04-21T13:17:19.380 回答
1

您可以使用控制理论实现最佳的植绒行为。我们可以首先将船舶的状态(位置和速度的向量)表示为变量 X。我们将使用 x 来表示与某个状态 X0 的小偏差。对于每个节点,围绕您希望各个船舶所处的状态进行线性化:

d/dt(X) = f(X - X0)

其中 X0 是您希望船处于的状态。f() 可以是非线性的(就像您的势场一样)。接近这一点,意志服从

d/dt(x) = 轴

A 是一个固定矩阵,您应该对其进行调整以实现稳定性。控制理论领域的大部分内容都告诉您如何做到这一点。对你来说,A 导致一个稳定的系统并且它快速收敛是非常重要的。您现在应该拆分 MATLAB 或 GNU Octave。您还应该阅读控制理论中的极点和拉普拉斯变换的含义。系统的极点(矩阵 A 的特征值)将表征船舶对任何类型扰动的响应、其稳定性和收敛速度。它还会告诉你船是朝 X0 移动还是围绕 X0 摆动。

有几种选择 A 的方法(由于游戏有限的物理特性,您可能无法完全控制 A),而无需自己进行大量分析。两种这样的算法是最优控制(您定义控制系统的成本与偏离 X0 的成本)和极点放置(您选择极点的位置)。

状态空间理论也适用于整个船群,偏离了当时每艘船所需的配置。如果系统是非线性的,您可能无法保证所有配置都是稳定的。

结论:

使用控制理论保证个体稳定性,根据周围的船只计算 X0,并添加一个势场以防止船只相互碰撞和卫星。

免责声明:

有几种表示状态空间系统的方式。这是最简单的,但在考虑开环系统时,您需要以不同的方式表达它(将 A 拆分为另一个“A”,为您提供物理系统和其他一些矩阵,为您提供控制参数)

于 2013-05-02T08:31:57.193 回答