☰
不允许缺货的生产销售存储模型:最优批量与补货点计算指南
2026/9/30 13:09:40 网站建设 项目流程

简介:一份面向数学建模学习与竞赛备战的文档资料,聚焦不允许缺货条件下的生产销售存储优化问题。内容完整呈现模型假设、存储量图形分析、目标函数构建、微分求导与MATLAB求解过程,并讨论k>>r与k≈r等典型情形,适合正在练习优化模型、存储论或运筹学相关内容的高校学生与建模参赛者。压缩包仅含1个doc文件,大小48KB,内容为成型的数学建模论文,包含问题提出、模型建立与求解、结果分析、敏感性分析及模型评价等完整章节。该文档已有299人学习浏览,可用作课程作业参考或建模论文写作范本,帮助读者快速理解最优生产周期公式T的推导脉络,掌握将实际问题转化为存储模型并编程求解的完整思路。

1. 不允许缺货的生产销售存储模型:库存报表掩盖的计划问题

老板给的是死要求,而不是模型:库存月月涨,客户要的东西却照样缺货;仓库里堆满一年都用不了几次的物料,计划员每天被“多买怕积压、少买怕断货”两头拉扯。这个标题里的不允许缺货生产销售存储模型,解决的正是这个问题:把生产批量、销售需求、库存存储放到同一张成本表里,在“绝不允许缺货”的约束下,算出每次该生产多少、库存降到多少触发补货,让月度总成本最低。它适合被“零缺货”和“降库存”两条指标同时夹住的制造计划员、供应链工程师和刚接手生产计划的一线从业者。无论你拿到的是一份方案文档,还是要在系统里落这套逻辑,背后的模型就是下面这套东西;本文全部用月口径,带一组可复现的数字从头走到尾。

2. 为什么“不允许缺货”是个数学约束:从 EOQ 到 EPQ 的成本推演

2.1 两个经典形态:瞬时补货的 EOQ 与边生产边消耗的 EPQ

不允许缺货的库存模型,教科书里通常从两个经典形态起步。第一个是 EOQ(经济订货量),用在采购场景:假设一张订单下去,货物在某个时点瞬间到齐,库存直接补满,然后随着销售匀速下降。第二个是 EPQ(经济生产批量),用在自制场景:车间开始生产后,库存一边被产出抬高,一边被销售拉低,净增长速度是“产能减需求”,所以库存不会瞬间到顶。

生产销售存储模型里,绝大多数情况走的是 EPQ。因为制造业真正卡脖子的不是“订多少货”,而是“排多少量”。产能 P 和需求 D 的关系决定了库存爬坡的斜率:如果每月产能 3200 件、每月需求 2400 件,那么生产期间库存每月净增只有 800 件,而不是 3200 件。EPQ 的最优批量公式是:

Q* = sqrt( 2DS / ( H(1 - D/P) ) )

其中 D 是月需求,S 是单次换产或下单成本,H 是单位库存月持有成本,P 是月产能。分母里的 (1 - D/P) 是净库存累积系数,用来扣除生产期间已经被卖掉的量。用一组贯穿全文的参数来算:D = 2400 件/月,P = 3200 件/月,S = 600 元/次,H = 0.5 元/件/月。先算 1 - D/P = 1 - 0.75 = 0.25,代入后 Q* = sqrt(2 × 2400 × 600 / (0.5 × 0.25)) = sqrt(23,040,000) = 4800 件。

这个数字的含义是:每批生产 4800 件最省钱,覆盖两个月需求。注意 D、H、S 必须用同一个时间周期,D 用月需求,H 就必须是每件每月的持有成本;如果你把 D 换算成日需求,H 也要跟着改成日口径,否则公式算出来直接翻车。我们做方案时最常犯的错,就是销售给日需求、财务给月成本,两边不统一还硬套公式。

2.2 成本曲线的最优点:为什么“不缺货”不等于“库存越低越好”

很多人一听到“不允许缺货”,第一反应是“那我把库存备得高高的”。这恰恰是这个模型要纠正的直觉。总成本 TC(Q) 由两块组成:

TC(Q) = S × D/Q + H × Q/2 × (1 - D/P)

