数学建模竞赛中的序列决策优化:从动态规划到启发式搜索

📅 2026/8/14 5:56:12
数学建模竞赛中的序列决策优化:从动态规划到启发式搜索
1. 从“穿越沙漠”到“最优策略”一道赛题的深度拆解2020年高教社杯全国大学生数学建模竞赛B题题目是“穿越沙漠”。这道题当时在参赛圈里引起了不小的讨论有人说它“接地气”有人说它“坑多”也有人说它完美体现了数学建模从“理想模型”走向“复杂现实”的转变。作为一个带过好几届数模队、自己也从参赛者一路走过来的“老油条”今天我想抛开那些官方的解题思路从一个建模实践者的角度来聊聊这道题到底“怎么看”——它考的是什么难点和陷阱在哪里一个成熟的建模者应该如何思考和拆解它更重要的是这道题背后反映出的建模思维对解决现实中的规划问题有什么启发这道题描述了一个游戏化的场景玩家需要驾驶一辆吉普车用有限的初始资金在已知地图上从起点穿越沙漠到达终点。地图上有不同天气的已知区域晴天、高温、沙暴天气会影响车辆的耗油量。途中设有若干个矿山在矿山停留可以挖矿获得资金而资金可以在村庄购买物资主要是油料可能还有食物、水等基础物资。目标是最终到达终点时所拥有的资金量最大。这听起来像是一个资源管理和路径规划的混合问题。很多同学第一眼看到“数学建模”和“最优策略”可能会立刻想到动态规划、图论最短路径或者线性规划。但如果你真的只沿着这个思路一头扎进去很可能会在中期陷入僵局。这道题的魅力与挑战恰恰在于它用简单的规则构建了一个需要多层级、多维度综合决策的复杂系统。2. 问题内核解析不止于路径更在于资源与状态的耦合要真正“看待”这道题首先得拨开“穿越沙漠”这个叙事外壳看到它的核心建模内核。我认为这道题的核心是“多约束条件下带有状态转换和资源再生节点的序列决策优化问题”。### 2.1 核心决策维度时间、空间、资源与状态的交织这道题的决策变量远比一条简单的“路径”复杂。参赛者需要同时决定空间路径下一步去哪个点是直扑终点还是绕路去矿山或村庄时间序列在每个点停留多久尤其是在矿山挖矿天数直接关系到资金收入但同时也消耗着时间和资源。资源管理资金、油料、食物和水如果题目细化了生存消耗如何分配何时在何地补充何种资源状态应对遇到沙暴天气必须停留这个外部随机但题目中天气是已知的所以是确定性干扰或确定性事件如何纳入计划这几个维度不是独立的。例如决定去一个偏远的矿山空间决策意味着需要携带更多油料资源决策这需要更多初始资金或在之前村庄进行补给资源与空间耦合并且会增加在途时间可能遭遇不同的天气序列时间与状态耦合。而矿山挖矿的收益资金增加又能反过来支持后续购买更多资源。这种紧密的耦合关系是本题建模的第一个难点。### 2.2 目标函数的特殊性终点资金最大化目标函数是“到达终点时的资金量最大”。这带来了两个关键特性资金的时间价值在起点或早期获得的资金其价值高于晚期获得的等额资金。因为早期资金可以立即转化为油料等资源支持更灵活的路线选择甚至可能通过早期投资去矿山产生更多资金。这类似于金融中的净现值概念。资源的转换链题目中存在一条清晰的资源转换链初始资金 - 购买物资油、水、食物 - 消耗物资以移动/存活 - 移动至矿山 - 消耗时间挖矿 - 获得新资金。优化目标要求我们找到这条转换链上效率最高的“回路”。很多新手模型会忽略“资金时间价值”认为只要最终挖到的矿多就行从而可能设计出前期过于冒险、导致资源耗尽无法到达终点或者前期过于保守、后期资金充足但时间不够的无效策略。### 2.3 已知天气的意义从随机规划到确定性优化题目明确给出了整个游戏周期内的天气序列。这是一个非常重要的简化也是本题与真实世界决策的关键区别之一。它将一个随机动态规划问题Stochastic Dynamic Programming降级为一个确定性动态规划问题。我们知道未来每一天每个区域的天气这意味着不存在风险决策我们不需要为“可能”出现的沙暴准备冗余资源。我们知道沙暴何时何地发生可以精确地安排躲避或停留。计算复杂度大大降低状态空间从“天气状态×资源状态×位置状态”的乘积简化为仅“资源状态×位置状态”沿着一条确定的时间线演进。这使得使用相对精确的算法如改进的Dijkstra算法、动态规划求解成为可能。然而这并不意味着天气因素变得简单。恰恰相反因为天气已知模型必须极其精确地将天气对消耗的影响纳入每一步计算任何微小的误差都会在长序列决策中被放大。例如算错了一天高温区的耗水量可能导致计划中看似充足的物资在实际上路后提前耗尽。3. 建模思路的演进与典型陷阱回顾当年的解题过程以及后来与众多参赛队伍的交流我发现大家的思路大致会经历几个阶段每个阶段都有典型的“坑”。### 3.1 第一阶段图论最短路径思维最浅层的坑这是最直观的想法把地图抽象成图节点是起点、终点、矿山、村庄边权是两点间移动所需的基础消耗比如距离折算的油料。然后求一条从起点到终点的最短路径消耗最小。为什么这是坑因为它完全忽略了资金获取挖矿和资源补充村庄的动态过程。最短路径可能绕开了所有矿山和村庄最终资金就是初始资金减去消耗结果必然很差。它把问题过度简化了。### 3.2 第二阶段线性/整数规划思维中等深度的坑意识到需要同时考虑移动和挖矿后一些队伍会尝试建立线性规划或整数规划模型。例如定义0-1变量x_{ijt}表示第t天是否从i地移动到j地定义连续变量表示在各点的资源持有量以终点资金最大为目标以资源守恒、容量限制为约束。为什么这也会是坑理论上可行但实践上计算规模可能爆炸。时间T总天数可能长达几十上百地点数N也有十几个那么变量x_{ijt}的数量级是O(N^2 * T)对于整数规划来说求解极其困难。更重要的是这个模型框架难以优雅地处理“在矿山停留挖矿”这种动作——它需要将“停留”也建模为一种特殊的“移动”从节点i到节点i这会让模型变得笨重且不直观。### 3.3 第三阶段动态规划(DP)或状态空间搜索正确的方向但需优化这是解决此类序列决策问题的经典方法。将问题定义为一个多阶段决策过程状态(t, location, fund, fuel, food, water...)即当前时间、位置、各类资源存量。决策在当前状态下可执行的行动集合移动到相邻点、停留若在矿山则挖矿、在村庄购买资源。状态转移方程描述执行一个决策后状态如何变化。例如选择移动则位置更新时间1资源根据移动距离和天气扣除。边界条件起点状态已知终点状态要求位置为终点时间不超过总时限资源非负。目标在所有能到达终点的状态序列中找到终点资金最大的那条路径。这个思路在概念上是完美的但会遭遇“维数灾难”。资源资金、油、水都是连续或离散值很多的变量直接枚举所有可能的状态值计算量无法承受。### 3.4 第四阶段基于分层或降维的智能搜索实战中的有效路径在实际比赛中成功的队伍往往不会硬算完整的DP而是采用一些巧妙的降维和搜索策略时间-资源离散化与网络流思想将连续的时间线和资源量进行合理离散例如时间按天资金按最小交易单位油料按基础耗油量的整数倍。然后将问题转化为一个在“时间-地点”层叠图上的最大收益流问题。每个(t, node)是一个节点。移动消耗资源可以看作流的“损耗”挖矿获得资金可以看作从“矿山”节点产生流入“资金”这个虚拟资源的“源”村庄购买可以看作用“资金”流交换“物资”流。这样可以利用网络优化的一些思想来简化。关键决策点剪枝大部分时间其实花在移动上真正的决策只发生在少数节点矿山、村庄。因此可以先规划节点访问序列再细化序列间的移动细节。例如先决策一个顺序起点 - 村庄A - 矿山1 - 村庄B - 终点。确定了这个宏观序列后再在这个序列上做详细的资源调度计算。这大大减少了搜索空间。反向动态规划从终点倒推。思考“在到达终点前我至少需要多少资源”、“在离开最后一个矿山时我需要有多少资金才能支撑到终点并实现最优”。反向规划有时能更清晰地看到资源的“底线要求”从而正向规划时避免无效分支。启发式规则与算法结合例如一个非常有效的启发式规则是“除非万不得已否则永远保持前往最近补给点村庄的资源是充足的”。在这个安全规则下再去优化挖矿的时机和路线。可以先用启发式规则生成一个可行解再用局部搜索如模拟退火、遗传算法在访问序列和停留时间上进行优化。4. 模型构建中的细节魔鬼与实操心得把思路落地成可运行的模型和代码才是真正的挑战。这里分享几个我总结的、容易出错的细节和对应的处理心得。### 4.1 状态定义的粒度选择状态定义得太细计算爆炸定义得太粗模型不精确。一个折中的办法是进行分层状态管理。宏观状态用于路径序列搜索。只关心(当前节点, 当前资金量级, 当前主要资源短缺标志)。资金可以按百为单位离散化资源短缺标志可以是二元的如“油料是否低于前往最近村庄的安全线”。微观调度当宏观状态确定了一个节点序列后在这个序列上运行一个精确的调度子程序。这个子程序处理连续的时间、资源计算每天每刻的消耗精确判断计划是否可行并计算出该序列下的最终资金。这个子程序本身可以是一个沿着时间线推进的模拟器。### 4.2 资源消耗计算的精度天气对消耗的影响是乘数因子如高温区耗水×2。计算时必须注意跨区域移动如果从A到B的路径穿越了多种天气区域必须按路径比例分段计算消耗而不是简单地用起点或终点的天气来代表整段路。这是很多初版模型忽略的点。停留消耗在矿山挖矿、在村庄停留、在沙暴中停滞都会消耗食物和水如果题目设定。这部分消耗必须和移动消耗分开计算且同样受当地天气影响。整数与连续性油料、食物、水的消耗和购买通常存在最小单位。模型处理时是采用连续变量最后取整还是一开始就离散化需要统一。离散化更符合实际但可能使问题更复杂连续化简化计算但得到的最优解可能需要微调才能实际执行。### 4.3 村庄购买策略的建模村庄不是“资源无限补充点”。购买策略需要建模。购买价格题目可能设定统一价格也可能随供需变化。按统一价格处理是常规假设。购买决策的时机是缺什么买什么还是基于对未来路线的预测进行批量采购后者更优。在调度子程序中到达村庄时应根据后续计划去哪个矿山、挖几天、然后去哪计算出未来一段时间的总需求然后一次性购买充足物资直到下一个补给点或终点。这样可以减少在村庄的停留次数停留也消耗资源。资金与物资的转换效率这引出了一个关键计算资金的“能量密度”。即单位资金在村庄能购买多少“有效行动力”比如能支持行驶的公里数。这个指标可以帮助比较不同路线的潜在效率。### 4.4 算法实现与求解策略对于大多数参赛队完全精确的最优解是可望不可及的。因此设计一个能快速找到高质量可行解的算法至关重要。构建仿真器首先写一个快速、无错的仿真程序。给定一个决策序列包括在各地点的停留时间它能准确模拟出整个过程并返回最终资金如果中途失败则返回负无穷或一个惩罚值。这个仿真器是后续所有优化算法的基础。生成初始解用简单的启发式规则生成几个初始解。例如Rule 1: 直奔终点。Rule 2: 去最近的一个矿山挖到资金翻倍然后去终点。Rule 3: 采用“移动-补给-挖矿”循环从起点带足物资到矿山挖矿直到资源将尽去最近村庄补给再回矿山或去新矿山。使用元启发式算法优化以初始解为起点使用模拟退火(SA)或遗传算法(GA)进行优化。对于SA/GA决策变量的编码是关键。一个有效的编码方式是编码一个地点访问序列[S, V1, M1, V2, M2, ..., E]以及序列中每个非终点节点的停留天数向量。算法通过变异交换序列顺序、增减停留时间和交叉来产生新解并用仿真器来评价新解的好坏。禁忌搜索也是一个好选择它对于在离散的访问序列空间中进行局部改进非常有效。分层优化先固定访问序列优化停留时间这是一个相对简单的线性或非线性规划问题再优化访问序列。两者可以交替迭代。5. 从赛题到现实建模思维的迁移与启示“穿越沙漠”这道题之所以经典是因为它剥离了现实问题的复杂外壳保留了多资源约束、序列决策、状态转换的核心骨架。这种建模思维可以迁移到很多领域物流配送与供应链管理车辆有容量限制油料/载重仓库和客户点类似村庄和矿山补充/消耗行驶有时间窗和成本天气/消耗目标是最大化利润或最小化成本。本题的“资金-物资”转换链就类似于供应链中的“现金-库存”周转。项目资源调度多个并行的项目任务矿山需要不同技能的人员资源人员会疲劳消耗需要培训或休息村庄补给项目有奖金资金如何在有限的人力资源下安排任务顺序和时长使得总收益最大游戏AI与自动化策略很多策略类游戏如《文明》、《星际争霸》的经济运营阶段的核心就是资源采集、转换、军队建造、地图探索的序列决策优化。本题的求解思路可以直接为设计游戏AI的决策逻辑提供参考。这道题给建模者的真正启示在于面对一个复杂系统不要试图建立一个面面俱到、一次性求解的“巨无霸”模型。有效的策略是识别核心耦合关系找到那些牵一发而动全身的关键变量如本题中的资金、油料、路线。分解问题将问题按时间或逻辑层次分解如先定路线再定调度。简化状态空间通过合理的离散化、聚合、引入启发式规则将无限或巨大的状态空间变为可处理的范围。迭代与反馈建立一个快速仿真验证环境让优化算法能在仿真的基础上进行试错和学习。接受满意解在有限时间内找到足够好的“满意解”往往比追求理论上遥不可及的“最优解”更实际、也更重要。回过头看2020年的B题它更像是一个“建模方法论”的试金石。它考验的不仅仅是数学工具的应用更是对问题的理解深度、对模型的简化能力、对算法的设计技巧以及对“可求解性”与“精确性”的权衡智慧。那些能在三天内交出一份有合理假设、清晰模型、有效算法和稳定结果的论文的队伍无论最终名次如何都已经经历了一次完整的、贴近现实的研究过程锻炼。这或许才是数学建模竞赛最宝贵的价值所在。