☰
数学建模国赛B题备赛指南:优化建模与求解实战
2026/10/2 20:03:49 网站建设 项目流程

1. 备赛思路与B题定位:先把手感练对

数学建模国赛(CUMCM)到了备赛第三阶段,很多人会陷入一种状态:题刷了不少,论文模板背熟了,算法库也装了十几个,但拿到新的B题还是容易慌乱。我自己的体会是——问题不在“做得少”,而在一直没有建立一套稳定的建模抓手。尤其B题,它和A题、C题的气质完全不同,如果你还在用解A题的那套方式解B题,大概率会吃亏。

B题在国赛里通常被定位为“优化/决策类”题目,核心特征是:给出一个具体的现实场景,人为制造一个需要统筹调度的冲突,然后让你在资源有限的前提下拿出最优方案。它不是单纯考你算法多牛,而是考察你能不能把现实问题翻译成数学模型,再把模型跑出可用结果。换句话说,A题考物理机理,C题考数据挖掘,B题考的是运筹优化和建模功力。

这篇文章我想把这段备赛期的经验完整梳理一遍:优化模型该怎么拆解、历年B题有哪些套路可循、求解工具怎么选最省力、实战中哪些坑我替你踩过了。如果你正在备赛国赛,尤其是对B题的方向感不明朗,这篇应该能给你一个清晰的坐标系。

2. 优化模型的底层拆法:三个环节定生死

优化模型的建模范式并不复杂,核心就三件事:决策变量、目标函数、约束条件。但越是基础的东西,越容易被练偏。很多队伍拿到题目就开始套算法,粒子群、遗传算法一起上,结果连决策变量都没定义清楚,这种论文评委一眼就能看穿。

2.1 第一步,先把决策变量从题目文字里抠出来

决策变量是你能够“拍板”的量。比如题目说“安排生产计划”,那决策变量就是每种产品生产多少;题目说“设计运输方案”,那决策变量就是每条路线运多少货。听起来简单,但B题的狡猾之处在于,真正的决策变量往往被现实描述层层包裹。

我印象里有一道启发很大的题是关于“碎纸片拼接”的——表面看是图像问题,但本质上是排列决策,你真正要确定的变量是每张碎纸片应该排在哪个位置。另一类是历年都爱的“资源配置”,看起来变量很多,但核心决策通常只有“做还是不做”“分配多少”这两类。备赛时一定要养成一个习惯:拿到题之后,先用三句话把题目里的决策行为说清楚,写不出这三句话,说明题目还没读透。

另外提醒一句,决策变量不一定都是连续的。整数变量(比如是否选择某个方案)在B题里非常常见,它直接决定了模型是线性规划还是整数规划,也决定了求解难度。很多队伍栽在把整数变量当连续变量处理,最后得出“生产0.6辆车”这种可笑的结果。

2.2 第二步,目标函数不是越多越好,要学会归一和取舍

目标函数是你评判方案好坏的标准。B题的目标无非三类:最大化收益、最小化成本、最小化时间/距离。但在真实题目里,往往多个目标同时存在。比如既想分配最公平,又想总时长最短;既想利润最大,又想让设备闲置率最低。

这不意味着你要把所有目标硬塞进一个函数里。我的经验是:先厘清主目标和辅助目标之间的关系,通常可以用“多目标转单目标”的方式处理,最常用的两种手段是加权求和和约束转化。

加权求和很好理解,但权重怎么定是个大坑。没有依据的拍脑袋权重,评委一眼就能识破。更稳妥的做法是:把次要目标转成约束,比如“在总成本不超过某个预算上限的前提下,最大化总收益”,这样不仅模型更干净,求解也更稳定。如果你真的需要多目标分析,可以考虑用帕累托前沿的思路,但在国赛论文里,能把单目标讲透已经胜过多数队伍了。

还有一个容易被忽略的点:目标的量纲问题。收益是元,时间是分钟,覆盖面是百分比,量纲不一样直接相加毫无意义。所以无论用什么方法合并目标函数,都要先做标准化处理,这是新手最常忽略、评委最爱挑的细节。

2.3 第三步,约束条件要穷尽,但也要学会“弹性”

约束条件是B题建模的胜负手。因为变量和目标函数往往比较容易想到,但约束条件一不全,整个模型的小题大做就被看穿了。