第一项 S × D/Q 是月度分摊的换产成本:批量越大,每月换产次数越少。第二项 H × Q/2 × (1 - D/P) 是平均库存持有成本:批量越大,库存水位越高,存储成本跟着涨。最优解落在两端成本互相拉扯的交点,而不是“库存最少”或“库存最多”的端点。

把刚才的参数代进去对比。Q = 2400 时,每月生产一次,换产成本 600 元,平均库存 1200 × 0.25 = 300 件,持有成本 150 元,合计 750 元/月。Q = 4800 时,换产成本 300 元,平均库存 2400 × 0.25 = 600 件,持有成本 300 元,合计 600 元/月。Q = 9600 时,换产成本 150 元,持有成本 600 元,合计又回到 750 元/月。你看到了,U 形曲线的最低点不在两头,拍脑袋选的“每期做一点”和“一次做一大批”都不是最优解。

这条推演直接回应了“不缺货要不要多备库存”的问题:缺货约束决定的是补货时机,而不是批量大小。批量大确实能让库存更厚,但多出来的持有成本是实打实的资金和仓储损耗,而且并不能解决“快销品断货、慢销品积压”的结构性问题。最优批量解决的是“多久补一次、每次补多少”,不让库存成为无底洞。

2.3 缺货约束如何处理:从“被罚项”到“安全库存”的过渡

理论上“不允许缺货”可以建模成缺货成本无穷大,但实际没法算,因为没有任何一个老板能告诉你缺一次货折算多少钱。更靠谱的做法是把模型拆成两层:确定性的 EPQ 负责“每批做多少”,统计意义上的安全库存负责“需求波动时什么时候补货”。换句话说,不缺货不是靠把批量放大,而是靠把补货点抬高。

补货点的公式是 ROP = 提前期平均需求 + 安全库存。提前期 LT 在这里取 0.5 个月,平均需求 2400 件/月,那么提前期平均需求就是 1200 件。安全库存 SS = z × σ_LT,z 是服务水平对应的安全因子,95% 服务水平下 z = 1.65,99% 下 z = 2.33;σ_LT 是提前期内需求的历史标准差,这里取 150 件。SS = 1.65 × 150 ≈ 248 件,ROP = 1200 + 248 = 1448 件。

这套两层结构是整篇文章后面所有决策参数的骨架:EPQ 解决“经济性”,ROP 解决“不缺货”。在确定性世界里,只要按 EPQ 排产,库存永远不会到零;现实里需求会波动,安全库存为波动买单。别把这两个问题混在一起,否则就会陷入“为了不缺货拼命加库存,加了库存又嫌周转率难看”的死循环。

提示:ROP 触发的是“开始补货”,不是“补货到货”。触发之后还要经历整个提前期,库存才会重新抬高,所以 ROP 必须覆盖提前期内的需求加上波动余量。

3. 从公式到排产参数:批量、安全库存与再订货点的计算步骤

3.1 输入参数表:先统一口径再动手

参数选错,后面算得越精越没用。落地第一步是把输入参数表先立住。下表是生产销售存储模型最常见的输入口径,也是我们和销售、财务、车间三方对齐时必用的表:

参数含义建议口径本文示例值
D月需求销售预测,不是历史出货量2400 件/月
P月产能设备有效产能,含换产损耗3200 件/月
S单次换产/下单成本全成本,含人工、废料、停机600 元/次
H单位库存月持有成本资金成本+仓储+效期损耗0.5 元/(件·月)
LT补货提前期从下单到入库的周期0.5 月
σ_LT提前期需求标准差历史样本滚动计算150 件
z安全因子按目标服务水平查表1.65

最容易起争议的不是公式,而是 D 和 H 的口径。D 必须是销售预测而不是“上个月实际卖了那么多”。用历史出货量做 D,等于默认未来一定重复过去,旺季预测滞后、淡季库存虚高,ROP 会在最不该缺货的时候失效。H 要把资金占用、仓储租金、效期损耗一起折算;只算资金利息,持有成本会被低估一半,然后批量偏大,库存金额直接失控。

输出侧只需要四个参数:经济批量 Q*、安全库存 SS、再订货点 ROP、最大库存 Imax。系统里真正要维护的就是这四个数,其他中间量藏在计算过程里,不需要暴露给执行层。

