具体来说,我在谈论本次比赛的编程: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是连续的而不是精确的)。
主要问题是我的A.I.永远不会在游戏区域内停留超过10秒而不会飞离屏幕或坠入月球。
答案 0 :(得分:7)
你可以通过向你的boids添加额外的转向行为和/或修改默认值来轻松地使boids算法玩Nodewar游戏。例如,您可以添加转向行为以避开月球,并为敌舰添加转向行为(排斥或吸引力,取决于您和敌舰之间的位置)。然后应该调整吸引力/排斥力的权重(可能通过遗传算法,彼此进行不同的配置)。
我相信这种方法会给你一个相对强大的基线玩家,你可以开始添加协作策略等。
答案 1 :(得分:1)
您可以使用控制理论实现最佳的植绒行为。我们可以首先将船的状态(位置和速度的矢量)表示为变量X.我们将使用x来表示与某个状态X0的小偏差。对于每个节点,围绕您希望各个船舶所处的状态进行线性化:
d / dt(X)= f(X - X0)
其中X0是您希望船舶所处的州。 f()可以是非线性的(如在潜在场的情况下)。接近这一点,意志服从
d / dt(x)= Ax
A是一个固定矩阵,您应该调整以实现稳定性。控制理论的许多领域都告诉你如何做到这一点。 A对您来说非常重要,A可以实现稳定的系统,并且可以快速收敛。你现在应该打破MATLAB或GNU Octave。你还应该阅读控制理论中的极点和拉普拉斯变换。系统的极点(矩阵A的特征值)将表征船舶对任何类型的干扰,其稳定性和收敛速度的响应。它还会告诉您船舶是朝X0方向移动还是绕X0振荡。
有几种方法可以选择A(由于游戏的物理特性,你可能无法完全控制A),而无需自己进行太多分析。两种这样的算法是最优控制(您定义控制系统的成本与偏离X0的成本)和极点放置(您选择极点的位置)。
状态空间理论也适用于整个船队,偏离每个船舶在那个时间点所需的配置。如果系统是非线性的,您可能无法保证所有配置都是稳定的。
结论:
使用控制理论来保证个人的稳定性,根据你周围的船只计算X0,并添加一个潜在的场地,以防止船只碰撞到彼此和卫星。
声明:
有几种表达状态空间系统的方法。这是最简单的但是在考虑开环系统时你需要以不同的方式表达它(将A分成另一个'A',它给你物理系统和一些其他矩阵,它们给你控制参数)