返回列表

Some notes on a pure logic approach (lots of focus on domestic admin, not enough on fighting)

548. Lux AI Season 2 | lux-ai-season-2

开始: 2023-01-25 结束: 2023-05-08 游戏AI 数据算法赛

关于纯逻辑方法的一些笔记(重点关注内部管理,战斗方面不足)

作者:Philipp Kostuch | 发布日期:2023-04-26 | 得票数:16

下面的笔记结构并不严谨,只是我在实践中发现值得分享的一些要点(这与notebook本身的特点相符:虽然我希望能有充足的注释,但代码远未达到生产就绪状态,而且结构难以理解,因为它是三个阶段设计的混乱混合:第一次盲目提交时的遗留代码、当我以为可以运行20多个太阳能板和多个矿石/水源时的高度泛化代码,以及后来为了取得进展而放弃那种泛化的代码)。

- 竞价:出价非常高但不是动态的,我得出结论:预先出价30相对于更好的位置机会带来的收益来说是一个微不足道的成本(它代表的价值小于900能量,因此即使只有2个工厂,这个出价也只会让我落后不到10回合)

- 位置选择:

  • 主要分数评估出生点的资源状况,只考虑当前具有最高主要分数的出生点;如果我用完了自身有良好冰/矿石选项的出生点,那么拥有冰的友方工厂会被视为冰供应方(如果它们尚未成为供应方的话)(这使得一个有矿石相邻但没有冰的工厂成为一个有吸引力的高分选项);隐藏之前分配给我自己工厂的矿石/冰源,以及对手工厂2级范围内的所有矿石/冰源
  • 在这些选项中,次要分数决定最终选择:次要分数的关键因素是hosting矿的潜力(适用于有自己冰的位置:寻找半径20范围内最多的矿石源以便后续建矿);同时也会给那些将工厂置于资源和最近对手之间的位置给予重奖,使攻击该资源的成本更高

- 通用部分:

  • 广泛使用内部记录保存来跨回合存储知识/决策(全部保存在"permanent_record"中,这是一个非常庞大的字典,有些地方结构混乱)- 分为3个级别:全局、工厂和机器人(即每个机器人都有自己的条目来记录任务、目的地等信息)
  • 移动通过NetworkX路径查找完成,但边成本被操纵以严格避免某些地方(例如对手工厂、我的太阳能板停车位)并抑制其他地方
  • 通过"flight-log"避免友方碰撞:对未来所有回合的持久记录,提供任何未来回合已预留位置列表;任何指令都必须检查与飞行日志的一致性,如果指令可行并被提交,它会相应更新飞行日志(遗憾的是飞行日志清理功能实现不佳,例如当移动指令被打断时,匹配的条目不会被删除)
  • 在指定格子上执行的指令(例如消石、消青苔、攻击集结、防御网格停车)在执行期间会预留其分配的格子,但如果它们被打扰并中止任务,则会释放预留(即向其他机器人开放)
  • 战斗代码给出的指令会生成一个条目,阻止机器人在战斗指令完全执行前接收其他指令,以避免冲突指令(基于战斗指令总是比其他指令更重要的假设)

- 工厂管理:

  • 工厂由预设脚本管理(例如决定建造多少攻击机器人、何时停止采矿等),并尝试遵循概述的脚本发展阶段;
  • 所有生产都通过康加模式组织(这里完全没有允许非康加采矿的代码,这是一个严重的设计缺陷);
  • 动态工厂控制器主要对低于水和能量安全库存(SS)水平做出反应(通过增加水生产或关闭矿石生产直到能量水平恢复)
  • 水安全库存随时间增加,到700回合时每个工厂达到500水(为最终青苔生长预留200水 - 一旦所有工厂都达到此目标,所有冰生产将被关闭);矿石生产在650回合关闭(因为回报期是250回合,我希望在850回合主要攻击开始时拥有最大可用能量)
  • 工厂之间交易水和金属;任何工厂都可以发起水紧急求援,其他工厂如果可以的话会通过派遣卡车来响应(也有金属紧急求援,如果工厂的矿石康加模式损坏且没有合适的维修机器人);对于采矿/农场专业化工厂,这种交易定期进行,加上一些金属反向流动以平衡能量生产;除了紧急水交易外,还可以捐赠水以确保所有工厂间水水平大致相等