3.2 三步算出补货参数:批量、安全库存与再订货点

第一步,算经济生产批量。Q* = sqrt( 2 × 2400 × 600 / (0.5 × 0.25) ) = 4800 件。这个数告诉你排产时单批做多少,不告诉你什么时候开始做。

第二步,算安全库存。SS = z × σ_LT = 1.65 × 150 ≈ 248 件。如果你只能拿到周需求数据,先把周需求标准差折算到提前期口径;如果提前期是 0.5 月,而你有的是周数据,σ_LT 用 sqrt(提前期周数) × 周需求标准差来近似,别直接把周标准差拿去用。

第三步,算再订货点。ROP = 0.5 × 2400 + 248 = 1448 件。当库存实物数量降到 1448 件时,触发下一批生产,而不是等库存见底再排产。最大库存 Imax = Q* × (1 - D/P) + SS = 4800 × 0.25 + 248 = 1448 件,这个值用于估算库容占用,不是补货触发线。

三步做完,参数一定要互相验证。比如 ROP 必须大于提前期需求均值,否则补货还没到货就已经卖了;Imax 必须小于仓库容量,否则要回第 4 章的约束检查。建议建一张 Excel 表把输入和输出分栏放,每次更新参数后自动重算,而不是人工改四个数,人工改漏一个,整个系统就跑偏。

3.3 和“允许缺货”模型的分水岭:参数方向与适用场景

标题既然写明“不允许缺货”,说明业务上缺货的代价远大于持有成本:断供罚款、客户流失、整条产线停工待料。但在实际项目里,经常有人为了库存周转率好看,偷偷把模型换成允许缺货的版本,这是方向性错误。两个模型的目标函数完全不同,不能按心情切换。

对比项不允许缺货模型允许缺货模型
库存约束库存不允许降到 0缺货可接受,缺货成本进公式
批量选择偏大,要覆盖提前期需求偏小,用缺货换持有成本
成本构成换产成本 + 持有成本换产成本 + 持有成本 + 缺货成本
安全库存必须有,按服务水平定可以压缩,甚至为 0
适用场景成品保供、关键原料、停产风险高快消品、低值备件、缺货容忍度高的商品

选择模型不是数学问题,是业务约束问题。财务想看库存周转率、业务要求零缺货,这两者的矛盾不应该靠“偷偷允许缺货”来解决,而应该靠优化持有成本 H 来解决:压缩呆滞物料、缩短提前期、提高库存周转,都是降 H 的正路。H 降下来,Q* 自然变小,库存金额跟着降,周转率也保住了。反过来,一旦允许缺货,你的排产逻辑就变成了“用断货风险换库存成本”,这跟标题的前提完全相悖。

4. 落地中的五个坑:公式算对了但执行不下去的原因

4.1 理论批量低于供应商 MOQ 或超过库容,模型只能看不能用

现象:Q* 算出 4800 件,但供应商最低起订量 6000 件,或者仓库最大只能存 3000 件,模型结果直接落不了地。原因:公式假设批量没有上下限,真实世界里永远存在最小起订量和库容上限。解决:把可行批量代入 TC 公式逐一比较,在可行域里取成本最低点。MOQ 6000 时,TC = 600 × 2400/6000 + 0.5 × (6000/2) × 0.25 = 240 + 375 = 615 元/月,只比理论最优 600 元高 2.5%,可以直接妥协。库容上限 3000 时,TC = 600 × 2400/3000 + 0.5 × (3000/2) × 0.25 = 480 + 187.5 = 667.5 元/月,比最优高 11%,这个代价要靠跟供应商谈降低 MOQ 或扩库容来解决,而不是硬吞。

4.2 安全库存加错位置,库存越补越高

现象:SS 算出来 248 件,本应加到 ROP 上,结果被加到批量上,Q* 从 4800 变成 5048。补货更频繁或单批更大,平均库存被抬高,周转率持续下滑,但缺货率并没有改善。原因:把“安全”理解成“多存一点”,而不是“更早一点补货”。解决:安全库存只影响触发线,不影响单批数量;如果保供效果不够,提高 z 值而不是放大 Q*。实际排查时直接看系统里补货点用的哪个数,很多 ERP 的再订货点字段被运维填成了批量字段,这是最隐蔽的坑。

