Robocode Rumble: 冠军的技巧

Robocode Rumble: 冠军的技巧

Rumble 冠军揭示胜利的机器人背后的策略

developerWorks
文档选项
将此页作为电子邮件发送

将此页作为电子邮件发送


最新推荐

Java 应用开发源动力 - 下载免费软件,快速启动开发


级别: 初级

Dana Triplett Barrow, 自由技术撰稿人

2002 年 12 月 03 日

Robocode Rumble 大赛结束了,胜利者已经诞生。他们都是谁,他们成功的秘诀又是什么呢?Dana Barrow 与编写出胜利的机器人的几位疯狂的科学家进行了专业的讨论,他还与 Mat Nelson 进行了讨论,Mat 透露了他为 Robocode 2.0 准备的东西。

Robocode Rumble 大赛开始后,来自世界各地的编程者运用他们的编程技巧竭尽所能创建最凶悍的 Java“机器人”,然后将这些机器人放在一个虚拟的竞技场来进行战斗。由于有着诸如 TheArtofWar、BienatorII、SandboxLump、BulletMagnet 和 Cake 这样的名字,这些机器人显得更加强悍,而且比通常的那些 Java 对象有意思多了。当战斗结束后,只有几个机器人还留在战场上。来自荷兰的编程者 Enno Peters 取得了最终的胜利。

由于很想知道是什么战略决策和日常编程习惯使获得冠军的机器人从其它普通的机器人中脱颖而出,我采访了 Peters 和其他四位获得胜利的开发者。我发现每位开发者都有其自己独特的方法,就像每个机器人都以自己的方式获得了胜利一样。

下面,Peters 和与他一同获得胜利的伙伴 Steve Coope、Daniel Johnsun、Arun Kishore 和 Manfred Schuster 讨论了对他们各自机器人获胜至关重要的设计要素。为了总结这次 Rumble 大赛,我还引用了 Mat Nelson 的几句话,他透露了对 Robocode 2.0 的一些计划。

Yngwie:预测器

Robocode Rumble 大赛的优胜者 Enno Peters 是位于荷兰北部的 Groningen 大学的一名 24 岁的人工智能专业的学生。他和他的朋友 Martijn Muurman 是在去年四月份收到一封关于将在 Groningen 大学举行竞赛的电子邮件后发现 Robocode 的。当了解这个游戏之后,两人都被迷住了。在 Yngwie 战胜对手赢得大学锦标赛之后,Enno 决定改进机器人,然后在 Robocode Rumble 大赛检验他的勇气。

Enno 解释说,虽然在设计 Robocode 机器人时要涉及到很多因素,但其中有一些是关键的。“首先,良好的雷达运转非常重要,因为机器人只会根据雷达弧度范围内敌方机器人位置作出更新。Yngwie 将决定哪些机器人离它近或危险,并尝试尽量频繁地对这些机器人进行有效的扫描。”Enno 的机器人还会“插入丢失的信息,从而获得尽可能精确的敌方机器人移动和动作的规律。”不可预知性也非常重要。“Yngwie 用不同程度的随机速度朝着敌方机器人的方向和[炮弹]发射过来的位置扫射,不过它也会在还有更多对手的时候试着躲到平静的地方去。”

排行榜

高级
冠军:Yngwie,由芬兰的 Enno Peters 设计
亚军:Vapour,由英国的 Steve Coope 设计
中级
冠军:Fermat,由新加坡的 Arun Kishore 设计
亚军:BigBear,由澳大利亚的 Daniel Johnsun 设计
初级
冠军:Ares,由德国的 Manfred Schuster 设计

Enno 提到,他的策略中有一些元素并非与众不同。“我知道我的机器人和其它机器人之间有很多相似之处。”很多机器人都“试图尽量有效地进行扫描,并保存敌方纪录,根据一对一游戏和混战游戏还有不同的模式来应对。”此外,“多数机器人都倾向于尽可能多地远离纷争、试图尽快消灭容易对付的机器人、根据敌方机器人能量和距离调整炮弹火力,并使用一些经过评定的预测器。”评定预测器的方法是,在预测器成功时对其增加一定分数,而在它们失败时减去一定的分数。经过一定时间,某些预测器就会显示出高于其它预测器的分数。这使得您能够针对敌方机器人选择使用最致命的预测器。

