1. 供应链模型概述:供应商与零售商的博弈关系
在供应链管理中,一个供应商与两个零售商构成的系统是最基础却也最具研究价值的场景之一。这种三角关系包含了供应链中的核心矛盾——供应商希望批量出货以降低物流和管理成本,而零售商则倾向于小批量高频次进货以减少库存压力。当系统中存在两个相互竞争的零售商时,这种矛盾会进一步复杂化。
我最近复现了一篇经典论文中的供应链模型,该模型研究了单一供应商向两个零售商供货时的最优决策问题。模型的核心在于求解三个关键参数:
- 供应商的最优批发价格(w)
- 两个零售商各自的最优订货量(q₁, q₂)
- 系统整体利润的最大化条件
这个模型属于典型的Stackelberg博弈(领导者-追随者模型),其中供应商作为领导者首先制定批发价格,零售商随后根据价格决定订货量。有趣的是,当两个零售商之间存在市场竞争时,他们的订货决策会相互影响,形成所谓的"横向竞争"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Mathematica在供应链模型求解中的优势
为什么选择Mathematica而不是MATLAB或Python来求解这个模型?经过多次实践对比,我发现Mathematica在符号计算和交互式可视化方面具有独特优势:
2.1 符号计算能力
模型的求解需要处理复杂的导数运算和方程组求解。Mathematica的符号计算引擎可以直接处理这样的代数表达式:
mathematica复制profitSupplier = (w - c)(q1 + q2);
profitRetailer1 = (a - b(q1 + θ q2) - w)q1;
profitRetailer2 = (a - b(q2 + θ q1) - w)q2;
通过D[profitRetailer1, q1]等命令,可以直接得到精确的解析解,避免了数值方法带来的精度损失。
2.2 动态交互可视化
Mathematica的Manipulate函数可以创建参数动态调整的可视化:
mathematica复制Manipulate[
Plot3D[supplierProfit[w, θ], {w, 0, 10}, {θ, 0, 1},
AxesLabel -> {"批发价格", "竞争系数", "供应商利润"}],
{c, 0, 5}]
这种交互功能在分析参数敏感性时特别有用,能直观展示竞争系数θ如何影响系统各方的利润分配。
2.3 内置优化算法
对于更复杂的变体模型,可以直接调用内置的NMaximize:
mathematica复制NMaximize[{totalProfit[w, q1, q2], constraints}, {w, q1, q2},
Method -> "DifferentialEvolution"]
3. 模型建立与求解的完整过程
3.1 基础假设与变量定义
模型基于以下关键假设:
- 市场需求函数为线性:p = a - b(q₁ + q₂)
- 两个零售商的商品具有替代性,用θ∈[0,1]表示竞争强度
- 供应商的单位生产成本为常数c
在Mathematica中我们这样定义:
mathematica复制a = 100; (* 市场基础需求 *)
b = 2; (* 价格敏感系数 *)
c = 20; (* 生产成本 *)
θ = 0.5; (* 竞争系数,0为无竞争,1为完全替代 *)
3.2 逆向求解法实现
按照Stackelberg博弈的求解逻辑,我们先求零售商的反应函数:
mathematica复制(* 零售商1的利润函数 *)
profitR1[q1_, q2_, w_] := (a - b (q1 + θ q2) - w) q1;
(* 求一阶条件 *)
foc1 = D[profitR1[q1, q2, w], q1] == 0;
foc2 = D[profitR1[q2, q1, w], q2] == 0;
(* 解反应函数 *)
reaction = Solve[{foc1, foc2}, {q1, q2}];
q1Opt[w_] := q1 /. reaction[[1]];
q2Opt[w_] := q2 /. reaction[[1]];
然后求解供应商的利润最大化问题:
mathematica复制(* 供应商利润函数 *)
profitS[w_] := (w - c)(q1Opt[w] + q2Opt[w]);
(* 求最优批发价格 *)
wOpt = w /. Last[NMaximize[profitS[w], w]];
3.3 完整求解代码
将上述步骤整合为完整解决方案:
mathematica复制ClearAll["Global`*"];
(* 参数设置 *)
params = {a -> 100, b -> 1.5, c -> 15, θ -> 0.7};
(* 零售商利润函数 *)
profitRetailer[qSelf_, qOther_, w_] :=
(a - b (qSelf + θ qOther) - w) qSelf /. params;
(* 求反应函数 *)
react = Solve[{
D[profitRetailer[q1, q2, w], q1] == 0,
D[profitRetailer[q2, q1, w], q2] == 0}, {q1, q2}];
(* 供应商利润 *)
profitSupplier[w_] := Module[{q1v, q2v},
{q1v, q2v} = {q1, q2} /. react[[1]];
(w - c) (q1v + q2v) /. params];
(* 求最优批发价格 *)
wOpt = w /. Last@NMaximize[profitSupplier[w], w];
(* 计算均衡结果 *)
{q1Opt, q2Opt} = {q1, q2} /. react[[1]] /. w -> wOpt;
totalOutput = q1Opt + q2Opt;
marketPrice = a - b (q1Opt + θ q2Opt) /. params;
(* 打印结果 *)
Print["最优批发价格: ", wOpt];
Print["零售商1订货量: ", q1Opt];
Print["零售商2订货量: ", q2Opt];
Print["市场价格: ", marketPrice];
4. 关键发现与模型扩展
4.1 竞争强度的影响分析
通过改变θ值,我们可以观察到竞争如何影响系统:
mathematica复制θRange = Range[0, 1, 0.1];
results = Table[
{θVal,
Module[{w},
w = w /. Last@NMaximize[profitSupplier[w] /. θ -> θVal, w];
{w, q1 /. react[[1]] /. {w -> w, θ -> θVal}}]},
{θVal, θRange}];
ListPlot[{
results[[All, {1, 2}]],
results[[All, {1, 3, 1}]]},
PlotLegends -> {"批发价格", "零售商订货量"}]
分析表明,随着θ增大(竞争加剧):
- 批发价格会先升后降
- 零售商订货总量增加
- 供应商利润呈现倒U型曲线
4.2 模型扩展方向
在实际应用中,我们可以考虑以下扩展:
- 非对称零售商:两个零售商具有不同的市场势力或成本结构
mathematica复制profitR1 = (a1 - b1 q1 - γ q2 - w) q1 - c1 q1; - 多周期动态博弈:引入库存跨期转移
- 随机需求:将a改为随机变量
- 契约设计:引入数量折扣或回购协议
5. 复现过程中的经验总结
5.1 调试技巧
-
分阶段验证:先单独测试零售商反应函数的正确性
mathematica复制(* 测试反应函数 *) testW = 30; {q1Test, q2Test} = {q1, q2} /. react[[1]] /. w -> testW; profitRetailer[q1Test, q2Test, testW] (* 应大于邻近点 *) -
可视化辅助:绘制利润函数曲面检查极值点
mathematica复制Plot3D[profitRetailer[q1, q2, 30], {q1, 0, 20}, {q2, 0, 20}]
5.2 常见问题解决
-
无解情况:当θ=1(完全替代)且参数设置不当时,市场可能崩溃
- 解决方法:检查参数是否满足
a > c的基本条件
- 解决方法:检查参数是否满足
-
数值不稳定:极值点附近出现震荡
- 解决方法:指定求解方法
Method -> "Newton"
- 解决方法:指定求解方法
-
多解处理:反应函数可能有多个解
- 解决方法:通过
Select筛选经济合理的解
- 解决方法:通过
5.3 性能优化
对于大规模参数扫描,可以:
-
预编译函数:
mathematica复制profitCompiled = Compile[{{w, _Real}, {θ, _Real}}, Module[{q1, q2}, {q1, q2} = {q1, q2} /. react[[1]]; (w - c) (q1 + q2) /. params]]; -
并行计算:
mathematica复制ParallelTable[ NMaximize[profitSupplier[w] /. θ -> θVal, w], {θVal, 0, 1, 0.05}]
6. 实际业务启示
通过这个模型的复现,我们可以得出几点管理启示:
-
供应商定价策略:最优批发价不应单纯考虑成本加成,而应评估下游竞争强度。当零售商竞争适度(θ≈0.5)时,供应商可获得最大利润。
-
零售商竞争管理:零售商需要意识到他们的订货决策会通过市场竞争影响最终利润。在某些情况下,适度的"合作竞争"可能对双方都有利。
-
系统效率:分散决策必然导致"双重边际化"效应,整体供应链利润低于集中决策情况。这解释了为什么现实中会出现VMI(供应商管理库存)等协作模式。
这个简单的模型为理解更复杂的供应链关系奠定了基础。在Mathematica中构建和扩展这类模型,不仅能够验证理论结果,还可以通过参数调整模拟各种业务场景,为实际决策提供量化支持。