4.3 换产成本 S 少记了废料与产能损失,批量系统性偏小

现象:S 只记了换模人工 600 元,漏了每批首件废料、设备停机期间的产能折算、刀具调整工时。财务一复核,实际单次换产成本 1000 元。原因:S 偏低,Q* 就偏小。S = 600 时 Q* = 4800;S = 1000 时 Q* = sqrt(2 × 2400 × 1000 / (0.5 × 0.25)) ≈ 6197 件,批量明显偏小,换产频率过高,实际总成本被低估。解决:把 S 的口径扩到全成本,换产期间产线停机的边际损失、试产废料、模具调整工时都要折进去;每月让财务复核一次,而不是年初定一个数用一整年。

4.4 需求有季节趋势,全年平均 D 让补货点在旺季失效

现象:3 月旺季需求翻倍到 3200 件/月,但模型里 D 仍取全年平均 2400。提前期需求均值为 0.5 × 3200 = 1600 件,已经大于 ROP = 1448 件,库存还没降到预警线就被卖穿,补货来不及开始就缺货了。原因:EPQ 和 ROP 假设需求平稳,季节趋势直接把 D 拉偏。解决:把计划窗口切成淡旺季分别跑参数,旺季 D 用旺季预测,淡季用淡季预测;或者用未来 12 周滚动预测均值替代全年平均 D,至少保证 ROP 覆盖的是未来提前期内的需求,而不是过去半年的平均值。

4.5 持有成本 H 漏算仓储与效期,批量偏大库存失控

现象:H 只算资金成本 0.2 元/件/月,漏了仓库租金分摊、移库人工、效期报废,真实 H 约 0.5 元/件/月。H = 0.2 时 Q* = sqrt(2 × 2400 × 600 / (0.2 × 0.25)) ≈ 7589 件,比 4800 高出 58%,库存金额直接爆表。原因:H 低估,持有成本在总成本里占比变小,模型自然偏向大批量。解决:把仓储费和报废率折算进持有成本;效期敏感品直接把 H 提高,批量立刻降下来。排产时如果发现某个 SKU 库存金额异常高,先查 H 是不是被低估了,这个检查比调任何参数都管用。

5. 用 Python 在本机跑通模型:最小脚本与批量验证

5.1 最小脚本:用 math 库把 EPQ 和总成本跑出来

不需要装任何第三方库,Python 3 自带的标准库就能跑通。脚本里保留了 EOQ 分支,采购场景填 P = 0 即可自动切换。

import math # 月度口径输入 D = 2400 # 月需求(销售预测口径) S = 600 # 单次换产/下单成本 H = 0.5 # 单位库存月持有成本 P = 3200 # 月产能;采购场景填 0 走 EOQ if P == 0: # EOQ:订货瞬间到货,库存直接补满 q = math.sqrt(2 * D * S / H) else: # EPQ:边生产边消耗,分母要考虑净库存累积系数 q = math.sqrt(2 * D * S / (H * (1 - D / P))) setup = S * D / q # 月均换产成本 hold_rate = 1 - D / P if P > 0 else 1.0 hold = H * q / 2 * hold_rate # 月均库存持有成本 print(f"经济生产批量 Q* = {q:.0f} 件") print(f"月度总成本 = {setup + hold:.0f} 元") print(f"其中:换产成本 {setup:.0f} 元,持有成本 {hold:.0f} 元")

这段代码的逻辑很直白:先判断走 EOQ 还是 EPQ,再套公式,然后拆出总成本的两部分。运行后输出 Q* = 4800 件,月度总成本 600 元,其中换产成本和持有成本各 300 元,跟前面手算完全一致。改参数时注意 D 和 H 的周期必须统一,D 改成周需求,H 也要改成每件每周的持有成本;P = 0 时 hold_rate 强行置 1,是因为采购瞬时到货不需要扣除生产期间的消耗。这个脚本拿来改参数、试敏感度足够了。

5.2 枚举法验证最优批量,顺带检验公式是否写错

公式算完不放心,就用枚举法把成本曲线扫一遍。批量从 200 扫到 8000,步长 200,看最低点落在哪。

