我的机器人参加2019年俄罗斯人工智能杯



碰巧的是,这个冠军赛对我来说是第一个我能当之无愧的地方,对此我并不感到羞耻,所以我决定现在也写这篇文章。我走到这个地方的道路:第13年的冠军排名1192,第17年的冠军排名241,第18年的冠军排名91,最后是第16(和第5) e在沙盒中)放在该位置上。

一般思想


我相信,在RAIC取得相对成功的主要原因之一是改变了编写策略的方法。

以前,我试图立即写一些大而复杂的东西,没有中间步骤,第一版只能在锦标赛开始后的两周内填满,但过去我不能一直分配它,而第一版只有在决赛之后才填满。 。

所有这些导致了一个事实,尽管其他参与者可以测试他们的生活策略,但我仍然没有一个现成的解决方案,尽管这是一个糟糕的解决方案。因此,当有可能填写时,事实证明所选方法无效或效果不佳,并且由于投入了大量时间和精力,因此无法从根本上进行更改。

因此,我决定这次我会做不同的事情。根据以前的参与经验,我注意到,尽管它非常原始,但启动机器人还是相当合理地编写,并且在开发它时,您可以缓慢地添加和测试新功能,并立即检查其他参与者的策略。尤其是我被说服在T1024 去年的文章中尝试这种方法

我还自己决定,方法越复杂,手中的效果就越差。例如,在可能进行穷举搜索的情况下使用遗传学是没有意义的,并且如果可以选择分类的选项较少,而是全部或更多,而遗传学则最好选择第一个选项。另外,通过阅读突击队的文章,我得出结论,针对任务的特定优化总是比常规算法更有效。

尽管如此,即使现在我迟到了三四天,直到我设法填写该机器人的第一个版本时,当时它们已经在沙盒中发动了战争。

我目前在做什么?我写了一个模拟器,从过去的锦标赛中学到了它的重要性。与去年的仿真器伪代码可立即获得的情况不同,今年必须从文档中读取所有机制。幸运的是,作为补偿,游戏机制并不十分简单明了,因此我没有任何特殊问题。

早期版本


因此,在我手中有一个现成的,虽然弯曲的,粗糙的模拟器,我要做的第一件事是弄清楚了闪避(闪避功能)。自从这次我决定采取尽可能简单的行动以来,逃避就变得尽可能简单-我们检查了9个方向的运动(4个轴向,4个对角线和直立位置),并查看该单元在哪个方向上受到的损坏最小。

该机器人的其余功能几乎完全像Quickstart一样。目标的指定也尽可能地原始-一连串的ifs为单位选择最合适的行动:向敌人,从敌人到急救箱,再到武器等。

令人惊讶的是,这种方法逐渐变得更加复杂,但并没有改变其本质,使它几乎可以在第一轮比赛之前就登顶(一旦机器人甚至在沙箱中排名第二),并且通常停留在前十名左右。

但是,这不可能永远持续下去,因此必须对机器人进行改进。但是,不知道如何改进以及如何改进,所有尝试更改策略中的内容的尝试都导致她失去了旧版本。进行了较小的更改,但仅此而已。

缺乏想法导致了这样一个事实,即在第一轮和第二轮中,我分别获得了29名和19名,尽管我进入了决赛,但很明显,必须彻底改变一些东西。在结局之前(和结局之后)进行了大量的重大更改。

我已经在锦标赛中期的某个地方尝试过尝试更智能的运动,但所有尝试均未成功。最初的想法是选择一个方向,使机器人被敌人击中的机会与敌人被机器人击中的机会之差最大。在这个实验中,我几乎所有时间都花在决赛上,结果为零。

因此,对于最终的多层次地图,该机器人原来是完全没有准备的。 if链在第1轮和第2轮的单级地图上产生了相对较好的结果,但结果证明不适合决赛的多级地图,我也没有用于复杂地图的导航系统,因为在简单地图上可以管理从启动代码开始的迁移。


— .


所有触发控件都在AimHelper函数中。

下文所述的所有内容都暗示目标是最靠近机器人的可见敌方单位。

武器只有三种,但是每种都需要使用自己的方法。最好只用机枪射击更多次,用手枪瞄准更好,然后从火箭发射器射击以对敌人造成更多伤害,而不是对您自己造成伤害,这一点很重要。

最初,根本没有瞄准目标,机器人只是瞄准了单位的中心。稍后,如果飞机处于不受控制的飞行状态(从跳板跌落或飞走),则可以预测其运动。为此,我简单地模拟了单元的运动,直到子弹可以飞行N个滴答声的距离等于到单元的距离。