- 机器人管理:

  • 围绕大约8种不同角色组织机器人;通常在出生时分配,但会发生动态重新分类(例如,卡车通过重新分类轻型地形改造或防御单位获得,完成后交回该池);太阳能板在游戏末期开始时从工厂剥离,获得重型攻击或防御角色
  • 太阳能板/生产康加模式有3种内部角色(这种区分现在相当无意义,但在最初设计需要20+机器人超级工厂时很重要):它们只需移动到位置,然后从工厂控制器获得生产/太阳能发电指令
  • 每种非内部机器人类型都有一个控制器,通常在发现该任务类型机器人有空指令队列时触发:用于金属/水分配的卡车;损坏时移动太阳能板到生产康加模式的维修;地形改造器(给予一些优先位置,然后路径以减少最终攻击成本,500回合后当能量价值较低时一般2级格子;防御者(轻型和重型);重型青苔攻击者
  • 每个控制器都有一个充能选项,当移动到最近工厂的成本接近机器人剩余能量时触发

- 战斗管理:

  • 本土防御纯粹是能量管理练习;基础机器人(即坐在工厂上的那些)负责维持每个暴露机器人的能量安全库存;因此当它们因入侵者开始四处移动时,基地会补充它们,使其不会耗尽能量
  • 主要战斗代码恰当地命名为SD(自卫):当静止机器人有相邻威胁或移动机器人即将进入本回合威胁可到达的格子时触发(即相同或更高尺寸且能量更多的机器人);根据角色决定是远离还是踏上威胁;青苔攻击者特别倾向于远离被攻击工厂,希望引出防御的重型机器人;对于青苔攻击者,这会在游戏结束前30回合关闭,确保它们(必要时通过自杀)能够清除1级青苔(否则如果敌方重型机器人停在工厂内,这不会发生)
  • 清除青苔攻击者首先在4级集结;然后在固定回合(870)其中4个开始清除青苔;其余保持不活跃,直到执行此任务的机器人数量低于4个(任何参与SD的机器人不再被视为清除青苔);这样做是为了保护攻击部队的能量,避免它们互相妨碍
  • 攻击机器人分配到工厂时,优先考虑在重型机器人数量上超过防御者,然后平衡各工厂数量,并根据到目标工厂的距离进行调整(这实际上意味着我不总是向最近的敌方工厂派遣重型攻击者)

- 缺失的高价值功能

  • 一些无需康加模式即可采矿的代码,以提供更灵活的位置选择和更好地应对早期生产康加模式的损坏(甚至中期游戏中,可能也比有2个暴露重型的康加模式更好,因为它们仍然非常容易破坏)
  • 实际的防御代码:检测incoming重型,选择最近的太阳能板,让基础单位用所有可用能量充能该太阳能板,分离太阳能板并让它在入侵者到达工厂前在野外中迎击;末期游戏中对轻型也做同样处理,至少能减缓轻型造成的青苔清除;末期游戏中对重型防御者也一样(目前我通过在末期给一些重型地形改造任务来模拟,但如果它们能追逐入侵者会好得多)
  • 资源攻击代码:我在整个中期游戏中拥有显著的能量优势,应该利用这一点创建攻击者来破坏采矿(甚至采冰);鉴于全球化的攻击代码结构,理论上我应该能够集中火力攻击单个工厂,在500回合前用6+重型overwhelm它,甚至提前击毁一个工厂
  • 青苔攻击者应该定期重新分配:经常我发现6+个它们聚集在明显已被击败的工厂周围,而1级以上的工厂却还没有被清除青苔
  • SD中显然存在一个bug:游戏规则意味着只要你移动被邻居威胁的机器人,并且从不将其移动到更高能量机器人本回合可到达的格子,机器人就应该几乎是不死的;如果你有这种代码,唯一死亡方式就是严重拥堵(即没有此类格子存在)或能量耗尽(理论上你可以通过动态充能指令在风险出现时触发来避免)……然而,我的机器人像苍蝇一样死去,甚至在我告诉它们之前
同比赛其他方案