B题的约束大致有几种:资源上限约束(比如机器总工时、预算总额、人员数量)、逻辑关系约束(比如选了A就不能选B,属于0-1互斥)、平衡约束(比如每个服务点必须被覆盖一次)、需求满足约束(比如每个客户的需求量必须被满足)。

在列约束时,我建议从四个角度逐一盘查:资源、需求、逻辑、环境。资源是题面上给的;需求是保障对象提出的;逻辑是场景本身的先后或互斥关系;环境是指边界条件(比如距离限制、速度限制)。四类都过一遍,约束基本就全了。

但“全”不等于“死”。很多约束带有现实弹性,比如“尽量在时间窗内送达”和“必须在时间窗内送达”就是两种约束。后者是硬约束,必须满足;前者可以用罚函数或者软约束的方式处理。好的建模者是知道什么时候该把约束写死、什么时候该留出松弛余地的。过度理想化的建模在评委眼里等于脱离实际。

3. 历年B题核心套路:五个经典年份逐个拆

接下来这部分是我实际备课值最高的部分:从历年B题里选五个有代表性的题目,看看它们的命题风格有什么变化、核心优化结构是什么、解决路径有哪些共通之处。如果你没有完整做过这些题,强烈建议按这个思路去复盘一遍。

3.1 太阳能小屋设计(2012年):组件选择与排布的整数规划

2012年B题是“太阳能小屋的设计”,场景是让你在给定屋顶形状上安装光伏电池,目标是在成本约束下最大化发电收益。决策变量是“选哪类电池”“每个电池装在哪块区域”,这是一个非常典型的整数规划与组合优化问题。

这道题当年翻车率特别高,原因是很多人陷入“组件选型”的细节里出不来。其实仔细拆一下,本质就是:备选电池型号几十种,屋顶区域若干块,每块区域只能装一个型号,但可以装多块。你要决策的是每块区域的选择和排布方式。约束关键在几何空间的不重叠、逆变器容量匹配、预算上限。

这道题给后面的B题立下了一个基调:现实场景+离散决策+多资源约束。备赛时做这一题的价值不在于得到一个最优铺设方案,而在于学会怎么把“选型搭配”类问题抽象成整数规划模型。

3.2 小区开放对道路通行的影响(2016年):评价+仿真+优化的三段式

2016年B题“小区开放对道路通行能力的影响”,这是一道很典型的评价与决策结合题。它要求你建立评价指标体系,然后基于指标体系对不同小区开放方案做对比,并判断哪种开放策略最优。

这道题的精髓在于:它不是直接给你一个目标函数让你优化,而是让你先定义“道路通行能力”的综合评价指标,再用这个指标作为优化的依据。很多队伍在评价部分就输了,因为权重确定得毫无理由,或者指标之间相关性没处理。

做这道题的最大启发是:当题目没有一个显式的优化目标时,你要想办法构造一个核心量化指标,把模糊的“影响程度”变成可比较的数值。后续所有方案优化都以这个指标为目标函数。这是B题区别于其他题型的一个重要分支——评价型优化。

3.3 “拍照赚钱”任务定价(2017年):定价策略与匹配调度

2017年B题是“拍照赚钱”APP的任务定价问题,非常贴近互联网众包场景。背景是平台发布任务,会员做任务拿赏金,但任务在不同区域的完成情况差异很大,你需要设计一个更能促进完成率的定价方案。

这道题的核心建模点有两个:第一,定价模型。任务价格应该和位置、密度、任务难度、周边会员活跃度强相关,这本质上是一个回归预测问题,但要多考虑经济学的供需关系;第二,任务和会员的匹配与调度,这是一个分派的优化问题,也就是经典的指派模型变体。

这道题对备赛的启发是:B题不局限于纯运筹学,它会把预测(机器学习)和优化(运筹)结合起来。建模比赛中处理这种题的正确姿势是:先做数据挖据和特征工程得到“基准定价”,再用优化模型做“任务调度与调整”。2017年之后,B题对数据处理能力的要求明显上来了,再也不是纯靠线性规划就能打天下的时代了。

3.4 穿越沙漠(2020年):时序决策与多阶段动态规划

2020年B题“穿越沙漠”,是我个人认为近年来最有区分度的一道题。它的场景是玩家要在多天里穿越沙漠,每天决定扎营、挖矿、Water补水、移动,目标是在存活的前提下最大化最终资金。