在对启动的机器人进行测试时,他注意到他非常不愉快的习惯,不断跳来跳去,如果机器人始终瞄准敌人的中心,这会导致视线不断移动并且传播速度迅速扩大到最大。为了消除冲突,添加了一个代码,该代码检查用当前瞄准角击中的机会是否好于或等于用新瞄准角击中的机会,那么我们就不会更改瞄准点并且不会增加传播范围。

射击比较困难,启动机器人的主要问题之一是他没有检查自己是否会被爆炸碰到。由于某种原因,我最喜欢这三种武器中的任何一种,因此它是当务之急。有必要教机器人不要破坏自己。

编写了HitChance函数,该函数将设备的发射扇区划分为N射线,并检查每条射线是否与目标发生碰撞。另外,如果被击中,则检查爆炸的AOE(如果它是火箭发射器)。命中几率=射线或爆炸的命中次数/射线数。

这使我们能够确定袭击自己和敌人的静态机会,但没有考虑到敌人本人可以主动躲避。还有其他问题,例如,该功能未考虑到地雷的随机点火。

这足以对抗不那么狡猾的敌人,但要很好地躲避子弹,则该功能无法提供足够的结果。需要一种新方法。

HitPredict函数也将发射锥分为N射线,但是我们不进行重新投射,而是使用一种模拟,一次向一个方向发射一颗子弹,并检查敌人是否可以躲避。

为了检查躲避,还使用了躲避功能,该功能是机器人自动使用的,但是却大大缩短了仿真时间和微透镜的数量。事实证明,这种评估方法非常准确,但过于悲观。如果仅使用它,则机器人射击的机会很少。

在第一个版本中,该函数仅从0-1返回击中机会,后来又添加了目标的平均HP值的计算以及被击中击中的机会。

最后,两个功能一起工作。 HitPredict函数最多使用了四次,每个单元使用一次。计算每个功能的结果将转换为速度,这表明现在拍摄是多么有利可图/危险。价值观加起来。如果总值小于零,则拍摄被阻止。对于火箭发射器,速度必须大于零。

在一个盟友阻止发射或进入火箭发射器的AOE的情况下,可以更加自信地射击,您可以在知道他的盟友有时间躲闪的情况下向后开枪,或者对我们射击完全有益。例如,我们将失去一个单位,但是我们将立即取走两个单位。

对于火箭发射器,这种方法也很有效,在正确的时间一发子弹比在命中几率为零的两发子弹有效得多。在这种形式下,射门处于决赛阶段,因此排名第16位。

现在,在决赛之后添加的筹码。

精确瞄准:如果当前瞄准镜与所需瞄准镜之间的角度不太大,我们将瞄准镜瞄准数据速率,以免扩大传播范围。

信息角度为手枪:奇怪的是,芯片非常简单,但是以前没有想到。如果散布因子(散布/最大散布)大于0.6,则禁止射击,条件是在1x1模式下以3:1相对于武器CD射击的胜利百分比。将系数减小到0.3可以提供与参数0.6相同的胜利百分比。因此,最简单的优化之一被证明是最有效的优化之一。


可视化HitPredict函数的操作,保证命中的轨迹以红色标记。

导航


到导航结局为止,根本没有任何消息。使用了来自起始bot的稍微改进的算法,这通常就足够了。

因此,当复杂的卡片消失时,机器人很难。紧急编写了紧急BFS搜索算法,该算法仅通过图块即可查找路径,而无需考虑其物理可达性。为了使机器人通过找到的路径,使用了各种拐杖。所有这些工作都非常歪斜,有时甚至根本不起作用,但是该机器人仍然可以以某种方式使用武器和急救箱,而不是当场。

进入决赛后,导航功能得到了显着改善,据我的观察,它的行为甚至比具有更好路径搜索算法的许多参与者更有效。

工作原理:机器人在5x5正方形内(从机器人中心可以看到的位置)搜索距离最远的单元格,并遵循这一点。

然而,直到最后,它仍然是一个难以置信的拐杖代码,仅在最终地图上有效,而在其他更复杂的地图上却不适用。


发现diykstroy为绿色标记的路径。机器人遵循标有白色正方形的点。

移动和估计功能


在决赛之前,没有评估功能,而是使用ifs链,该功能按优先级将机器人根据给定条件设置为目标。例如,第一个是如果机器人没有一个,则搜索武器;如果我们受伤,则搜索一个急救箱,等等。
尽管它有些歪斜,但它在简单的地图上起作用,因为优先级变化非常大,并且没有考虑各种其他因素。

因此,仍然编写了评估函数。

