返回列表

9th Place Solution

645. NeurIPS 2024 - Lux AI Season 3 | lux-ai-season-3

开始: 2024-12-09 结束: 2025-03-24 游戏AI AI大模型赛
第九名解决方案 - Lux AI Season 3

第九名解决方案

作者: kuto 及团队成员

发布时间: 2025-03-18

竞赛排名: 第 9 名

首先,我要感谢所有组织本次比赛的人、所有参与者,以及我的队友 @kibuna @cnumber @kawattataido @yukiokumura1

以下是我们团队的解决方案。
GitHub 仓库:https://github.com/kuto5046/kaggle-luxai-s3

摘要

  • 基于顶尖队伍比赛结果的模仿学习
  • 选择高性能的顶尖队伍提交作品并进行两阶段微调
  • 采用 UNet 架构预测基于地图的策略和 SAP 概率
  • 估计未知的环境参数和隐藏状态
  • 使用最小费用流为每个单位分配动作
解决方案架构图

数据集

  • 第一阶段
    • Frog Parade (submission_id=42704976)
    • 7,935 局
    • 仅在获胜游戏中训练
  • 第二阶段
    • Frog Parade (submission_id=43276830)
    • 1,550 局
    • 在获胜和失败游戏中均进行训练
  • 混合不同策略(多个提交作品)的数据并没有显著提高性能。

感谢 Frog Parade 团队。


特征

  • 创建了 14 通道的地图特征和 16 通道的标量特征。
  • 将这些特征归一化到 -1 到 1 的范围,除了一些例外情况。
  • 标准化归一化标准(例如,OWN_UNIT_ENERGYUNIT_MOVE_COST 都表示能量值,并使用共同的尺度进行归一化)。
  • 应用镜像处理,使得主队的初始位置始终为 (0,0)。

地图特征 (14 通道)

地图特征示意图
变量名 描述
TILE_TYPE 当前瓦片的类型 (UNKNOWN = -1, EMPTY = 0, NEBULA = 1, ASTEROID = 2)
NEXT_TILE_TYPE 下一步瓦片的类型
ENERGY (估计) 瓦片上的能量量
NEBULA_ENERGY_REDUCTION (估计) 星云瓦片造成的能量减少
SENSOR_MASK 传感器可见区域
RELICS 遗迹节点的位置
POINTS (估计) 遗迹节点附近可以获得分数的节点
ENTROPY 估计的 POINTS 的熵
OWN_UNIT_COUNT 每个单元格己方单位的数量
OWN_UNIT_ENERGY 每个单元格己方单位的能量
OPP_UNIT_COUNT (估计) 每个单元格对手单位的数量
OPP_UNIT_ENERGY 每个单元格对手单位的能量
VISIT_COUNT 当前比赛中每个瓦片被访问的次数
SAP_AVAILABLE_AREA 可以使用 SAP 的区域

标量特征 (16 通道)

变量名 描述
MATCH_STEPS 当前比赛已进行的步数
MATCH_COUNT 当前比赛场次
TEAM_POINTS 团队获得的分数 (己方分数 - 对手分数)
TEAM_WINS 团队获胜的比赛场数 (己方胜场 - 对手胜场)
UNIT_MOVE_COST 单位移动的能量成本
UNIT_SAP_COST SAP 动作的能量成本
UNIT_SAP_RANGE 可以使用 SAP 的范围
UNIT_SENSOR_RANGE 单位的传感器范围
NEBULA_TILE_VISION_REDUCTION_MEAN 星云瓦片造成的视野减少均值
NEBULA_TILE_VISION_REDUCTION_SIGMA 星云瓦片造成的视野减少标准差
ENERGY_NODE_DRIFT_SPEED_MEAN 能量节点移动速度均值
ENERGY_NODE_DRIFT_SPEED_SIGMA 能量节点移动速度标准差
NEBULA_TILE_ENERGY_REDUCTION_MEAN 星云瓦片造成的能量减少均值
NEBULA_TILE_ENERGY_REDUCTION_SIGMA 星云瓦片造成的能量减少标准差
UNIT_SAP_DROPOFF_FACTOR_MEAN SAP 动作的能量衰减因子均值
UNIT_SAP_DROPOFF_FACTOR_SIGMA SAP 动作的能量衰减因子标准差

隐藏状态估计

每场比赛随机变化的未知环境参数和隐藏状态使用以下方法进行估计:

  • NEXT_TILE_TYPE
    • 从观察到的瓦片移动中估计瓦片漂移速度,并据此预测下一个瓦片状态。
  • ENERGY
    • 通过穷举搜索从部分观察到的能量地图中缩小能量节点范围,从而估计整体能量地图。
  • POINTS
    • 通过贝叶斯推断估计点数概率。
    • 将遗迹相邻瓦片初始化为 0.5,其他为 0.0。
  • OPP_UNIT_COUNT
    • 跟踪之前观察到的敌方单位的所有可能动作,以估计其存在概率。
  • NEBULA_TILE_VISION_REDUCTION
    • 基于踏上星云瓦片时观察到的单位视野变化进行估计。
  • ENERGY_NODE_DRIFT_SPEED
    • 准备候选漂移速度,并使用贝叶斯推断 refine 估计值。
  • NEBULA_TILE_ENERGY_REDUCTION
    • 从踏上星云瓦片时观察到的单位能量减少中估计。
  • UNIT_SAP_DROPOFF_FACTOR
    • 基于观察到的相邻敌方单位的能量值进行估计。

模型架构

模型架构图
  • 基于第 6 名 LuxAI 第一季解决方案,使用 UNet 架构 (链接)。
  • 输入
    • 地图特征 (14, n_stack, 24,24)
    • 标量特征 (16, n_stack)
    • n_stack 是输入过去多少步状态的参数,我们使用 n_stack=4。这意味着过去 4 步的状态作为特征输入到模型中。
  • 输出
    • 策略 logits (6,24,24)
      • CENTER = 0, UP = 1, RIGHT = 2, DOWN = 3, LEFT = 4, SAP = 5
    • SAP 策略 logits (1,24,24)
      • 该单元格中使用 SAP 的概率。
  • 模型层
    • UNet (编码器/解码器)
    • SAP 策略层
      • 使用残差卷积层预测 SAP 策略。
      • 通过在最后一层添加批归一化稳定训练。
    • 策略层
      • 将 SAP 策略与 UNet 解码器输出结合,并使用残差卷积层预测策略。

训练

  • 损失函数
    • policy → DiceLoss
    • sap policy → 自定义 Focal Tversky Loss (weight=0.1)
      • Sap 目标位于 (24,24) 地图上 (如果目标团队在 sap 位置则为 1,否则为 0)
      • 目标被掩蔽,因此只有 SAP_AVAILABLE_AREA 是训练目标,因为目标是稀疏的,并且采用 Focal Tversky Loss 来应对稀疏目标。
      • 设置损失权重为 0.1 以免抑制策略学习。
  • 训练设置
    • epoch=30
    • lr=1e-3
    • batch_size=1024
  • 数据增强
    • 沿 x 轴和 y 轴应用镜像。

动作选择

  • 使用神经网络预测两个基于地图的策略:
    • 策略 (6, 24, 24)
      • 动作:CENTER = 0, UP = 1, RIGHT = 2, DOWN = 3, LEFT = 4, SAP = 5
      • 在有效动作上应用 softmax 将 logits 转换为概率。
      • 如下所示概率性地采样动作:
      action = np.random.choice(range(6), p=policy)
    • SAP 策略 (1, 24, 24)
      • 预测每个单元格的 SAP 概率。
  • 通过最小费用流分配动作
    • 同一单元格中的单位倾向于采取相同的动作,因此基于单位策略使用最小费用流分配动作。
    1. SAP 动作分配
      1. 枚举在给定步骤中采样到 SAP 动作的单位 (SAP 单位)。
      2. 对于每个 SAP 单位,根据 sap 地图列出 SAP 位置候选,以及 sap 动作后的次佳移动动作及其概率。(以避免当单位周围 sap 地图值非常小时不必要的 sap)。
      3. 定义目标 sap 点 (x,y) 的成本为:如果是 sap 动作,cost = 1 - sap_policy[y,x] * policy[5],否则 cost = 1 - policy[action_idx]
      4. 通过使用最小费用流最小化总成本来为 SAP 单位分配动作。
    2. 移动动作分配
      1. 枚举在给定步骤中不是 SAP 单位的单位 (MOVE 单位)。
      2. 对于每个移动单位,列出所有可能的动作 (不含 sap) 及其概率值。
      3. 定义每个动作的成本为 cost = 1 - unit_policy[action_idx] 并为移动到已占用单元格添加惩罚成本。
      4. 通过使用最小费用流最小化总成本来为 MOVE 单位分配动作。
  • TTA (测试时增强)
    • 沿 x 轴和 y 轴应用镜像。

性能评估

可视化器 (基于 streamlit)

  • 检查特征估计结果。
    特征估计可视化
  • 检查比赛结果中的单位策略。
    单位策略可视化

自定义锦标赛评估

  • 修改 luxai_runner 以在锦标赛设置中显示胜率和 p 值。
  • 进行足够数量的本地比赛 (例如 100 局),仅当胜率显著优于现有最佳模型时才采用模型更改。
锦标赛评估结果
同比赛其他方案