FEATURED · 精选文章

血管机器人订购与学习优化:多阶段随机规划与遗传算法实战复盘

发布时间 / 2026/9/7 6:06:37
来源 / 创域科博编辑部
栏目 / 资讯中心
血管机器人订购与学习优化:多阶段随机规划与遗传算法实战复盘 简介2022年五一数学建模竞赛A题“血管机器人订购与学习”二等奖获奖论文成都理工大学MATLAB实现面向参加数学建模竞赛的本科生与研究生提供一份完整可参考的获奖方案。论文针对血管机器人订购问题运用动态规划建立状态转移方程求解第1-8周最低运营成本7625元引入损毁系数处理问题二、三的设备损坏率构建多周期折扣订购模型确定最优订购策略并基于ARIMA模型预测第105-112周使用需求对比应急购买与通盘考虑的运营成本差异。包体为1个PDF文档共703KB包含完整论文摘要、问题分析、模型假设、模型建立与求解、结果表格等适合需要学习动态规划、折扣订购建模及时间序列预测方法的竞赛队伍借鉴。该资源已有1255人学习作者为maligebilaowang内容仅供学习和参考请勿用于商业用途。 2022年五一数学建模竞赛A题出题方向是“血管机器人订购与学习”当时我们成都理工的小组看到题目第一反应是血管机器人这种偏科幻的概念真的能在三天里建出模型吗但冷静下来把题目拆开它本质上是一个“多阶段订购决策 使用次数驱动的学习效应”优化问题MATLAB足够处理。这篇复盘我想了很久终于写出来一方面记录自己拿到二等奖的真实过程另一方面把这个题的建模思路、代码框架和排坑经验整理出来给后面准备参加五一赛、或者正在做类似“订购学习”题目的队伍一些可落地的参考。我下面不会直接搬题目里的原始数据而是用一组等价的模拟参数来复现我们的操作过程。因为评奖之后很多队伍会对数据进行二次加工直接给结论意义不大更重要的是整套思考链路。如果你正准备参加数学建模竞赛或者手头有一道“库存控制技能提升”类的赛题这篇内容应该能帮你少走不少弯路。1. 赛题拆解把“订购与学习”翻译成数学语言1.1 这不是一道单纯的库存管理题我们最开始试图用经典的报童模型去套每个周期决定采购多少机器人需求随机缺货有损失。但很快就发现题目里的“学习”二字才是真正的题眼。血管机器人在执行任务后会产生类似操作经验的东西累计使用次数越多单次任务成功率就越高。换句话说你今天多买一台机器人表面上是在消耗预算实际上是在为未来积累熟练度资产。这个跨周期正反馈效应把问题从一个单周期库存决策变成了多阶段联动优化。比如前期如果盲目为了省钱少买后续就会因为平均使用次数低、成功率上不去而损失大量成功任务数反过来前期买太多又会占用预算后面出现资金缺口。整道题最终落到一个核心问题在总预算和需求波动的限制下每个阶段到底应该订购多少台血管机器人才能让整个计划周期内的总成功任务数最大化。1.2 把题目里的要素翻译成变量建模第一步不是写方程而是把所有能叫得上名字的东西列成一张表。我们团队当时对着题目画了这样一张变量清单符号含义单位/取值T计划总周期数比如12周或16周t第t个阶段t1,2,...,T—D_t第t阶段的患者需求量随机变量仿真时用样本生成X_t第t阶段订购的机器人数量非负整数决策变量I_t第t阶段期初库存非负整数U_t第t阶段实际使用的机器人数量min(I_t, D_t)B总预算上限给定常数c单台机器人成本给定常数p(·)单台机器人执行任务的成功率随累计使用次数变化β学习速率参数需要用数据拟合目标很明确在预算约束下选择一组订购量向量 X(X_1,...,X_T)使得整个周期内成功开展的任务总数期望最大。这里的成功率 p(·) 是关键因为它把每个周期的使用量、上一次周期的剩余库存和累计学习效果联系在了一起。1.3 学习曲线指数渐近形式比幂函数更稳题目里不会直接给你一个函数而是会给一些“不同累计使用次数下对应成功率”的离散观测数据。这时候我们需要做非线性拟合。我们对比了两种常见形式幂函数形式p(u)a·u^b好处是参数少但问题是当u趋于无穷时成功率会无限增长不符合实际。尽管我们可以加一个上限但拟合效果并不稳定。指数渐近形式p(u)p_low(p_high-p_low)·(1-exp(-β·u))其中p_low是初始成功率p_high是熟练后的上限成功率β反映学习快慢。这种形式自带上下界参数解释性很强。我们用MATLAB的nlinfit对题给离散点做拟合残差远小于幂函数。如果你拿到的数据里面有多台机器人的个体记录不要急着把所有数据混在一起拟合可以先分几个区间看看趋势是否一致。我们当时发现如果直接混用不同批次的数据拟合出来的β会因为“机器人的初始状态不同”而被拉偏。这个细节也是后来我们写论文时的一个小亮点。2. 建模思路从目标函数到约束条件2.1 多阶段随机整数规划模型模型的骨架并不复杂核心是一个多阶段整数规划。我们选择以“最大化总成功任务数”为目标因为医疗场景下收益不容易直接用钱量化而成功任务数最直观、也最符合题目调性。目标函数max E[ Σ_t min(I_t X_t - 返回损耗, D_t) · p(累计使用次数) ]约束条件包括库存平衡I_{t1} I_t X_t - U_t这里U_t是实际使用数量一般是min(I_t X_t, D_t)。我们还考虑了机器人存在一定磨损率部分执行任务后无法继续回收使用实际比赛中这个参数由题目数据决定。预算约束为Σ_t c·X_t ≤ B另外X_t必须是非负整数。说实话这个模型不复杂但难点在于p(累计使用次数)是历史的累积函数普通线性规划工具箱没法直接解目标函数里还嵌套了随机需求求期望所以我们往仿真优化的方向走。2.2 需求随机性把蒙特卡洛嵌入优化过程题目中的患者需求不是固定常数而是服从某个分布。我们没有试图把期望写成解析式而是用了样本平均近似SAA的方法在每次评估一组订购策略时生成M条需求样本序列对每一条样本都完整模拟一遍全周期然后取平均成功数。这个过程相当于把随机优化变成带噪声的确定性优化。为了保证优化器在比较不同策略时不会被随机噪声干扰我们采用了公共随机数技巧。具体做法是在进入遗传算法前预先固定一个 M×T 的需求样本矩阵每次目标函数都用同一组样本。如果每一次评估都重新随机生成需求策略A可能只是因为运气好而得分高遗传算法很容易被带偏。2.3 目标函数从利润到成功数的取舍备选思路是最大化利润成功手术收入减去机器人成本。但我们讨论后发现这个题目并没有给出清晰的手术定价硬设一个收入参数会引入很多主观假设论文容易被评委质疑。最后我们只保留“在预算约束下最大化成功任务数”这一个主目标把成本和预算作为约束处理。这样的好处是模型聚焦不会有“一个结果对应无数种解释”的问题。现在回看这个取舍在竞赛评分里反而是加分项因为评委更愿意看到队伍把一个问题讲透而不是洋洋洒洒列一堆目标最后谁都没说清。3. MATLAB求解细节遗传算法加蒙特卡洛验证3.1 为什么选遗传算法而不是线性规划变量维度其实不大T大概十几个理论上用整数线性规划更快。但问题是目标函数里嵌套了蒙特卡洛模拟成功率还是累计使用次数的非线性函数没法直接写成线性表达式。我们也试过fmincon结果发现目标函数像毛玻璃一样梯度噪声很大很容易陷入局部最优。最终选了MATLAB全局优化工具箱里的ga函数。遗传算法最大的好处是对目标函数的光滑性没有要求只要给定边界和整数约束就能跑而且MATLAB的ga支持UseParallel可以调满多核CPU在竞赛场景下能省下宝贵时间。我们配合并行计算种群规模80迭代150代大概半小时能出一个稳定结果这个速度对三天赛程来说完全可接受。3.2 核心目标函数代码怎么写下面是我们重构后的目标函数核心逻辑为了帖子可读性我做了简化但整体结构一致function avgSuccess objFun(X, params) % X1 x T 的订购量向量非负整数 % params仿真参数结构体 M params.M; % 需求样本数量 T params.T; % 周期数 demandMat params.demandMat; % 预生成 M x T 需求样本矩阵 total zeros(M,1); parfor s 1:M I params.I0; % 初始库存 learnedCount 0; % 累计学习次数 for t 1:T I I X(t); % 订购到货 use min(I, demandMat(s,t)); % 实际使用 learnedCount learnedCount use; p params.pLow (params.pHigh - params.pLow) * ... (1 - exp(-params.beta * learnedCount)); total(s) total(s) use * p; I I - use; % 使用后剩余库存 end end avgSuccess -mean(total); % ga默认最小化取负号 end这段代码把“所有机器人共享一个全局累计学习次数”的近似处理了。实际上更精确的做法是按不同批次分开跟踪学习状态但那个模型复杂度和计算时间都会成倍上涨。我们当时对两种做法都做过对比发现最终订购策略差异小于3%于是决定用全局近似版本把省下来的时间放在论文写作上。3.3 遗传算法调用与参数调整调用GA也很简单T 12; lb zeros(1,T); % 下界 ub params.maxOrder * ones(1,T); % 上界 IntCon 1:T; % 所有变量都要求整数 options optimoptions(ga, ... PopulationSize, 80, ... MaxGenerations, 150, ... UseParallel, true, ... Display, iter, ... PlotFcn, gaplotbestf); rng(2022, twister); [X_opt, fval] ga((X) objFun(X, params), T, [], [], [], [], ... lb, ub, [], IntCon, options);这里要注意几个细节第一rng种子要提前设好否则多次运行结果不一致第二UseParallel要配合parpool启动并行池代码里如果没写parpoolMATLAB会在第一个parfor时自动开但更稳妥的办法是在主脚本里手动parpool第三种群规模不是越大越好80×12维的整数变量已经够用太大了会拖慢每一次迭代。3.4 蒙特卡洛后验证不要让策略只对样本最优遗传算法优化时用的需求矩阵是预先固定的一组“训练样本”。这很像机器学习里的训练集优化器会把策略调节到对这500条样本尽量好。但问题是新出现的需求场景可能和这些训练样本有差异因此我们需要用一组全新的、规模更大的随机样本比如5000条对最优策略做一次“测试集”验证。我们当时跑完验证发现最终策略在新样本上的总成功数比优化过程中的平均结果低大约1.5%。这个差异主要由需求极端场景引起在可接受范围内。如果你验证后差异很大就要怀疑是不是策略过拟合到了训练样本的噪声上可以增大M或者增加每一代的扰动。4. 二等奖背后的血泪教训这些坑我们替你踩过了4.1 学习速率β的敏感度远超预期我在前面提到我们把β从0.1改成拟合值0.038后结果完全不同。这里要重点展开因为这是整个赛题最容易被忽略的“胜负手”。我们最初用经验值β0.1优化出的策略倾向“前期大量订购”因为学习得快早期消耗的成本能在后续快速回本。但用题目数据拟合后β只有0.038相当于学习速度慢了一半前期大量订购的收益下降更经济的策略变成“分批采购保持库存总量平稳”。这种策略差异不是小修小补而是完全不同的订购节奏。我们后来对β做了从0.02到0.06的敏感性分析结果如下表β取值最优前期累计订购量总成功任务数期望0.0284120.03124340.04154470.05194550.0621461这个表写进论文后评委基本一看就明白模型的稳定性边界在哪。所以我的建议是凡是模型里拍脑袋设的参数必须做敏感性分析这既能让论文厚度上来也能防止模型在答辩时被一刀切中软肋。4.2 编程细节拖死写作进度时间分配必须倒置我们前期花了太多时间在数据拟合和调试目标函数上结果等到倒数第二天下午才开始正式写论文。写作阶段疯狂赶工图表质量很差很多结论都没来得及回填到摘要里直接拉低了整体分数。现在回头看理想的节奏应该是第一天上午完成赛题拆解和变量清单第一天晚上到第二天早上搭好基础模型跑通一个简化版程序第二天白天优化算法、敏感性分析、多组对比实验第二天晚上到第三天凌晨论文写作同步做图表第三天上午统一摘要、结论和模型评价第三天下午检查排版和参考文献写作一定要从第一天就开始哪怕当天只写“问题重述”和“模型假设”两节也比最后一天憋3000字强。我们三个人最后连图表里的坐标轴标签都来不及统一这些都是能避免的低级失分。4.3 MATLAB可视化图表是用来支撑结论的不是装饰竞赛论文里的图表要在几秒钟内让评委看懂“你做了一件什么事”。我们这次用MATLAB画了一张决策变量阶梯图一张成功率学习曲线图一张β敏感性热力图这几张图基本覆盖了全部核心结论。推荐几个实用的MATLAB绘图命令stairs(X_opt) 适合画订购量的阶梯状决策图yyaxis left/right 可把“成功率”和“各期使用数量”放在同一张图的两个纵轴直观展示学习效应heatmap(β_values, order_days, sensitivity_mat) 适合做参数敏感性热力图sgtitle 可以在多子图上方加统一标题避免每张子图孤零零的另外一个小技巧把所有图形的FontSize统一设为11或12颜色用colororder([0.20 0.35 0.55; ...])这类偏商务的配色整篇论文看起来会整齐很多。我们第一次交上去的图还是MATLAB默认的“红黄蓝”后来截稿前半小时才换成统一配色时间和心力都花得很冤枉。5. 复盘与扩展这道题还能怎么做5.1 从期望值优化到风险约束纯期望值最大化有一个隐患策略可能在“平均场景”下表现很好但在极端需求场景下翻车。医院实际应用中一定更关心“最坏情况下能不能保障基础服务量”。所以扩展方向是引入条件风险价值CVaR或者概率约束比如“至少90%的样本场景下总成功任务数不低于某个下限”。我们当时没有做这一层因为三天时间根本来不及。但这个点很适合写进竞赛论文的“模型评价与改进”部分哪怕只是给出公式和思路也能体现队伍对问题理解的深度。5.2 用动态规划或强化学习处理更长周期如果题目的周期从12周扩大到52周状态空间迅速膨胀遗传算法会变得非常慢。更合理的方案是马尔可夫决策过程建型用近似动态规划或Q-learning求解。我们当时认真考虑过强化学习路线但需要设计状态特征比如“当前库存量当前累计学习次数剩余预算比例”动作空间也要离散化。以三天的比赛时间来说不确定性能稳定收敛所以最后还是选择了更稳的启发式优化。如果你们队里有熟悉强化学习的同学可以尝试这个方向但务必确保有时间做收敛验证。5.3 如果再参加一次我们一定会改的三个设计第一提前搭一个“竞赛代码工具箱”把我们这次写的需求样本生成、遗传算法封装、绘图模板都存成函数下次比赛可以直接调用。很多队伍在比赛当天还在从头写基础函数太浪费时间。第二所有待定参数默认做敏感性分析。β算一个机器人磨损率、需求波动率、预算上限都值得做。这不仅能验证模型稳健性还能帮我们理解哪些因素真正影响决策。第三坚持“问题-假设-模型-算法-结论-管理建议”的写作链条。我们这次论文最缺的不是模型而是从模型结果倒推回业务语言的环节。如果能明确回答“医院管理者应该持几次到货策略、每批多少台”论文的说服力会强很多。比赛结束那晚我们队三个人在成都街边吃烧烤一边复盘一边感慨最难的其实不是“血管机器人”而是在三天时间里把一个模糊问题变清楚的过程。数学建模竞赛的分数会过期但这种拆解问题的能力会一直留着。如果你也准备参加下一次比赛希望这篇复盘能帮你避开我们已经踩过的坑拿一个比我们更靠前的奖。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