首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有什么相关的人工智能技术来编程一群实体?

有什么相关的人工智能技术来编程一群实体?
EN

Stack Overflow用户
提问于 2013-04-21 03:49:05
回答 2查看 388关注 0票数 8

具体来说,我说的是这个竞赛的编程:http://www.nodewar.com/about

比赛涉及到在一个二维的世界里,你要面对一群太空船的团队。船只受到边界的限制(如果它们离开,它们就会死亡),而且它们必须不断地避开卫星(它们用重力把船拉进去)。目标是杀死对方的女王。

我试着设计了一些相对基本的技术,但是我觉得我好像错过了一些基本的东西。

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

对于这类游戏,有什么常见的技术(或者,最好是技术组合)吗?

编辑

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

代码语言:javascript
复制
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是连续的,而不是精确的)。

主要的问题是我的人工智能从不停留在游戏区域超过10秒,不飞离屏幕或撞上月球。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-21 13:17:19

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

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

票数 7
EN

Stack Overflow用户

发布于 2013-05-02 08:31:57

使用控制理论,你可以达到最好的植绒行为。我们可以首先将船舶的状态(位置和速度的矢量)表示为变量X。我们将使用x来表示与某种状态X0的小偏差。对于每个节点,在您希望各个船只位于的状态周围线性化:

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

X0是你希望这艘船所处的状态。f()可以是非线性的(如你的势场)。接近这一点,意志服从

d/dt(x) = Ax

A是一个固定的矩阵,你应该调整它来达到稳定。控制理论的很多领域都告诉你如何做到这一点。对你来说非常重要的是,A会导致一个稳定的系统,并且它能快速收敛。你现在应该打破MATLAB或GNU八度。你也应该阅读极点在控制理论中的含义,以及拉普拉斯变换。系统的极点(矩阵A的特征值)将描述船舶对各种扰动的响应、稳定性和收敛速度。它还会告诉你,船是朝X0方向移动,还是在X0周围摇摆。

有几种选择A的方法(由于游戏物理的限制,你可能无法完全控制A),而不必自己做很多分析。其中两种算法是最优控制(您定义了控制系统的成本与偏离X0的成本)和极点配置(您选择了极点的去处)。

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

结论:

运用控制理论来保证个人的稳定性,根据你周围的船只计算X0,并增加一个潜在的场,以防止船只撞上彼此和月亮。

免责声明:

有几种表示状态空间系统的方法。这是最简单的,但在考虑开环系统时,您需要用不同的方式来表达它(将A分割成另一个A,它给出了物理系统和给出控制参数的其他矩阵)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16127772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档