548. Lux AI Season 2 | lux-ai-season-2
比赛仍在进行中,我还不确定最终会获得第1名还是第5名(不过根据最初几天的表现,我推测应该是第1-3名,对此我非常高兴!),但现在正是撰写总结的好时机,趁着我记忆犹新!
我开发的是一个基于状态规则的系统化机器人,没有完整的正向推演能力,但包含一些内部推演机制。使用TypeScript编写。早期曾计划与其他Screeps玩家组队参赛,但后来未能成行。
我的大部分工作都通过自我对弈完成,特别是在前几个月——当时我掌握了一些其他人尚未发现的技巧,希望保持优势。不过最终这些技巧都被其他人独立发现了!随着代理程序的每步运行时间不断增长,测试变得越来越困难,有些自我对弈游戏甚至超过20分钟。如果下赛季仍然保持1000步×3秒的配置,我可能会转用C++,因为后期我需要在8核机器上运行10多个小时才能获得有效数据。第1赛季的360步×3秒配置要友好得多。
总体而言,我认为整个赛季中大家的竞标都过于保守,但我不愿主动提高出价,因为这样会促使他人跟进。最终版本中我的出价设为41(因为观察到其他代理使用40作为上限)。竞标基于最佳位置模拟,并通过我的评分系统进行评估。我很少选择-1(放弃竞标),因为占据第二名极少被判定为优势。我将资源最大范围限制在工厂格4格内,注意到其他人设置得更远。我发现如果范围过大,我的链式采集经常停滞——也许应该在全部单位部署后基于敌方工厂距离来计算。虽然主要采用链式采矿,但也实现了非链式备用方案。
位置选择优先考虑同时拥有冰和矿石的优质点位:冰在1格内给予极大加分,超过2格则严重扣分,同时惩罚瓦砾和地图边缘位置。侵略性策略(我的工厂比敌方更接近关键资源)获得显著加分,其中冰资源优先于金属资源。
如果找不到理想的冰+矿石组合点,我会部署纯冰工厂或与纯冰工厂配套的纯矿石工厂,并通过金属和水运输者协调资源。我不确定是否见过其他参赛者使用金属运输者——我认为这比自行移动机器人更高效,因为纯冰工厂通常有多余电力。但对此并非百分之百确定。
采用基于状态规则的系统。每个机器人被分配特定"角色",每步生成最优行动序列。角色分为静态(如链式采矿)和动态两类。在决策依赖其他机器人目标时,采用最新信息(本 tick 或上一 tick 的数据)。所有机器人按固定顺序处理以保证稳定性。行动序列足够复杂时可填满动作队列(例如:移动到A点→挖掘瓦砾→返回工厂→拾取能量→挖掘另一处瓦砾)。
生成行动后会检查是否真正改变队列,若无变化则不提交。所有机器人执行统一的"启动"逻辑处理紧急任务:
安全逻辑共享:关键的 checkSafetyForAction 函数用于评估敌方可否在机器人返回前将其击杀。这比单纯计算返程所需能量更复杂,且从未完全完善。若判定"不安全"或即将不安全,机器人会忽略原计划,选择返厂充电或原地待命。
每步结束时进行解析处理:解决碰撞、重寻路、单位交换,验证拾取/传输指令避免浪费,并优化传输命令。最后设"紧急"推动逻辑处理极端情况。其他方案本应覆盖所有场景,但在拥挤环境中偶有遗漏。
机器人可转换角色:例如被过度拉离目标的清障单位转为战斗机器人;次要角色可被征用解决主要角色资源短缺。但这部分开发不足——常过度配置某角色后无法动态调整。例如:过度建造清障单位转为战斗,后又发现需要更多清障单位却未转回。
苔藓生长是最难平衡的部分,最佳策略常不明确。有人主张"仅在终局种植",但顶尖代理多不认同。我尝试在效率(避免100%时浇水,最小化 ceil(格子数/10) 的损耗)与电力需求、水资源状况间取得平衡。早期采用的终局推演帮助显著,但后期面对苔藓突袭时过于保守,常在终局持有过多水资源。
虽然不计划继续开发,但若重启会重点改进: