1. 项目概述与核心价值
最近在整理过往的参赛资料,翻到了2026年MathorCup(妈妈杯)数学建模竞赛B题《机器人竞技策略的优化问题》的论文。当时和队友熬了几个通宵,最终拿了个不错的奖项。这个题目非常有意思,它不像传统的纯理论优化问题,而是将机器人竞技这个充满动态和不确定性的场景抽象成了一个可量化、可求解的数学模型。今天,我就把我们对这道题的完整解题思路、模型构建过程、算法实现细节以及一些关键的“避坑”心得,系统地分享出来。无论你是正在备战数学建模竞赛的学生,还是对机器人策略优化、博弈论、智能决策算法感兴趣的研究者或工程师,相信这篇深度解析都能给你带来实实在在的启发和可以直接复现的“工具箱”。
这道题的核心,是让参赛者设计一个在特定规则下的机器人竞技策略优化模型。机器人需要在有限资源(如能量、时间)和复杂环境(对手行为不确定、场地状态变化)的约束下,通过一系列动作(移动、攻击、防御、采集等)来最大化自己的“竞技得分”。这本质上是一个动态环境下的多目标序贯决策问题,融合了运筹学、博弈论、强化学习等多个领域的知识。我们的工作,就是将这些复杂的现实问题,用数学的语言清晰定义,并找到高效、鲁棒的求解方案。
2. 问题深度解析与建模框架设计
拿到题目后,第一步不是急着写代码,而是要把问题“吃透”。我们花了大量时间反复阅读赛题描述,提炼出了几个最核心的挑战,这也是我们建模的出发点。
2.1 核心挑战识别
- 信息不完全与对手不确定性:机器人无法完全预知对手的实时状态和下一步行动。这要求策略必须具备抗干扰和适应性。我们不能假设对手是“傻子”,必须考虑其可能采取的最优或次优反制策略。
- 动态环境与状态空间爆炸:竞技场状态(如资源点分布、障碍物)、机器人自身状态(位置、血量、能量)、对手状态都在随时间变化。直接枚举所有可能的状态-动作组合,其计算量是指数级增长的,即所谓的“维度灾难”。
- 多目标与资源权衡:得分可能来源于击败对手、占领据点、收集资源等多个途径。如何在不同目标间分配有限的行动力和资源(例如,是优先进攻削弱对手,还是优先发育积累优势),是一个经典的多目标优化问题。
- 实时决策与计算效率的平衡:竞赛通常要求在规定时间内提交策略,这意味着我们的模型和算法必须在有限的计算时间内给出“足够好”的决策,而不是追求理论上完美但耗时过长的解。
2.2 整体建模思路:分层决策框架
为了应对上述挑战,我们没有采用单一的“大而全”模型,而是设计了一个分层决策框架。这个框架将复杂的决策过程分解为多个层次,每一层处理不同粒度的问题,大大降低了问题的复杂度。
- 战略层(宏观规划):以整个比赛周期或一个较长时间段为视角。主要回答“我们本局比赛的总体方针是什么?”例如,是采取“激进进攻”策略,还是“稳健发育”策略,或是“前期防守反击,后期一波决胜”的策略。这一层通常基于对双方初始实力、地图特性的分析,使用博弈论(如矩阵博弈)或高级启发式规则来确定。
- 战术层(中观调度):时间尺度缩短到几分钟或几十个决策步。主要回答“在当前阶段,我们应该优先完成哪些子目标?资源如何分配?”例如,判断当前是应该集体去争夺地图中央的关键资源点,还是分兵防守己方据点。这一层可以运用动态规划或整数规划来优化资源调度和任务分配。
- 执行层(微观控制):这是最细的粒度,对应机器人的每一个即时动作。主要回答“现在,我该向哪个方向移动多少距离?使用哪个技能?”这一层直接面对巨大的状态空间,我们采用了蒙特卡洛树搜索(MCTS)结合启发式评估函数的方法,在实时性要求下进行滚动优化。
这个分层结构的好处是显而易见的:战略层为战术层提供了方向,战术层为执行层划定了搜索空间,而执行层的反馈(如战斗损耗)又可以反过来修正战术和战略。它使得模型既具备了宏观视野,又能进行精细操作。
3. 核心模型构建与数学表述
在确定了分层框架后,我们需要用严格的数学语言定义每一层。这里分享我们构建的几个核心模型。
3.1 执行层核心:基于改进MCTS的实时动作决策
执行层是策略的“手脚”,其优劣直接决定瞬时对抗的成败。我们选择了蒙特卡洛树搜索(MCTS)作为基础,因为它特别适合这种信息不完全、动作空间离散且需要前瞻性的博弈场景。
1. 状态表示 (State S):我们将竞技场离散化为一个网格地图。一个状态S_t在时刻t可以表示为:S_t = {Map_Grid, P_self, P_opponent, Resources, Global_Time}其中:
Map_Grid: 二维数组,表示每个格子的类型(空地、障碍、资源点、据点等)。P_self / P_opponent: 字典,包含己方/敌方每个机器人的属性,如位置(x,y)、生命值HP、能量值Energy、攻击力ATK等。Resources: 地图上各资源点的剩余资源量。Global_Time: 比赛剩余时间。
2. 动作空间 (Action A):每个机器人在一个决策步可执行的动作是有限的,例如:{上移, 下移, 左移, 右移, 停留, 攻击(方向), 使用技能X, 采集(目标资源点)}。将多个机器人的动作组合起来,就构成了该决策步的联合动作空间。为了减少分支因子,我们引入了动作剪枝,例如,远离对手的“攻击”动作会被赋予极低的优先级。
3. 改进的MCTS流程:标准的MCTS包含选择、扩展、模拟、回溯四步。我们针对机器人竞技问题做了关键改进:
- 选择 (Selection):从根节点(当前状态)开始,使用UCT(上限置信区间)算法的变体选择子节点。我们修改了探索项,不仅考虑访问次数,还加入了基于启发式规则的动作先验概率,让搜索更快地聚焦到有希望的分支。
# 伪代码:改进的节点选择分数计算 def calculate_uct_score(node, parent_visit_count, c_puct): # node: 当前子节点 # Q: 该节点的平均模拟收益 # N: 该节点的访问次数 # P: 由神经网络或启发式规则给出的动作先验概率 exploitation = node.Q exploration = c_puct * node.P * sqrt(parent_visit_count) / (1 + node.N) return exploitation + exploration - 扩展 (Expansion):当遇到未完全展开的节点时,不是随机选择一个动作,而是使用一个轻量级评估函数对所有可能动作进行快速评分,优先扩展评分最高的前K个动作。这个评估函数基于简单的规则,如“距离对手的远近”、“能否攻击到对手”、“是否靠近资源点”等。
- 模拟 (Simulation/Rollout):这是最耗时的部分。我们不再进行完全随机的模拟直到终局,而是采用截断式模拟。即,只向前推演有限的几步(如5-10步),然后使用一个价值网络或精心设计的局面评估函数来预测这个“中间状态”的最终胜率期望。这个评估函数是我们模型的核心竞争力之一,后文会详述。
- 回溯 (Backpropagation):将模拟得到的收益(或评估函数输出的胜率)沿着搜索路径反向传播,更新路径上所有节点的访问次数和累计收益。
通过限定每次决策的搜索时间(如50ms),MCTS会在时间截止时,选择根节点下访问次数最多的子节点对应的动作作为当前最优决策。这种方法能在有限时间内,给出经过一定程度“深思熟虑”的决策。
注意:MCTS的搜索深度和广度是一对矛盾。在资源有限的情况下,我们倾向于“广度优先”而非“深度优先”。因为竞技场变化快,过于深远的推演可能因对手一个意外动作而变得毫无价值。我们的经验是,将推演深度控制在能覆盖一次关键技能冷却周期或一次资源刷新周期的步数内。
3.2 战术层核心:基于多目标优化的资源调度模型
执行层解决了“怎么打”的问题,战术层则要解决“打哪里”和“派谁去”的问题。我们将其建模为一个带约束的多目标优化问题。
假设在时间窗口[t, t+T]内,地图上出现了M个需要争夺的目标点(如资源点、据点),我们有N个机器人。定义决策变量:x_{ij} ∈ {0, 1}, 表示是否派遣机器人i前往目标点j。y_j ∈ {0, 1}, 表示目标点j是否被成功占领/采集。
我们需要最大化多个收益,例如:
- 资源获取总量:
Maximize f1 = Σ_j (value_j * y_j) - 战略位置控制得分:
Maximize f2 = Σ_j (strategic_weight_j * y_j) - 对敌方造成的潜在干扰:
Maximize f3 = Σ_j (disruption_j * y_j),其中disruption_j与派往该点的机器人战斗力以及该点对敌方的重要性正相关。
同时面临多种约束:
- 机器人能力约束:每个机器人同一时间只能执行一个任务。
Σ_j x_{ij} ≤ 1, ∀i - 任务需求约束:占领某个目标点可能需要至少
k_j个机器人同时到达。Σ_i x_{ij} ≥ k_j * y_j, ∀j - 路径可行性约束:机器人
i到达目标点j所需时间t_{ij}必须小于时间窗口T,且路径上无不可逾越障碍(可通过预先计算的路径距离矩阵判断)。 - 能量/血量约束:执行任务预计消耗的能量不能超过机器人当前存量。
这是一个典型的多目标整数规划问题。我们采用加权和法将其转化为单目标问题,即设定权重w1, w2, w3,最大化U = w1*f1 + w2*f2 + w3*f3。权重并非固定,而是由战略层动态调整。例如,当己方处于劣势时,w1(资源获取)的权重可能调高以寻求发育;当处于优势时,w2(战略控制)的权重可能调高以巩固胜势。
对于这个转化后的单目标整数规划,由于问题规模在竞赛场景下通常适中(N, M在10左右),我们使用了Gurobi或OR-Tools这样的优化求解器来快速得到最优或近似最优解。如果问题规模突然变大,则会退化为基于贪心或拍卖算法的启发式解法。
3.3 评估函数与收益量化:模型的“价值导向”
无论是MCTS中的局面评估,还是战术优化中的目标价值value_j,都需要一个统一的“价值导向”来量化。我们设计了一个综合评估函数V(S),用于评估任意状态S下己方的优势程度。
V(S) = α * Economic_Advantage(S) + β * Military_Advantage(S) + γ * Positional_Advantage(S) + δ * Time_Factor(S)
- 经济优势 (Economic_Advantage):己方累计资源与敌方累计资源的差值,经过归一化处理。资源包括金币、特殊道具等。
- 军事优势 (Military_Advantage):这是一个关键且复杂的部分。它不仅比较双方总生命值和总攻击力,还考虑阵容克制关系(如某些机器人类型对另一些有伤害加成)、关键技能冷却状态、以及集火潜力(我方多个机器人能否快速瞄准同一敌方目标)。我们用一个小型神经网络来学习这个子函数,输入是双方状态向量,输出是一个标量优势值。训练数据来自于对历史对局或自我对弈的模拟。
- 位置优势 (Positional_Advantage):衡量对关键地图区域(如视野高地、狭窄路口、资源刷新点)的控制力。通过计算己方单位到这些关键区域的加权平均距离(与敌方相比)来量化。
- 时间因子 (Time_Factor):考虑到比赛有时限,当剩余时间很少时,微小的经济或军事优势可能被放大为胜势。我们引入一个随时间变化的系数,例如
Time_Factor = (remaining_time / total_time)^λ,其中λ是一个参数,用于控制时间压力的敏感度。
权重α, β, γ, δ需要通过大量模拟对局进行调优,也可以让模型在训练中自动学习。一个好的评估函数,应该能准确反映“当前局面下,最终获胜的概率”。
4. 算法实现、集成与仿真测试
模型建立后,我们需要将其转化为可运行的代码,并搭建一个仿真环境进行测试和迭代。
4.1 仿真环境搭建
我们没有使用复杂的物理引擎,而是基于赛题描述,用Python自行开发了一个离散事件仿真器。核心组件包括:
- 地图管理器:维护网格地图状态,处理单位移动、碰撞检测。
- 单位管理器:维护所有机器人的属性状态,执行动作,计算战斗伤害(基于简单的攻击力-防御力公式,可能加入随机暴击)。
- 事件调度器:以固定时间步长(如0.1秒)推进仿真,触发资源刷新、技能冷却更新、胜负判定等事件。
- 交互接口:为我们的策略AI提供一个标准接口。AI在每个决策步接收当前状态
S_t,返回动作集合A_t。
这个自制仿真器的好处是高度可控、运行高效、易于调试。我们可以方便地记录每一步的状态、动作和收益,用于后续分析和模型训练。
4.2 策略AI集成
我们将分层模型集成到AI模块中:
class CompetitionAI: def __init__(self, strategy_params): self.strategy_layer = StrategyLayer(params=strategry_params) self.tactical_layer = TacticalLayer() self.execution_layer = MCTS_Planner(evaluation_func=V) def make_decision(self, current_state): # 1. 战略层更新(频率较低,例如每30秒一次) if self.should_update_strategy(current_state): global_strategy = self.strategy_layer.update(current_state) self.tactical_layer.set_weights(global_strategy) # 更新战术层权重 self.execution_layer.set_aggression(global_strategy) # 调整MCTS探索倾向 # 2. 战术层规划(频率中等,例如每5-10秒一次) if self.should_update_tactics(current_state): objectives = self.tactical_layer.solve(current_state) # 求解资源调度问题 self.execution_layer.set_current_objectives(objectives) # 为执行层设定子目标 # 3. 执行层决策(每个决策步,如0.5秒一次) actions = self.execution_layer.search(current_state) return actions三个层级的更新频率不同,战略层最慢,执行层最快,这样既保证了决策的响应速度,又赋予了策略宏观的适应性。
4.3 训练与调参:让模型自我进化
我们采用自我对弈(Self-play)的方式来训练模型,特别是优化MCTS中的评估函数V(S)和战术层的权重参数。
- 初始版本:使用基于规则的评估函数和人工设定的权重,让AI进行自我对弈,生成大量对局数据
(S_t, A_t, S_{t+1}, R_t, Done)。 - 训练评估网络:利用生成的数据,训练一个神经网络来拟合
V(S)。损失函数设计为均方误差,目标是让网络预测的V(S_t)尽可能接近从后续对局中回溯计算出的“真实”胜率期望(通过蒙特卡洛回报或TD(λ)学习计算)。 - 进化策略参数:将战术层的权重向量
[w1, w2, w3]和战略层的策略参数视为一个“策略基因”。让多个不同基因的AI相互对战,采用遗传算法或交叉熵方法,淘汰表现差的基因,保留并组合表现好的基因,产生新一代策略。如此迭代,让策略自动适应各种对手风格。 - 对抗性测试:除了自我对弈,我们还设计了一些“极端”对手策略进行测试,例如全图龟缩防守的“乌龟流”、不计代价疯狂进攻的“莽夫流”、专注于偷取资源的“盗贼流”。这有助于提升我们策略的鲁棒性。
5. 参赛实操心得与常见问题排查
在实际参赛的有限时间内,将理论模型转化为高分论文,需要很多技巧和取舍。以下是我们总结的关键心得和常见“坑点”。
5.1 论文写作与呈现要点
数学建模竞赛,模型和算法是核心,但论文是呈现给评委的唯一窗口。好的呈现能极大提升印象分。
- 摘要就是一切:摘要必须清晰、完整、独立地说明“针对什么问题,建立了什么模型,使用了什么方法,得到了什么结果,有什么特色和创新”。我们采用“问题概述→模型思路→方法简介→主要结果→结论创新”的五段式结构,并在最后一句明确指出模型的优势(如“实现了动态环境下的稳健决策”)。
- 图文并茂解释模型:对于分层框架、MCTS流程、优化模型结构,一定要画清晰的流程图或框架图。一图胜千言。图中要标明关键模块和数据流向。
- 伪代码优于纯文字:描述MCTS主循环、战术层求解等算法时,使用规范的伪代码。伪代码应突出逻辑结构,避免编程语言细节。
- 灵敏度分析与模型检验:这是体现模型稳健性的关键部分。我们设计了多组测试:
- 参数灵敏度:改变MCTS的搜索时间、战术层权重等,观察胜率变化,说明模型在参数合理范围内是稳定的。
- 环境扰动测试:在仿真中增加随机噪声(如指令执行有概率失败、对手模型加入随机性),测试模型的抗干扰能力。
- 对比实验:必须设置基线模型进行对比!我们设置了几个基线:1) 完全随机策略;2) 基于固定规则的贪婪策略;3) 仅使用MCTS但没有分层框架的策略。用表格清晰展示在不同地图、不同对手强度下,我方策略的胜率、平均得分等关键指标均显著优于基线。
| 测试场景 | 对手策略 | 我方策略平均胜率 | 基线1(随机)胜率 | 基线2(规则)胜率 | 基线3(单层MCTS)胜率 | | :--- | :--- | :--- | :--- | :--- | :--- | | 地图A,均衡开局 | 标准AI | 78% | 12% | 45% | 65% | | 地图B,我方劣势开局 | 进攻型AI | 62% | 8% | 32% | 51% | | 地图C,资源丰富 | 发育型AI | 85% | 15% | 60% | 70% | - 模型优缺点与推广:客观地分析模型的不足(例如,对超快节奏变化的反应可能滞后,评估函数对未见过的极端阵容可能失效),并提出可能的改进方向(如引入在线学习机制)。同时,说明该模型框架可推广到其他实时策略游戏、无人机集群任务分配、物流调度等场景。
5.2 实战编码与调试陷阱
- 性能瓶颈定位:仿真初期可能非常慢。使用Profiler工具(如Python的
cProfile)找出耗时最长的函数。通常,MCTS的模拟(Rollout)步骤和战术层的整数规划求解是两大热点。对于Rollout,我们通过简化评估函数、截断深度来优化;对于规划求解,我们为小规模问题保留精确求解器,为大规模问题准备了快速的启发式备用方案。 - 随机种子管理:仿真中涉及随机数(暴击、初始位置等)。务必固定随机种子(如
random.seed(42)),确保实验的可复现性。这是进行科学对比的基础。 - 状态同步问题:在分层模型中,如果战术层规划的执行周期内,执行层已经因为突发战斗改变了状态,可能导致决策不一致。我们引入了“决策锁”机制:当执行层检测到突发激烈战斗(如血量骤降)时,会立即中断当前的战术规划,并通知战术层基于最新状态重新规划。
- 评估函数的“盲点”:训练出的评估网络可能在训练数据分布之外的状态下做出荒谬判断。我们定期进行“对抗样本生成”,即故意构造一些奇怪但合法的局面,看评估函数的输出是否合理,并将这些样本加入训练集进行强化学习。
5.3 时间管理与团队协作
72小时的比赛,时间分配至关重要。
- 第一天(0-18小时):全力读题、讨论、确定建模方向。不要急于敲代码。必须全员对问题理解达成一致,并画出初步的模型框架图。这个阶段可以同时收集和准备可能需要的基础代码(如网格地图类、单位类)。
- 第二天(18-48小时):核心建模与实现。一人主攻仿真环境搭建,一人主攻核心算法(MCTS、优化模型),一人开始撰写论文的“问题重述”、“模型假设”、“符号说明”部分。晚上必须完成第一个可运行的初级版本,并进行简单测试。
- 第三天(48-72小时):迭代优化与论文冲刺。上午根据初级版本的运行结果,调整模型参数,修复重大bug。下午开始集中进行对比实验、灵敏度分析,并生成结果图表。晚上至截止前,全力撰写和润色论文,特别是摘要、模型建立、结果分析部分。最后留出2小时检查格式、错别字,并打包提交。
机器人竞技策略优化是一个充满魅力的交叉领域,它迫使你将抽象的数学理论与动态复杂的现实问题相结合。通过MathorCup这道赛题的锤炼,我们不仅收获了一个奖项,更掌握了一套解决复杂序贯决策问题的系统方法论——从问题拆解、分层建模、算法选型到实验验证。这套方法论的适用性远不止于一场比赛或游戏,它对于任何需要在不确定环境下进行智能规划和决策的系统,都有着广泛的参考价值。最关键的是,在有限时间和资源下,如何做出合理的简化与权衡,如何设计有效的评估体系,以及如何通过迭代测试让系统不断进化,这些思考过程本身,就是最大的财富。