best_q, best_tc = 0, float("inf") for q_i in range(200, 8001, 200): tc = S * D / q_i + H * q_i / 2 * (1 - D / P) if tc < best_tc: best_q, best_tc = q_i, tc print(f"枚举最优批量 = {best_q} 件,总成本 = {best_tc:.0f} 元/月")

这段枚举解会和解析解一致:最优批量落在 4800 附近,总成本 600 元/月。如果两个结果对不上,十有八九是公式里的括号位置错了,或者 D 和 H 口径不一致。步长改 100 或 50 可以看得更细,但 200 的步长足够验证公式方向;真正要定位更精确的最优点,直接用公式解,枚举只是用来复核。另外,把 tc 计算单独拎出来做成函数,后面做敏感性分析直接复用。

5.3 补货点与安全库存:基于提前期需求样本直接算出 ROP

批量解决了“一次做多少”,补货点解决“什么时候开始做”。安全库存不要拍脑袋,用提前期需求的历史样本算。以下脚本用最近 20 个补货周期的提前期需求数据,直接输出 SS 和 ROP。

import statistics # 最近 20 个补货周期内的提前期需求样本(单位:件) lead_demand = [ 1210, 1180, 1235, 1150, 1240, 1195, 1160, 1220, 1185, 1170, 1230, 1165, 1215, 1145, 1200, 1175, 1225, 1190, 1180, 1210, ] mean_lt = statistics.mean(lead_demand) std_lt = statistics.stdev(lead_demand) z = 1.65 # 95% 服务水平;99% 时取 2.33 ss = z * std_lt rop = mean_lt + ss print(f"提前期需求均值 {mean_lt:.0f} 件,标准差 {std_lt:.0f} 件") print(f"安全库存 SS = {ss:.0f} 件") print(f"再订货点 ROP = {rop:.0f} 件")

这段代码用的是提前期口径样本,不是日需求样本。如果拿日需求算标准差,再乘以提前期天数,会得到偏小的安全库存,因为提前期内的需求波动不能简单用日波动代换。stdev 默认用 n-1 的样本标准差,样本少于 10 个时容易高估波动,我一般直接按均值的 30% 估标准差,避免小样本带来的玄学波动。z 的取值按服务水平来:缺货率 5% 用 1.65,缺货率 1% 用 2.33,缺货率 10% 用 1.28。输出后,Q*、SS、ROP 三个数拼成一张参数表,填进 ERP 的再订货点和批量字段,这套模型就算落地了。

6. 进阶用法:敏感性分析加季度滚动重算,让参数不落伍

6.1 敏感性分析:先校正 S,再谈优化

模型建完不是结束,你要知道哪个输入参数最值得花精力去校。对四个输入各做 ±20% 的扰动,观察 Q* 的变化方向:

参数变化幅度Q* 变化幅度实操含义
D+20%约 +9.5%销售预测上调,批量温和上调
S+20%约 +9.5%换产成本必须记全,否则批量系统性偏小
H+20%约 -9%持有成本记高了,批量就会下降
P+20%约 -18%产能越富余,批量越接近 EOQ

S 是四个输入里最容易被低估的,也是最值得每月复盘的一项;H 对效期敏感品影响尤其大。这两个数校不准,后面调批量都是白费功夫。

6.2 季度滚动重算:模型参数要跟着业务走

输入全是估计值,业务跑两个月之后,预测偏差、换产时间、仓储费率都在变。我的习惯是每个季度末用最近 13 周的实际需求更新 D 和 σ_LT,用财务最新数据更新 S 和 H,重新计算 Q*、SS、ROP,刷新系统参数;淡旺季切换前额外跑一次。公式解只是参考基准,最终执行批量还要过一遍约束检查:MOQ、库容、物流整车满载,以及车间“这次顺便多做一点”的冲动。把这些约束写进参数表旁边再决策,模型才有意义。刚做计划那会儿,我把“不允许缺货”理解成“多备库存”,结果慢动物料堆了一面墙,快销品照样断货;后来把批量、补货点、安全库存分开算,才明白不缺货靠的是补货点,不靠库存水位。希望帮到你。

本文还有配套的精品资源,点击获取

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

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

立即咨询