1. 供应链模型基础与问题定义
在供应链管理研究中,一个供应商对应多个零售商的模型是最基础的网络结构之一。这种双边关系模型虽然结构简单,却能够反映供应链中的核心矛盾——供应商的生产能力与零售商的订单需求之间的博弈。我最近复现的这篇论文,正是针对这种典型场景建立了数学模型,并利用Mathematica完成了整套求解流程。
这个模型的核心价值在于:它同时考虑了供应商的生产成本、库存成本,以及零售商的订购成本、缺货成本,通过数学优化找到系统总成本最低的运作方案。与常见的单零售商模型不同,双零售商的情况引入了需求分配这一新的决策维度,使得问题复杂度呈指数级增长。
2. 数学模型构建细节
2.1 决策变量定义
模型包含三类关键决策变量:
- 供应商生产量(Q):整数变量,表示一个周期内的总产量
- 零售商订单量(q₁, q₂):分别对应两个零售商的订购量
- 库存水平(I):连续变量,表示期末库存
论文采用了非线性整数规划的形式,目标函数为:
Minimize TC = C_prod(Q) + C_hold(I) + C_short(D - q₁ - q₂)
Subject to:
q₁ + q₂ ≤ Q
Q ≤ CAP
q₁ ≥ D₁_min
q₂ ≥ D₂_min
其中C_prod是凸函数形式的生产成本,包含固定成本和可变成本两部分。这个设定比线性成本函数更贴近实际,但也大大增加了求解难度。
2.2 需求不确定性处理
模型创新点在于对随机需求的处理——采用分段线性逼近法将连续概率分布离散化。具体操作时:
- 对每个零售商的需求分布取5个分位数点(10%, 30%, 50%, 70%, 90%)
- 为每个需求场景赋予相应概率权重
- 构建场景树来描述联合需求分布
这种方法相比蒙特卡洛模拟计算量更小,相比简单均值法精度更高。在Mathematica中可以用EmpiricalDistribution函数实现:
mathematica复制demandDist1 = EmpiricalDistribution[{0.2,0.2,0.2,0.2,0.2} -> {d11,d12,d13,d14,d15}]
demandDist2 = EmpiricalDistribution[{0.2,0.2,0.2,0.2,0.2} -> {d21,d22,d23,d24,d25}]
3. Mathematica求解实现
3.1 环境配置
需要先加载优化工具箱:
mathematica复制Needs["Optimization`LinearProgramming`"]
Needs["Statistics`MultivariateStatistics`"]
建议设置以下全局参数提升求解效率:
mathematica复制SetSystemOptions["LinearProgrammingOptions" -> {"Method" -> "InteriorPoint"}];
$RecursionLimit = Infinity;
3.2 模型参数化
论文中的基准参数设置:
mathematica复制params = {
productionCost -> Function[q, 500 + 50q + 0.2q^2],
holdingCost -> 8,
shortageCost -> 25,
capacity -> 200,
demand1 -> {50,75,100,125,150},
demand2 -> {40,60,80,100,120}
};
3.3 分步求解策略
由于直接求解混合整数非线性规划难度太大,论文采用了分层优化策略:
- 外层循环:枚举可能的Q值(0到CAP)
- 中层循环:对每个Q值,枚举q₁的可能取值
- 内层循环:固定Q和q₁后,q₂的取值由剩余产能决定
在Mathematica中实现为:
mathematica复制solutions = Table[
q2Max = Q - q1;
candidates = Table[
{q1, q2,
CalculateTotalCost[Q, q1, q2, demand1, demand2]},
{q2, Max[0, d2Min], Min[q2Max, d2Max]}
];
MinimalBy[candidates, Last],
{Q, 0, CAP, 5},
{q1, Max[0, d1Min], Min[Q, d1Max], 5}
];
optimal = First@MinimalBy[Flatten[solutions, 2], Last]
4. 结果分析与可视化
4.1 敏感度分析
通过Manipulate函数创建交互式分析面板:
mathematica复制Manipulate[
Plot3D[totalCost[Q,q1,q2], {Q,50,200}, {q1,30,150},
AxesLabel->{"Production","Retailer1 Order","Cost"},
ColorFunction->"TemperatureMap"],
{{q2,80}, 0, 150},
TrackedSymbols:>All]
4.2 帕累托前沿
绘制成本权衡曲线:
mathematica复制frontier = ComputeParetoFrontier[];
ListLinePlot[frontier,
PlotLabel->"Cost Trade-off Frontier",
FrameLabel->{"Holding Cost","Shortage Cost"}]
5. 复现中的关键挑战
5.1 数值稳定性问题
原始论文没有提及但实际遇到的两个坑:
- 当Q接近极值时,q1和q2的可行域会收缩为单点,导致导数计算出现奇异矩阵
- 生产成本函数的二次项系数过小(0.2)会导致优化器误判凸性
解决方案:
mathematica复制RegularizedCost[q_] := If[q < 0.1, 500, 500 + 50q + 0.2q^2]
5.2 性能优化技巧
通过Memoization缓存中间结果可提速3-5倍:
mathematica复制CalculateTotalCost[Q_,q1_,q2_] := CalculateTotalCost[Q,q1,q2] = (
prodCost = productionCost[Q];
expShortage = Expectation[...];
prodCost + holdingCost*... + shortageCost*expShortage
)
6. 模型扩展方向
基于复现经验,我认为可以在以下方面改进原模型:
- 引入运输成本项,考虑地理位置因素
- 将静态模型扩展为多周期动态模型
- 用鲁棒优化替代随机规划,降低对分布假设的依赖
Mathematica实现多周期扩展时,可以用RecurrenceTable构建状态转移方程:
mathematica复制dynamics = RecurrenceTable[{
I[t+1] == Q[t] - q1[t] - q2[t],
TC[t] == productionCost[Q[t]] + ...,
{Q[t],q1[t],q2[t]} ∈ feasibleSet[t]},
{I,TC}, {t,0,T}]
这个复现项目让我深刻体会到,即使看似简单的供应链模型,在数学处理和计算实现层面都存在大量需要权衡的细节。Mathematica符号计算与数值优化相结合的特性,使其特别适合这类问题的快速原型验证。