表面看这是个游戏策略问题,但本质是多阶段、动态、不确定决策问题。天气有随机性但又有规律可查,路线选择受水和食物储量限制,每天的决策之间相互影响。它考察的核心是你能不能把一个动态过程用状态转移的方式建模出来。

我当时备赛时模拟过这道题,最深的感触是:贪心思路在短周期内有效,但一旦天气序列拉长,贪心会引发后期崩盘。你必须用动态规划或者基于状态空间的搜索方法,把每天的策略选择建模成状态转移。这种题让只会套标准模型的人直接原形毕露——它要求你真正理解“优化”是迭代推演出来的,而不是套一个公式解决的问题。

3.5 城市应急医疗中心选址(2022年):覆盖模型与多目标权衡

2022年B题关于“应急医疗中心选址”,可以视为B题中“选址-分配”类问题的典型代表。这类问题的原型是经典的“集合覆盖模型”或“最大覆盖模型”:在候选点里选若干个位置建中心,要求应急响应时间最短、覆盖需求最大化,同时考虑建设维护成本。

这道题的好玩之处在于它天然就是一个多目标优化问题:响应时间要短,服务覆盖面要广,预算还要有限。每一年做这类题,几乎都能看到“多目标转单目标派”和“帕累托前沿派”的队伍在捉对厮杀。

从应试角度,我更推荐前者:把响应时间作为主要目标,把覆盖数量和预算作为约束。偏好清晰、求解方便、容易解释,评委看起来也不累。如果你想展示更高级的技术,可以用带权重的目标函数做几组对比实验,说明权重的敏感性,这比孤零零一个帕累托图要有说服力得多。

3.6 小结:B题的命题变与不变

把这几道题放在一起看,B题的命题风格变化脉络就清晰了:从早期侧重物理约束下的整数规划,到中期加入评价指标设计和数据预测,再到近年的多阶段动态决策和真实业务场景。变的是场景和复杂度,不变的是底层那套“决策变量-目标-约束”的优化骨架。

所以备赛B题最值钱的训练,不是刷遍所有算法,而是练好两件事:第一,拿到任何场景都能快速识别决策变量和约束结构;第二,遇到非标准问题时,能把它转化为自己熟悉的模型或算法的组合。把这两件事练到肌肉记忆,B题就不存在“没见过”的恐惧了。

4. 工具选型与求解实战:别让算法拖后腿

模型建得再漂亮,解不出来或者解得太慢,在国赛三天节奏里都是致命的。所以工具选型和求解策略要提前定型。我的建议是:能调用现成求解器就不手写算法,能精确就不启发式。这个原则看起来保守,但在比赛高压下最稳。

4.1 线性与整数规划:MATLAB + YALMIP + Gurobi 的组合拳

如果你的模型最终落到线性规划或整数线性规划(这也是B题最经常的落点),我非常推荐这一套组合:MATLAB负责数据处理和结果展示,YALMIP负责建模语法,Gurobi负责底层求解。

YALMIP的好处是建模语法极简,定义一个优化问题基本和数学公式长得一样,省去大量矩阵转来转去的痛苦,能让队伍把精力留在模型本身。Gurobi在整数规划上的求解速度和并发能力,目前综合体验最好,国赛这种中小规模的问题,多数情况下几秒到几十秒就能出最优解。

如果你的环境装不了 Gurobi,退而求其次可以用 MATLAB 自带的 intlinprog,也能解决大部分问题,只是在大规模整数问题上可能会慢一些。备赛阶段我建议就按这个组合练手,把 2012 年太阳能小屋、2017 年任务定价这类题重新解一遍,整个过程跑通,比赛时就不会在语法细节上浪费时间。

4.2 动态规划类问题:手写状态转移,多写注释

对2020年穿越沙漠这类动态决策问题,现成求解器帮不了太多忙,多数需要自己实现动态规划或递归搜索。这时候最重要的是代码结构清晰和状态定义准确。

我的建议是先把状态定义写成一整段注释放在函数头部,把每个变量是什么、取值范围是什么、递推关系是什么全部写明。因为这种题调试的时候特别容易绕晕,如果状态定义不明,写不两小时就得推翻重来。另外,能用记忆化搜索的就不要写纯递归,数据量稍大纯递归直接栈溢出。备赛时把这个套路扎实用好,到了赛场上你就能把更多时间留给“策略设计”而不是“代码debug”。

