1. 供应链模型基础与问题定义
在供应链管理研究中,一个供应商与两个零售商组成的系统是最基础的网络结构之一。这种模型虽然看似简单,却包含了供应链协调、库存分配、定价策略等核心问题的基本要素。我最近复现了一篇经典论文中的数学模型,使用Mathematica完成了从公式推导到数值求解的全过程。
这个模型的核心是解决供应商如何在不同零售商之间分配有限资源的问题。具体场景可以想象为:一家电子产品制造商(供应商)需要同时向线上商城和线下实体店(两个零售商)供货,而制造商的生产能力是有限的。零售商面临不同的市场需求和运营成本,供应商需要制定最优的生产和分配策略以实现整体利润最大化。
模型通常包含以下变量:
- 供应商的生产量Q
- 分配给零售商1的数量q₁
- 分配给零售商2的数量q₂
- 零售商的销售价格p₁和p₂
- 市场需求函数D₁(p₁)和D₂(p₂)
- 各环节的成本参数(生产成本、运输成本等)
提示:在构建此类模型时,必须明确区分集中决策(中央计划者统一优化)和分散决策(各方独立决策)两种情景,这是供应链研究的核心方法论之一。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数学建模与公式推导
原论文采用了Stackelberg博弈框架,即供应商作为领导者首先决策,零售商作为跟随者随后响应。这种主从关系在供应链中非常普遍。我们需要为每个参与者建立利润函数:
供应商利润:
πₛ = (w - c)Q - K
其中w是批发价,c是单位生产成本,K是固定成本
零售商i的利润(i=1,2):
πᵣᵢ = (pᵢ - w)qᵢ - hᵢ(qᵢ - Dᵢ(pᵢ))⁺ - bᵢ(Dᵢ(pᵢ) - qᵢ)⁺
这里h是库存持有成本,b是缺货惩罚成本,(x)⁺表示max(x,0)
市场需求函数通常采用线性形式:
Dᵢ(pᵢ) = aᵢ - βᵢpᵢ
其中a表示市场基数,β表示价格敏感系数
2.1 博弈时序与逆向求解
- 供应商确定生产量Q和批发价w
- 零售商观察到(w,Q)后,同时决定订购量q₁和q₂
- 供应商按比例分配实际发货量:min(q₁+q₂, Q)
采用逆向归纳法求解:
- 首先求解零售商的反应函数qᵢ*(w)
- 然后将反应函数代入供应商的利润函数
- 最后求解供应商的最优决策(w*, Q*)
3. Mathematica实现详解
下面展示如何在Mathematica中实现这个模型的求解。我们使用12.0版本,但代码兼容大多数现代版本。
3.1 基本参数设置
mathematica复制(* 基础参数 *)
a1 = 100; a2 = 80; (* 市场需求基数 *)
β1 = 2; β2 = 1.5; (* 价格敏感系数 *)
c = 10; (* 单位生产成本 *)
h1 = 2; h2 = 1.5; (* 库存成本 *)
b1 = 5; b2 = 4; (* 缺货惩罚成本 *)
K = 100; (* 固定成本 *)
3.2 需求函数与利润函数定义
mathematica复制(* 需求函数 *)
D1[p1_] := a1 - β1*p1
D2[p2_] := a2 - β2*p2
(* 零售商利润函数 *)
πr1[p1_, q1_, w_] := (p1 - w)*q1 - h1*Max[q1 - D1[p1], 0] - b1*Max[D1[p1] - q1, 0]
πr2[p2_, q2_, w_] := (p2 - w)*q2 - h2*Max[q2 - D2[p2], 0] - b2*Max[D2[p2] - q2, 0]
(* 供应商利润函数 *)
πs[w_, Q_, q1_, q2_] := (w - c)*Min[Q, q1 + q2] - K
3.3 零售商最优反应求解
mathematica复制(* 求解零售商1的最优反应 *)
retailer1Optimal =
Maximize[{πr1[p1, q1, w], q1 >= 0, p1 >= w}, {p1, q1}];
p1Optimal = p1 /. retailer1Optimal[[2]];
q1Optimal = q1 /. retailer1Optimal[[2]];
(* 同理求解零售商2的最优反应 *)
retailer2Optimal =
Maximize[{πr2[p2, q2, w], q2 >= 0, p2 >= w}, {p2, q2}];
p2Optimal = p2 /. retailer2Optimal[[2]];
q2Optimal = q2 /. retailer2Optimal[[2]];
3.4 供应商决策求解
mathematica复制(* 将零售商反应函数代入供应商利润 *)
πsSupplier[w_, Q_] := πs[w, Q, q1Optimal, q2Optimal]
(* 求解供应商最优决策 *)
supplierOptimal =
Maximize[{πsSupplier[w, Q], w >= c, Q >= 0}, {w, Q}, Reals];
wOptimal = w /. supplierOptimal[[2]];
QOptimal = Q /. supplierOptimal[[2]];
3.5 结果可视化
mathematica复制(* 绘制利润函数随批发价变化曲线 *)
Plot[πsSupplier[w, QOptimal] /. w -> ww, {ww, c, 50},
PlotLabel -> "供应商利润 vs 批发价",
AxesLabel -> {"批发价 w", "利润 πs"}]
(* 绘制生产量对系统利润的影响 *)
ContourPlot[πsSupplier[wOptimal, Q], {Q, 0, 200}, {w, c, 30},
ContourLabels -> True,
PlotLabel -> "供应商利润随生产量变化"]
4. 模型扩展与敏感性分析
4.1 产能约束的影响
在实际中,供应商可能有最大产能限制Q_max。只需在供应商优化问题中添加约束:
mathematica复制supplierOptimalConstrained =
Maximize[{πsSupplier[w, Q], w >= c, 0 <= Q <= Qmax}, {w, Q}, Reals];
通过改变Qmax值,可以分析产能约束对系统利润和决策的影响。
4.2 成本参数敏感性
我们可以分析单位生产成本c的变化如何影响均衡结果:
mathematica复制cValues = Range[5, 20, 1];
results = Table[
{cVal, w, Q} /.
Maximize[{πsSupplier[w, Q] /. c -> cVal, w >= cVal, Q >= 0}, {w,
Q}, Reals][[2]],
{cVal, cValues}];
ListPlot[{
Tooltip[results[[All, {1, 2}]], "最优批发价"],
Tooltip[results[[All, {1, 3}]], "最优生产量"]},
PlotLegends -> {"批发价 w*", "生产量 Q*"},
AxesLabel -> {"生产成本 c", "最优值"}]
4.3 需求不确定性扩展
更高级的模型可以考虑随机需求。假设需求服从正态分布:
mathematica复制D1Stochastic[p1_] :=
NormalDistribution[a1 - β1*p1, σ1]
D2Stochastic[p2_] :=
NormalDistribution[a2 - β2*p2, σ2]
(* 需要重新定义利润函数为期望利润 *)
πr1Stochastic[p1_, q1_, w_] :=
Expectation[(p1 - w)*Min[q1, x] - h1*Max[q1 - x, 0] - b1*Max[x - q1, 0],
x \[Distributed] D1Stochastic[p1]]
5. 论文复现中的关键挑战
在复现过程中,我遇到了几个值得注意的技术难点:
-
符号计算的稳定性:Mathematica在符号推导时,有时会给出过于复杂的表达式。解决方案是适时使用Simplify或FullSimplify,或者在适当步骤转为数值计算。
-
多阶段优化的顺序:必须严格遵循博弈时序,先求零售商的反应函数,再代入供应商问题。我曾错误地尝试同时优化,导致结果不满足Stackelberg均衡的定义。
-
约束条件的处理:特别是对于非光滑的max/min函数,直接优化可能失败。可以尝试:
- 使用If条件语句代替max/min
- 引入辅助变量和附加约束
- 分段定义目标函数
-
数值精度的验证:对于关键结果,应该:
- 检查一阶条件是否满足
- 尝试不同初始值验证能否得到相同结果
- 与论文中的基准案例进行对比
注意:在更复杂的模型中,可能需要使用NMaximize代替Maximize,特别是当符号解难以求得时。但要注意检查数值结果是否合理。
6. 实际业务启示
虽然这是理论模型,但对实际供应链管理有重要指导意义:
-
双重边际化效应:分散决策下,供应链各环节独立定价会导致系统总利润低于集中决策。这解释了为什么供应商常采用数量折扣等协调机制。
-
产能分配策略:当总订单量超过产能时,按比例分配可能不是最优方案。实践中可以采用:
- 基于历史表现的优先分配
- 允许零售商竞价稀缺产能
- 考虑长期合作关系因素
-
需求预测的价值:模型显示,准确估计市场需求参数(a,β)对利润有重大影响。这支持了在需求预测技术上投资的合理性。
-
合同设计的重要性:通过设计合适的供应合同(如回购、收入共享),可以在分散决策下实现接近集中决策的系统效率。
我在实际项目中应用这些见解时,发现有几个实用技巧:
- 先用简化模型快速验证想法,再逐步增加复杂性
- 敏感性分析比单点结果更重要
- 模型结果需要结合行业知识进行校准
- 可视化能极大帮助非技术人员理解结论