Enno 说,不同机器人之间的差异在于细节。举例来说,“我使用了一种 Predictor 类,它负责选择适量的炮弹火力,并为 Gunner 类提供一个射击的点。”如果敌方机器人能量比较低,预测器就会让 Yngwie 选择正好能够消灭它的适量火力,从而节省机器人珍贵的能量资源。Enno 的另一个成功的预测器让 Yngwie 能够不断地记录另一个机器人被击中后移动了多远以及往哪个方向移动。“当选用了这个预测器后,机器人会搜索类似情况的记录(例如敌方机器人的距离或角度),然后根据预测到的与当前敌方机器人位置的偏移距离开火。这个预测器对多数躲避炮弹的机器人都很有效。”

您可以在 参考资料中下载 Yngwie 的源代码。





回页首


Vapour:所有正确的移动

Steve Coope 的 Vapour 就是躲避炮弹的机器人之一。Steve 是一位地道的英国人,他是被一个也参加了 Rumble 大赛的朋友引入 Robocode 世界的。Vapour 的成功设计源自 Steve 创建他第一个名为 Silver 的机器人时作出的尝试和碰到的错误。“我花了大约一个月的时间来完成 Silver,它并不是很有效,但它让我对体系结构进行了一点点试验。”当对这个基本平台满意之后,Steve 开始试验机器人的移动情况,取得了“性能上的巨大飞跃和引人注目的特性。”新的机器人与原来的机器人相比改进非常大,所以 Steve 决定让其自成一派,这样 Vapour 就诞生了。

名称有什么含义?

“Yngwie 是根据摇滚歌星 Yngwie Malmsteen 命名的。他是世界上最快的吉他弹奏者之一,不过我更喜欢这家伙的地方是他夸张的风格和外貌。机器人 Yngwie 试着模仿他闪亮的胜利舞姿。” ― Enno Peters,芬兰
“Vapour 不会完全随机地到处乱走,它倾向于在一系列稍微快速的滑动转移到平静的地方去。我想起了烟雾颗粒的扩散和布朗运动,而‘Vapour’这个名字看起来非常适合这个概念。” ― Steve Coope,英国
“‘BigBear’这个名字是我随便起的……,我想我就是想起了一只巨大、可爱的泰迪玩具熊,它要砸碎其它的机器人!” ― Daniel Johnsun,澳大利亚 “我的第一个机器人名字叫作 Fibonacci,后来的名字有 Euclid、Euler,最后是 Fermat。我所有的机器人都是根据数学家来命名的,Fermat 是根据法国数学家 Pierre de Fermat 命名的。” ― Arun Kishore,新加坡
“由于已经有另外一个机器人叫作 Vendetta 了,所以我决定选另一个名字。我女朋友选择了希腊战神的名字,这就是 Ares 的由来。” ― Manfred Schuster,德国

Steve 将 Vapour 成功的一大部分归功于机器人的灵活性和试验带来的效果。“Vapour 很容易扩展,而且很容易在不同模式间切换,这使它很容易作出改变以及快速地在不同版本之间进行比较,同时没有什么风险。”和 Enno 一样,Steve 对细节非常在意。“因为有点象理想主义者,我非常热衷于全面调试,而这种调试过程非常冗长,所以整体开发过程非常缓慢,但我非常确信每件事都与设计目标非常接近,而且我不会在异常的情况下意外地发现有很多令人讨厌的事情还没有完成。”

在策略方面,Steve 说他力求达到的是简单而优秀的东西。“我希望将算法在概念上保持简单,即便真正的实现并非总是这么简单。”他还追求原创。“我希望 Vapour 完全是我的创作。”

Vapour 成功的另一个秘诀在于它对移动和目标定位的关注。“相对于多个对手的移动是通过一系列线性转向点实现的。每次到达一个转向点后,就可能会生成一些新的转向点;任何太接近竞技场外围墙壁的转向点都会立即被放弃,剩下的候选转向点会被测算,以找出哪个点与其它所有机器人的距离之和最大。Steve 在创建他自己的移动方案的过程中放弃了常用的反引力(anti-gravity)策略,他觉得这种策略会产生多余的问题,而这些问题又需要进一步编写代码来解决。

目标定位依赖于机器人短期学习的能力。Vapour 根据目标超过 160 个回合以上的所有移动情况的列表,试图确定对于目标的移动情况是否有规律可循。如果 Vapour 能够在目标的移动规律与相隔一定时间的同样的移动规律之间找出联系,那么产生最接近的匹配情况的时间间隔就可以作为目标运动的周期,前提是匹配情况足够好。否则,它的运动就会被认为是非周期性的。Steve 说,“不管是哪种情况,Vapour 都会重复将来的情况,通过重放目标过去的移动情况来预测它在每个回合所处的位置。”最好的目标定位方案是从一组可能的拦截方案中选取的。如果没有合适的解决方案,机器人会试图在下一回合中尝试增加找出解决方案的机会。