主要参数
  1. 单位健康,最大的好处。
  2. . — , — .
    — , . (1 — / . ), , . , , .
  3. . , , .
  4. , , , .
  5. .
  6. , .
  7. .
  8. 如果我们能够用自爆击中敌人,那将是一大笔钱。


最后两个参数不在最后。

所有这些奖金都是针对每个滴答声进行计算,求和并求出平均值的平均值。此外,还存在针对每个方向计算一次的估计参数。

  1. 向最近的敌人前进的奖励。
  2. 获得最近的急救包的奖金。我们的健康状况越差,奖金就越多。
  3. 如果我们没有武器,可以使用最近的武器,或者使用优先级高于机器人的武器来获得奖励。
  4. 如果漫游器的数量少于其中两个,则奖励为转移至lootbox min。
  5. 如果我们比敌人更接近急救箱,则转移到离敌人最近的急救箱的奖励。
    最有趣的奖金。它是在决赛之后添加的。允许您防止敌方机器人受到治疗。根据观察,结果证明是相当有效的。

笔记

  • 模拟深度为30个刻度。
  • 没有模拟敌方机器人的行为。游戏非常动态,要充分预测敌人的动作非常困难,而且不是特别必要。避免疯狂的自杀可能很有用,但从未成功。
  • 为避免躲避子弹的问题,如果它们在野外,我们将模拟每刻100枚仿生子弹(例如在游戏中),否则将其降低到5。
  • 您可能会注意到没有应用衰减系数。也许这是一个错误。

旧的移动选项位于MoveHelperOld中,新的选项位于MoveHelper中。


我的机器人(右侧)保护急救箱

地雷


关于地雷需要分开告诉。如果最初它不是一个非常重要的游戏元素,那就应该挖掘关键点。Beta测试后,如果地雷被子弹或爆炸击中,则突然增加了爆炸地雷的能力。而且,有可能在同一刻里设置地雷并对其进行破坏。

就是说,如果您只花费两个滴答声,则可以随身携带任何敌方单位。敌人为我们的死亡获得了1000分,但是在拆除他的死亡时,我们获得了1000点以上的生命值。如果您重复两次,那么您很有可能获得胜利。

事实证明,此漏洞利用非常强大,以至于总成绩排名第15位的一位参与者由于神风敢死队而出人意料地滑入了决赛的第4位。

(不同之处在于,在总排名中,既有简单卡,也有复杂卡。在简单卡上,自杀效果更差。)

最后,该策略使用地雷,但不使用有意自爆。决赛之后,当争夺更多奖金时,添加了TryPlantMine2模块,该模块实现了演示程序。最初,由于代码中的错误,该模块并不是特别有效,但是在最新版本中,有可能修复所有问题,并且该策略立即开始急剧攀升。甚至她进入了前三名,但后来她有所下滑。

工作原理:如果我们处在允许您放置地雷的位置,并且可以发射不超过5个滴答声,我们将模拟三种选择:仅放下地雷,放一个地雷并射击,两个地雷并射击。对于敌人和盟友,我们使用相同的道奇功能模拟运动,在准备破坏之前检查它们是否可以跳出爆炸区域(不确定需要多少)。对于每种选择,请检查一下它们是否能从点上受益,如果我们处于亏损状态,它会破坏(因此即使知道他们将死,我们的两个单位和一个敌人,也可能被破坏,但我们仍然赢了)


自杀炸弹的影响

发现


简单的解决方案通常比复杂的解决方案更有效,但这有其局限性。通过这种方法,您可以达到很高的水平,但是当改进策略的潜力已经用尽时,如果无法进行根本性的改变来提高策略的强度,则将陷入陷阱。对于未来,您应该考虑某种中间选择。

结论


总的来说,我很喜欢这个冠军,尽管我对此有偏见,因为这是我第一次设法获得冠军。然而,即使不考虑我的主观感受,今年在更高层次上也实现了很多。

  • 这是第一次可以通过Telegram与负责技术部分的人员进行通信,该人员可以迅速回答所有问题,为此,他深表感谢。
  • 第一次,本地ranner中出现了一个普通的内置可视化程序。以前,要输出调试图形,您必须编写自己的图形。
  • 最后,在局域网中添加了“重复游戏”按钮,而不是麻烦且麻烦的工具Repeater。


当然,其中的缺点是对地雷的巨大利用。

我希望我在这个锦标赛中取得的成就不会是偶然的,并且下次我将至少能够保存一个位置,甚至能够更好地担任更高的职位(做梦没有害处)。

可以在github上查看机器人代码:github.com/silentnox/CodeSide

All Articles