2024国赛B题生产决策建模:期望成本与Python实现全解析 📅 发布时间:2026/9/8 22:54:55 👁 浏览次数: 简介面向全国大学生数学建模竞赛B题参赛者提供2024年“生产过程中的决策问题”完整备赛资源包含思路解析、可运行代码与参考论文覆盖一至四问的关键建模与实现适合赛期快速上手并对照验证的团队或个人。资源包共69个文件压缩后9.48MB27个m与8个py文件分别基于MATLAB和Python实现各问算法7个docx是思路参考、最终论文与写作说明15个txt记录结果与运行要点5个xlsx、5个png及pptx/pdf用于结果表、流程图和赛题展示目录按问题模块划分便于检索。目前已有1652人学习下载版本迭代至V5并持续更新结构完整。可从参考论文、代码注释与结果图中还原抽样检验、合格率推断等关键建模细节。作者亦提供参赛未获奖可换赠初版代码的承诺适合目标奖项的备赛者深入钻研。 2024年全国大学生数学建模竞赛B题题目全称叫生产过程中的决策问题考完大家都说这是近几年最贴近实际、也最容易开头的一道题。我赛后把自己的参赛成果整理成了思路代码论文.zip里面包含完整建模过程、可运行的Python代码和最终论文。这几天看到不少学弟学妹还在找这道题的解法索性把包里最核心的东西拿出来连同备赛期间踩过的坑一起写出来。这道题表面在问零配件要不要检测成品不合格要不要拆解本质上是一个随机决策优化问题。你不需要懂多高深的算法但一定要把期望成本这件事讲明白。无论你是刚接触数模的大二学生还是准备明年冲奖的老手这篇文章都能帮你快速建立解题框架。1. 今年B题是真不难但到处都是坑1.1 题目到底在考什么B题给了一个非常具体的生产场景企业采购零配件、装配成成品、对成品进行检测不合格成品可以拆解或报废。题目给出一堆费用参数比如零配件单价、检测费用、装配费用、拆解费用还给出不同供应商的次品率要求你回答两类问题一是这批零配件是否应该接收二是在多个环节中如何组合检测/不检测拆解/不拆解让总成本最低。这两个问题的本质是一样的都是做决策。而决策的依据不是单个结果而是随机分布下的期望成本。所谓期望成本就是把所有可能发生的分支的概率和对应成本相乘再累加。生产决策中的次品率本身就是一个随机变量所以不能简单地用好或坏来判断要用概率来描述。1.2 我在现场看到最多的几种翻车方式第一种翻车是题目还没读完就上手建模把抽样检测直接理解成全检导致后面所有结果偏离题意。第二种翻车是全部精力放在算法复杂度上用整数规划、遗传算法去解一个其实用枚举就能解决的决策问题最后论文里写不清楚。第三种翻车是忽略拆解这个动作很多队伍默认不合格成品只能报废凭空丢了不少分。还有一个隐藏信息是拆解后的零件是否可以再次使用。有的赛题里明确说拆解下来的零配件可以重新装配但需要重新检测这时候整个决策树的末端分支会发生改变。如果没注意到这个条件期望成本公式就会少一项评委一眼就能看出来。1.3 拿到题目后我的固定动作我每次拿到赛题后不会马上写代码而是先做三件事。第一把题目中所有带数字的句子用荧光笔标出来整理成参数表标上单位。第二把所有假设如果可以开头的句子单独抄到一页纸上这些往往就是隐含条件。第三画一张最简单的生产流程图从零配件进厂到成品出厂每一条边上都写上这里能不能做决策。做完这三步这道题在你脑子里就不是一篇小作文而是一个带箭头的网络图。2. 建模思路从要不要检测到期望成本2.1 用决策树把选择串起来我身边成绩好的队伍第一问都是先画决策树。决策树的画法很简单从零配件这个节点开始分出检测和不检测不检测直接进入装配阶段检测之后又分整批接收和整批拒收接收后继续装配拒收后可能退回供应商或全部报废。装配完成后成品节点再分合格和不合格不合格又分报废和拆解拆解后又回到零配件层级。这棵树画好之后期望成本的计算路径就清楚了。你需要做的只是从树的末端往回算先算每片叶子上的成本再按概率加权求和最后比较不同决策树根部的期望成本大小。很多人觉得画树浪费时间实际上它帮你省掉了后面写公式和写论文的时间。2.2 抽样检测不是随便抽要用概率说话如果决定对一批零配件做抽样检测就需要确定抽多少件和最多允许几件不合格。这里用到一个很基础但很重要的分布——二项分布。假设这一批产品的实际次品率是p抽n件不合格品数X服从B(n,p)那么这批货被接收的概率就是P(X≤k)其中k是接受标准。如果题目给定了标称次品率p0还可以用假设检验的思路构造问题原假设是次品率不超过p0备择假设是次品率超过p0。通过控制第一类错误的概率通常取0.05或0.1可以反解出最小的抽样量n和最大允许不合格数k。这部分不用写太复杂但一定要把二项分布的概率表达式列出来再放一张抽样方案表就很能说明问题。2.3 多个零配件和成品检测怎么联动这道题真正的分水岭在后面的问题会扩展到多个零配件、多道工序。此时每个零配件都有检测/不检测两个选择两个零配件就是四种组合三个就是八种。组合数不大时用枚举法完全可行如果零配件很多再考虑动态规划或整数规划。成品的次品率不等于零配件次品率相加。如果所有零配件独立且没有任何检测环节成品的次品率应为1减去所有合格率的乘积也就是1 - ∏(1-p_i)。如果某些零配件在装配前已经检测过它的实际合格率会发生变化这时候要分情况调整公式。这种递推关系写进模型里比直接套公式更容易让评委信服。3. 代码不是难点关键是别把模型写错3.1 先手算一个最小例子写代码前我会先拿一个只有一个零配件、只有检测/不检测两种策略的最简模型手算。比如设次品率0.1检测费用2元装配费用10元不合格成品返工费用40元分别手算不检测和检测的期望成本。手算的好处是能让你确认公式有没有写反概率有没有漏乘。代码实现时也建议按同样的顺序写先写一个计算期望成本的函数再写枚举所有决策组合的循环最后输出最优决策。不要一上来就用现成的优化库因为这道题的数据量通常不需要复杂的求解器枚举就能出结果而且枚举代码出问题更容易排查。3.2 核心代码长这样核心代码其实就两块。第一块是单个零配件是否检测的期望成本函数思路很直白不检测时总成本等于装配费加上成品不合格概率乘返工费检测时则要在装配前先掏一笔检测费所以期望成本等于检测费加装配费再加返工期望。下面这个Python函数是我写的第一版只做了是否检测的比较但已经包含了后面扩展所需的基本结构。比赛时不要一上来就写几百行的大程序先把这个小函数跑通参数用手算值验证确认无误再往多零配件场景扩展。# 计算是否检测某个零配件的期望成本 def eval_detect(p, detect_fee, assembly_fee, final_defect_rate, rework_fee): # 不检测装配费 不合格成品概率 * 返工费 no_detect assembly_fee final_defect_rate * rework_fee # 检测检测费 装配费 不合格成品概率 * 返工费 detect detect_fee assembly_fee final_defect_rate * rework_fee return no_detect, detect p 0.1 detect_fee 2 assembly_fee 10 final_defect_rate 0.05 rework_fee 40 no, yes eval_detect(p, detect_fee, assembly_fee, final_defect_rate, rework_fee) print(不检测期望成本, no) print(检测期望成本, yes)当然这只是示意结构实际比赛时成品次品率要通过零配件次品率算出来而不是直接给一个固定值。多个零配件时遍历所有决策组合用笛卡尔积实现Python里直接写嵌套循环或itertools.product都可以import itertools # 假设三个环节的决策编码0不检测1检测 decisions list(itertools.product([0, 1], repeat3)) for d in decisions: total compute_cost(d) # 按题目参数计算总成本 if total best: best total best_d d print(最优策略组合, best_d, 期望成本, best)需要注意枚举前一定要把所有参数统一单位尤其是元/件和元/批的区别。我们第一版代码就犯过这个错导致算出来的检测费用比装配费用还高查了半天才发现单位不一致。3.3 灵敏度和可视化会给论文加分模型建完、结果算完别急。把次品率从0.01到0.5以0.01为步长扫描画出期望成本曲线看检测和不检测两条线在哪个点相交这个交点就是决策阈值。把不同阈值下的最优策略用折线图或条形图画出来塞进论文的模型分析部分既直观又能证明你的模型不是碰运气。我当时用matplotlib画完图把图片分辨率调到300dpi再插入论文。评委快速翻论文时最能抓住眼球的不是公式而是这种有信息量的图。建议大家在写论文前就把图画好而不是写完文字再补图因为图会反过来帮你发现模型里的逻辑漏洞。4. 论文里这样写评委一眼看到重点4.1 摘要、假设和符号表要克制摘要不需要华丽的词最忌本文采用了一种先进的算法这种话。直接把题目要你回答的每个问题、你建立的模型、得到的结论写清楚。比如针对问题一建立基于二项分布的抽样检验模型得到当n等于20、k等于1时在显著性水平0.05下应接收这批零配件针对问题二采用决策树期望成本最小化模型得到最优策略为对零配件1全检、零配件2不检、成品全检且不合格成品拆解。模型假设不是凑字数每一条假设都要能对应题目里的一个条件。比如各零配件次品率相互独立检测成本按件计算且不会损坏零配件拆解后的零配件只能使用一次等等。符号表更要简洁能用下标表示就不要发明新符号全文公式必须和符号表一一对应这是评委最看重的严谨性。4.2 结果用表格说话B题的输出有很多是否决策与其在正文里写零配件一建议全检零配件二建议不检……一连串文字不如做一张三线表每列是一个决策环节每行是一个问题的小问或不同参数情形。表中用检测/不检测表示策略最后一列写期望成本或结论一目了然。决策环节方案一方案二方案三零配件1全检抽检不检零配件2不检抽检不检成品检测全检全检不检期望总成本22.4018.7527.10这是我自己举例用的一张简化表不是原题答案但结构可以参考。真正比赛时抽样方案也建议单独放一张表包含抽样量n、接受数k、生产方风险、使用方风险和接收概率这样评委能直接看到你的方案是怎么从概率里推出来的。4.3 把灵敏度分析写成加分项不是凑字数很多论文的灵敏度分析只是把参数改一改结论说一句结果稳定这等于没写。正确的写法是明确说你改变了哪个参数比如把次品率从0.1提高到0.2然后指出最优决策是否发生变化如果变化了给出新的最优策略如果没变化给出临界值。这样既有定量结论又说明模型有实际指导意义。我在自己的论文里就写了一段当供应商次品率低于0.12时最优策略为不检测直接装配当次品率高于0.12时最优策略变为全检后装配。该阈值可作为企业选择供应商的参考标准。这句话后来被指导老师专门圈出来说写得好。5. 这个zip包里有什么以及怎么用它5.1 压缩包内容与使用顺序我整理资源包时习惯把内容分成三个顶层文件夹思路文档、代码、论文。思路文档里是我对着题目逐步拆解的思维过程代码文件夹里有README、Python脚本和依赖文件论文文件夹里是最终提交版PDF和Word源文件。拿到任何一个类似的资源包第一件事永远不是双击代码而是先看README。README里会写清楚运行环境、版本和文件依赖能帮你省掉很多无谓的报错。5.2 解压和运行代码时最常遇到的四个问题第一是解压后发现代码文件乱码多半是压缩包里带了不同系统不兼容的文件名编码换用开源解压软件重新解压或者用命令行解压能解决大部分问题。第二是Python版本不一致代码里用了高版本语法低版本运行直接报错遇到这种情况先看README写的Python版本再创建对应虚拟环境。第三是缺少第三方库按依赖文件逐行安装就行不要手动一个一个装。第四是数据文件路径问题代码里的相对路径如果不对把数据文件和脚本放在同一个目录下运行即可。这些都是小问题但每年都有队伍因为环境问题耗掉一整天。我的经验是比赛前就把自己的Python环境固定好三方库管理用虚拟环境压缩包解压后先跑一个最简单的示例脚本确认环境没问题再开始复现结果。5.3 能带走的不是代码而是一个分析框架说句实在话国赛B题的代码并不复杂几十行枚举加画图就能解决。真正值钱的是你从这道题里学到的分析框架明确决策变量、明确目标函数、明确随机性来源然后比较不同决策的期望结果。这个方法不仅能用在竞赛里企业生产调度、服务运营管理、供应链风险控制都可以套用。我后来帮一家小工厂做过一次质检方案优化用的就是这道题的思路。不过是把零配件次品率换成了来料不良率把拆解换成了退货返工模型结构几乎一模一样。这说明竞赛题不是空中楼阁它是真实管理问题的简化版。最后再分享一个我踩过的坑。比赛第一天晚上我们因为代码输出结果跟手算对不上一直调到大半夜最后发现是变量名写错了两个参数在函数里被覆盖。从那以后我养成了一个习惯每写一个函数先在最前面print一遍所有输入的参数确认无误再往下算。数学建模比赛时间紧压力大最容易出问题的不是模型而是细节。希望这篇经验帖能让你少走几步弯路。如果你手头也有2024国赛B题的思路、代码或论文资源欢迎直接在评论区交流大家一起把这道题吃透。本文还有配套的精品资源点击获取