“最关键的区别在于,对于周期性移动的目标,Vapour 将回头查看目标的规律并向前重放其移动情况,然而对于没有明显的周期性的目标来说,Vapour 将简单地按时间顺序向后重放目标的移动情况,这似乎很可怕,但效果却出乎意料得好。Vapour 对于周期性强的目标定位非常准确,对于其它大多数机器人都不错,对于那些每隔一段时间就聪明地改变移动情况的机器人一般。”

您可以在 参考资料中下载 Vapour 的源代码。





回页首


BigBear:也称为“公羊”

Steve 在 Vapour 中建立的灵活性元素在 Daniel Johnsun 的 BigBear 中也得到了体现。Daniel 意识到没有一个完美的策略能够在竞赛中击败所有其它的机器人,他说,“所以我打算做的是,构建一个能够根据情况来转换策略的框架。”这样做还有另外的好处,就是让他能够容易地添加新的策略。

他的机器人的灵活性可以用其瞄准策略来证实。“每个 Enemy 对象都有一个 InterceptManager 类的实例,该实例存储很多不同的瞄准算法。”在扫描每个机器人之后, InterceptManager 都会:

  • 使用每个瞄准算法发射一枚“虚拟”炮弹(也就是说,炮弹没有真正被发射,但其位置仍然被监控,就像炮弹真的被发射了一样)。
  • 确定每个虚拟炮弹与目标的距离实际上有多远。

Daniel 解释说,“ InterceptManager 不断地更新每个瞄准算法的精确度的统计资料。这样,在向目标发射真正的炮弹之前, InterceptManager 将选择使用最精确的算法。这使得 BigBear 能够使瞄准算法适应不同的机器人,即便它们的移动模式在战斗中发生了变化也没有关系。”

BigBear 策略的其它方面并没有达到预期的效果。“BigBear 的躲避炮弹的移动策略事实上完全是一个意外,”Daniel 解释道。“我最初的策略是,假定炮弹按照循环瞄准的方法向我的机器人发射,然后根据这种假定来躲避炮弹。经过几次修正,我终于使躲避炮弹的策略按预期运行,但却发现这种策略在比较厉害的机器人面前没什么作用,这些机器人并不使用循环瞄准的方法。看起来我以前没有完成的代码作用还更好一点,所以我转向了以前的方法,并向整体移动策略增加了一些另外的随机元素。”

Daniel 设计的机器人的另一方面是,当它碰到其它优势明显的机器人时,会好斗地撞向它们,这样做的意图是让 BigBear 获得冲撞加分(Ram Bonus)点数。回顾比赛情况后,Daniel 承认,“我并不确信这样做能对最后分数增加多少,不过看着 BigBear 运转起来很有意思。”

您可以在 参考资料中下载 BigBear 的源代码。





回页首


Fermat:巧妙地躲避炮弹的机器人

Arun Kishore 是新加坡南洋科技大学计算机工程学院(School of Computer Engineering at Nanyang Technological University)的一名学生,他在设计机器人 Fermat 时也着重于移动和瞄准。整体上讲,他认为使得 Fermat 成功的策略与竞赛中很多其它的机器人的策略差不多。这些策略也就是“Secrets of the Robocode masters”系列(请参阅 参考资料)中描述的那些策略,如线性瞄准、循环瞄准和反引力移动策略。尽管如此,Arun 更加明确地强调,他为 Fermat 设计的移动算法是机器人胜利的关键因素。您对此好奇吗?请看看 Arun 的代码并对 DodgeBullet 类加以评价。


清单 1. DodgeBullet

class DodgeBullet
{
Point2D.Double source; // origin point of the bullet
Point2D.Double target; //target position of the
bullet
double velocity;       //velocity
double startTime;      //start time
int bot;               //id of the bot which fired
this bullet

DodgeBullet(double sourceX,double
sourceY,Point2D.Double target,double power,double
startTime,int bot)
{
source = new Point2D.Double(sourceX,sourceY);
this.target = new
Point2D.Double(target.x,target.y);
this.startTime = startTime;
this.velocity = 20-3*power; //velocity can be
determined from the energy drop value
this.bot = bot;
}

Point2D.Double getCurrentPosition(double time)
{
double distance = velocity*(time-startTime);
//uses linear interpolation to calculate the exact
position of the bullet
// uses the formula currPoint =
distanceFromStart*(targetPoint-sourcePoint)/(totalDistanceTravelled)
return new Point2D.Double(
source.x +
(distance*(target.x-source.x)) /
  getDistance(target.x,target.y,source.x,source.y), 

source.y +
(distance*(target.y-source.y)) /
  getDistance(target.x,target.y,source.x,source.y)
);
}
}