4.3 启发式算法:什么时候该用、什么时候别用

粒子群、遗传算法、蚁群算法这类启发式算法,在B题里确实有它们的用武之地,尤其是题目规模大到精确解算不出来,或者模型是非连续的、多峰的时候。但这些年我看了大量新手犯的错是:明明是几十个变量的整数规划,偏要用遗传算法去解,结果既没有全局最优的保证,又浪费了大量时间在参数调优上。

我建议的决策路径是:先尝试精确算法(Gurobi/intlinprog),如果规模确实导致求解时间爆炸,再考虑启发式。用启发式时一定要写明改进策略和收敛判据,切忌裸用一个几十行的基础版粒子群就交差,那在评委眼里属于态度问题。真实比赛里,B题能落到“必须启发式”的情况其实不多,绝大多数题都能通过约束削减或变量分解化简到精确可解。

4.4 实操中一定用得上的一页纸清单

  • 拿到题目先花2小时只做建模不写代码,把变量、目标、约束写清楚再动手
  • 模型先跑通一个小规模样例,再扩大到实际数据,别一上来就上全量
  • 约束条件的数目有意识地比参考答案多写几条,哪怕有些后来证明冗余
  • 所有求解结果必须附上“可行性校验”,否则你解的可能是错问题
  • 一组结果必须配一张图,B题论文中说“由图可见”比“结果表明”有说服力得多

5. 备赛中的常见坑与上手技巧

这部分内容,是我最希望当时的自己能早一点知道的教训。整理成几条,都是真实踩过或亲眼看过别人踩的。

5.1 坑:把B题当成纯算法秀

B题评委最怕看到的就是大篇幅介绍算法原理、贴公式推导,但从不解释这个算法为什么匹配这个场景。记住一句话:算法是工具,模型是语言,解决现实问题才是目的。论文里算法的篇幅应该控制在证明“为什么选它”和“结果靠谱”上,而不是科普算法本身。

5.2 坑:模型复杂度脱离数据规模

有些队伍把一个原本用线性规划几十秒就能解决的问题,硬拗成一个需要数小时迭代的复杂模型,最后求解时间不够,只能草草出一个未收敛的结果。建模要匹配数据规模,先做一个小规模验证,确认求解时间在可接受范围内再扩大,是国赛三天节奏里的基本素养。

5.3 技巧:模型的敏感性分析一定要做

国赛论文里,有敏感性分析不一定加分,但缺了它一定减分。敏感性分析的目的是证明你的结论不是凑巧出来的,而是稳定的。你可以做约束右端项变动几组,或者权重系数微调几组,记录目标值的变化幅度,指出哪些参数对结果影响最显著,这能让评委对你的模型产生信任。

5.4 技巧:结果可视化要服务于决策,不是装饰

B题论文里最受欢迎的可视化就是“方案对比图”和“优化前后对比图”。比如你设计了一个新的调度方案,配一张横轴是任务编号、纵轴是完成时刻的甘特图,比一千个字都有说服力。千万别把时间花在做花哨的三维曲面图上,如果你的三维图解释不了任何决策问题,就果断删掉。

6. 最后再分享一点备赛心态的体会

这段备赛期走过之后,我有一个很深的感受:B题其实不考天赋,考的是系统工程思维。你能够稳定地把一个模糊的现实问题拆成决策变量、目标函数和约束条件,再找到合适的工具求解,然后清晰地呈现整个过程,这就已经赢了大多数队伍。

如果你现在备赛时间还充裕,强烈建议把近十年的B题都通览一遍,不需要每道题都完整做,但至少要做到:拿到题30分钟内能说出这道题的决策变量是什么、核心约束有哪些、适合用什么求解策略。这个能力一旦建立,比赛时你的心态会稳很多。

最后再分享一个我常用的应试小习惯:比赛第一天晚上无论模型建到什么程度,都要抽半小时把“问题的重述”和“模型假设”写出来。这个看似不起眼的步骤,能让你在后续几天写论文时省下大量返工时间,同时它逼着你在一开始就把题目的边界想清楚。国赛比的从来不只是最后那个结果,而是你有没有能力把思路完整、稳定地呈现出来。把这个基本功练扎实了,你就是评委眼中的“靠谱队伍”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询