通过使用 DodgeBullet 类和一个对象清单,Fermat 能够在任意时刻存储关于向它发射的炮弹的信息。Fermat 能够猜测出敌方机器人是否发射了炮弹,方法是测量敌方机器人的能量减少量并检测这个减少量是否在 0.1 和 3.0 之间(包括这两个值)。机器人将计算发射出的炮弹的冲击点数、将所有检测到的炮弹添加到列表中,然后计算当前列表中每发炮弹的位置。

Fermat 通过识别炮弹的航行线路并施加垂直于该线路的动力来躲避炮弹(并避免贴到墙上)。由于机器人会计算所有五种发射炮弹策略的冲击点数,所以无论对方使用哪种策略它都能够避免被击中。要进一步了解关于 Fermat 的设计的细节,请参阅 参考资料

您可以在 参考资料中下载 Fermat 的源代码。





回页首


Ares:初学者的胜利

如果您刚开始用 Java 语言开始编写代码,而这些策略中有一些看上去过于复杂,那么请记住,用相对基本的代码来创建出强大的机器人也是可能的。Manfred Schuster 设计出了初级的机器人冠军,但他在开始研究 Robocode 之前从未编写过一行 Java 代码。他是通过试验 RamFire 之类的样本机器人开始的,然后从 Robocode 资源库(Robocode Repository)下载其它机器人来观察它们运行的原理。在为 Robocode Rumble 大赛创作 Ares 之前,他学习和试验的过程已经使他学到了很多东西,使他了解到如何设计出一个非常厉害的机器人。

“您可以在不发射一颗炮弹的情况下赢得一场一对一的战斗,”Manfred 说。诀窍就在于闪开所有敌方机器人发射的炮弹并获取生还者加分来提高分数。“为了实现这一点,我实现了四种移动算法。”如果一种算法对敌方机器人不起作用,他的机器人就会尝试用四种选择中的另一种算法。这些算法会让 Ares 旋转 90 度,并以随机的速度不断地前后移动不定的距离。这些移动会让使用模式匹配的对手很难击中 Ares。

尽管如此,躲避也只能让您达到这个程度。Manfred 解释道,仅仅在 10 个回合中生还并不足以让机器人成为冠军。胜利还需要更具侵略性的策略,他本着这一原则,将 Ares 设计成尝试用四种瞄准算法并选择命中率最高的一种算法。他还选用了一种大胆的策略,那就是让 Ares 在开火前向对手移动,从而提高命中率。这将增加机器人从击中敌人赢得的点数,但缺点是会让 Ares 很容易被其它机器人击中。Manfred 提到,尽管这种策略有时会让 Ares 输给其它机器人,他仍然觉得这种策略能够使机器人获得足够的分数,“从而使其跻身于机器人八强之列”。然而,他还是警告读者,这种策略要在竞赛中发挥作用会更加困难。

您可以在 参考资料中下载 Ares 的源代码。





回页首


结束语

那么,最后我要问,在设计一个赢得冠军的机器人的过程中,策略扮演了什么角色呢?这里所采访的大部分胜利者都暗示说,结合可靠的策略和创新精神让他们的机器人走到了胜利的一边。Enno Peters 在总结 Yngwie 的胜利时谦虚地说,“最后,运气占了最主要的成分。”

使机器人胜利的另一个因素是灵活性。Arun Kishore 将他编写机器人代码的过程形容为“与以往其它任何编程经历都不同”。“我以前大多数编程任务都需要我严守规范,编程者没有太多的自由。在 Robocode 的编写过程中,编程者必须有自己的想法,并将这些想法设计为适合机器人的策略,然后实现它们。这样做通常能让编程者获得更大的满足感,更重要的是从中获取更大的乐趣。”

Robocode 创始人 Mat Nelson 在准备推出 Robocode 2.0 时,依然用这种同样的获得乐趣的精神以及卷起袖子努力工作的热情鼓舞着自己。“我只为社区提供了一个框架,而他们取得了这么大的成就,远远超过了我的预料!”他激动地说。“他们创造了比我能够想象到的更复杂的机器人。”

Mat 目前正努力为这个游戏重新设计 API,还要增加几个新的特性。他想在 Robocode 2.0 竞技场中引入力矢量、各种机器人装甲强度和障碍物。最后,他还希望将游戏的代码公开。“我相信,我应该将它的代码公开,”他说。





回页首


参考资料





回页首


关于作者

Dana Triplett Barrow 是居住在佛蒙特州的一位自由撰稿人。您可以通过 dana@orange-atelier.com与 Dana 联系。


  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值