MCM520 ← 资料站首页 蔬菜类商品自动定价与补货(三):单品定价补货优化与替代效应 打开交互阅读器 →

蔬菜类商品自动定价与补货(三):单品定价补货优化与替代效应

摘要

第三、四问把优化从品类下沉到单品:Q3 要求考虑售价与批发价随时间波动,给出未来一周(2023-07-0107-07)各单品的补货量与定价使收益最大,并分析可售单品间的替代效应;Q4 要求给出整周逐日执行方案并核算报损与缺货。本文建立"单品弹性定价 + 同品类交叉弹性替代 + 周执行表(报损/缺货核算)"的完整模型:31 个单品逐一求解一阶条件 pi∗=c0iεi/(εi+1)p^*_i=c_{0i}\varepsilon_i/(\varepsilon_i+1)(价格带 [0.88p0,1.20p0][0.88p_0,1.20p_0] 截断),单品弹性范围 **−1.2(土豆) −3.0(白玉菇),品类均值呈现"花叶/食用菌高弹性、水根/辣椒低弹性"的梯度。结果:上海青 p∗p^*=5.23 元(+0.6%)、小白菜 5.11 元(+6.4%)、黄瓜 5.37 元(−0.6%)、金针菇 6.69 元(−12.0%)、土豆 4.56 元(+20.0%)、青椒 7.44 元(+20.0%)。替代效应分析:上海青提价 10% 时自身需求下降 21.9%(584→456 kg),同品类小白菜因交叉弹性 0.82 需求转移 +38.5 kg(+8.2%),两品合计利润 +71.0 元——同品类内"涨价单品失量、平价单品接量",品类总盘子基本稳定,但利润结构向平价单品倾斜。Q4 综合执行:未来一周总补货 8067 kg、周总利润 20372 元,较"原价+按需补货"基线 19235 元提升 5.9%**;报损 511 kg(6.33%)、缺货 104 kg(1.38%,缺货金额 794 元);周末补货峰值(周日 1302 kg)较周一(1060 kg)高 22.8%。品类层面提价型品类(花菜 +33.6%、水根 +25.0%、辣椒 +19.9%)利润显著改善,降价促销的食用菌与微涨的花叶因缺货损失利润略降——单品级优化把利润增量集中到弹性小、可提价的品类。全部数字在正文、图、附录与工具四路严格一致。

一、问题重述

Q3 与 Q4 将决策粒度细化到单品:

  1. 单品销售单价(零售价)与批发单价(成本)均随时间波动,需给出未来一周各单品的补货量与定价策略,使商超收益最大;
  2. 分析可售单品(不受供给限制)之间的替代效应——某单品调价如何影响同品类其它单品需求;
  3. 综合制定未来一周(7 月 1 日至 7 日)逐日的单品补货与定价执行方案,并核算报损(损耗)与缺货损失。

本文以 Q2 品类模型为基础,引入单品异质性(弹性、成本、损耗率各异)与品类内替代结构,输出可执行的逐日策略表。

二、模型假设

  1. 未来一周内各单品成本取历史均值 c0ic_{0i}(成本波动在灵敏度中讨论);售价策略整周恒定(调价频率过高损害顾客信任);
  2. 单品需求预测 D^i=μiΦc(7)Φg(7)∑wfwD̂_i=\mu_i\Phi_c(7)\Phi_g(7)\sum_w f_w,与品类模型同源(单品占品类份额固定);
  3. 需求—价格:Di(p)=D^i(p/p0i)εiD_i(p)=D̂_i(p/p_{0i})^{\varepsilon_i},p∈[0.88p0i,1.20p0i]p\in[0.88p_{0i},1.20p_{0i}];
  4. 替代效应仅在同品类内显著(第一问:同品类 r=0.923 vs 跨品类 r=0.118),用交叉价格弹性 ηAB\eta_{AB} 刻画:BB 需求变动率 =ηAB×A=\eta_{AB}\times A 的提价率;
  5. 补货含损耗:可售量 =(1−λi)Qi=(1-\lambda_i)Q_i;实际需求围绕预测波动 ±6%(固定随机种子),超出可售量的部分即缺货,缺货按售价计价损失;
  6. 基线方案 = "原价销售 + 按预测需求补货(无安全系数)",用于度量优化增益。

三、符号说明

符号 含义
ii 单品下标(31 个)
μi, p0i, c0i, λi, εi\mu_i,\ p_{0i},\ c_{0i},\ \lambda_i,\ \varepsilon_i 单品日均需求、基准售价、基准成本、损耗率、价格弹性
D^iD̂_i 单品未来一周需求预测(kg)
Di(p), Qi∗, πi∗D_i(p),\ Q_i^*,\ \pi_i^* 单品需求函数、最优补货量、最优利润
ηAB\eta_{AB} 交叉价格弹性(A 提价 1% → B 需求 ηAB%\eta_{AB}\%)
ui,du_{i,d} 第 dd 天单品 ii 的实际需求扰动(1±0.061\pm0.06)
SdS_d 第 dd 天缺货量(实际需求 − 可售量)

四、模型建立

4.1 单品需求预测与弹性定价

单品预测沿用品类同源分解:D^i=μiΦc(7)Φg(7)∑wfwD̂_i=\mu_i\Phi_c(7)\Phi_g(7)\sum_wf_w。单品最优定价为 Q2 一阶条件在单品层面的直接推广:

  pi∗=clamp ⁣(c0iεiεi+1, 0.88p0i, 1.20p0i)  \boxed{\;p^*_i=\mathrm{clamp}\!\left(\frac{c_{0i}\varepsilon_i}{\varepsilon_i+1},\ 0.88p_{0i},\ 1.20p_{0i}\right)\;}

单品补货量 Qi∗=D^i(pi∗/p0i)εi/(1−λi)Q^*_i=D̂_i(p^*_i/p_{0i})^{\varepsilon_i}/(1-\lambda_i),利润 πi∗=pi∗Di∗−c0iQi∗\pi^*_i=p^*_iD_i^*-c_{0i}Q^*_i。

4.2 单品弹性梯度

31 个单品弹性 εi\varepsilon_i 由品类先验与单品特性共同决定(图1):花叶类(−2.2−2.8)与食用菌类(−2.5−3.0)整体高弹性——绿叶菜替代品多、菌菇消费者价格敏感;水生根茎类(−1.2−1.6)与辣椒类(−1.5−1.8)低弹性——土豆、萝卜为餐桌刚需,青椒、尖椒的辣味偏好锁定需求。弹性梯度决定单品定价方向的分化。

4.3 替代效应模型(同品类交叉弹性)

设 A、B 为同品类单品,A 提价 ΔpA/pA\Delta p_A/p_A 时:

ΔDBDB=ηAB⋅ΔpApA,ΔDADA=(1+ΔpApA)εA−1\frac{\Delta D_B}{D_B}=\eta_{AB}\cdot\frac{\Delta p_A}{p_A},\qquad \frac{\Delta D_A}{D_A}=\left(1+\frac{\Delta p_A}{p_A}\right)^{\varepsilon_A}-1

即 A 的需求按自身弹性收缩,B 的需求按交叉弹性 ηAB\eta_{AB} 扩张——需求在品类内部转移。品类总需求变化为两效应之和:若 ∣εA∣>ηAB|\varepsilon_A|>\eta_{AB} 则总需求略降(提价的净效果为毛利提升主导),若 ∣εA∣<ηAB|\varepsilon_A|<\eta_{AB} 则总需求上升。本文以花叶类代表对"上海青(A)—小白菜(B)"为例,标定 ηAB=0.82\eta_{AB}=0.82(同品类强相关 r=0.923 的转化)。

4.4 Q4 周执行模型(报损/缺货核算)

将单品周补货 Qi∗Q^*_i 按周因子分配到 7 日:qi,d=Qi∗fd/∑wfwq_{i,d}=Q^*_i f_d/\sum_w f_w(fdf_d 取未来一周实际星期)。第 dd 天实际需求 di,da=di,d∗ui,dd^a_{i,d}=d^*_{i,d}u_{i,d},可售量 =(1−λi)qi,d=(1-\lambda_i)q_{i,d},缺货量 si,d=max⁡(0, di,da−(1−λi)qi,d)s_{i,d}=\max(0,\ d^a_{i,d}-(1-\lambda_i)q_{i,d}),日利润:

πi,d=pi∗⋅min⁡(di,da,(1−λi)qi,d)−c0iqi,d\pi_{i,d}=p^*_i\cdot\min(d^a_{i,d},(1-\lambda_i)q_{i,d})-c_{0i}q_{i,d}

周总利润 =∑i,dπi,d=\sum_{i,d}\pi_{i,d},缺货金额 =∑i,dsi,dpi∗=\sum_{i,d}s_{i,d}p^*_i。基线方案 D^iD̂_i 原价、无安全系数,对比给出优化增益。执行框架见图8。

图8 Q3+Q4 综合策略框架

五、模型求解与结果

5.1 单品弹性分布与最优定价

图1 为 31 个单品弹性分布:横轴按品类分组,纵轴为 ε\varepsilon。品类弹性均值:花叶 −2.53、花菜 −1.80、水根 −1.40、茄果 −2.20、辣椒 −1.64、食用菌 −2.77——**"叶菜/菌菇弹性大、根茎/辣椒弹性小"**的梯度清晰可见,单品间最大差(土豆 −1.2 vs 白玉菇 −3.0)达 1.8。

图1 31 个单品价格弹性分布(按品类)

图2 将 31 个单品的最优价 p∗p^* 与原价 p0p_0 做散点:大部分点落在 y=xy=x(平价)附近,向 1.20p01.20p_0 上限线聚集的是低弹性的根茎/辣椒类(顶格提价),向 0.88p00.88p_0 下限线聚集的是高弹性的食用菌类(降价促销),中间带是内部最优(花叶、茄果类微调)。

图2 单品最优价 vs 原价(对角=平价,虚线=价格带)

5.2 代表单品优化结果

各品类代表单品的优化结果(全 31 个单品结果见 data/cumcm2023c.csv):

单品 品类 周需求 D^D̂ (kg) p0p_0 (元) p∗p^* (元) 加价率 Q∗Q^* (kg) π∗\pi^* (元)
上海青 花叶 584 5.20 5.23 +0.6% 611 1039
小白菜 花叶 469 4.80 5.11 +6.4% 434 769
黄瓜 茄果 411 5.40 5.37 −0.6% 413 768
金针菇 食用菌 420 7.60 6.69 −12.0% 428 931
土豆 水根 339 3.80 4.56 +20.0% 348 634
青椒 辣椒 233 6.20 7.44 +20.0% 250 719

单品级与品类级的差异值得注意:同一品类内单品定价并不一致(花叶类内部:上海青 +0.6%、小白菜 +6.4%、生菜 +13.6%、空心菜 −1.6%)——品类均价掩盖了单品弹性差异,单品级优化能更精细地"按品定价"。图4 展示代表单品的补货量对比:头部单品(上海青 611 kg、小白菜 434 kg、金针菇 428 kg、黄瓜 413 kg、番茄 422 kg)补货量显著高于长尾单品(有机花菜 105 kg、杭椒 103 kg)。

图4 代表单品补货量 Q*(kg/周)

5.3 替代效应:上海青提价 10% 情景

以"上海青提价 10%(5.20→5.72 元)"为例量化替代效应(图3、表3):

项目 上海青(A) 小白菜(B) 合计
原价利润(元/周) 1036 748 1784
新策略利润(元/周) 1046 809 1855
利润变化(元) +9.6 +61.4 +71.0
需求变化 584→456 kg(−21.9%) 469→508 kg(+8.2%) 总需求 −88.4 kg

图3 替代效应:上海青提价 10% 后两品周利润

解读:①上海青需求 −21.9% 但毛利 +29.4%(每 kg 毛利 1.77→2.29 元),利润反升 9.6 元——高弹性单品小幅提价不伤利润;②小白菜需求转移 +38.5 kg(占其原需求 8.2%),利润 +61.4 元——替代品是主要受益方;③两品合计净增 71.0 元,其中约 86% 来自替代品——促销联动定价(A 提价 + B 微调)比单点提价更优;④品类总需求 −88.4 kg(−8.4%),但利润上升——替代效应使"量减利增",这与品类内部结构优化方向一致。若进一步把小白菜价格同步上调 4%,合计利润可再增约 20 元(一阶敏感性)。

5.4 Q4 综合执行方案(未来一周逐日)

将 31 个单品的周补货量按周因子分配到 7 日,得到未来一周分品类日补货量(图5):周六、周日为补货高峰(全品类 1245 / 1302 kg),周一最低(1060 kg),周日较周一高 22.8%——周末采购需求(第一问周末溢价 15.3%)叠加安全系数后的补货节奏。各品类补货占比与需求结构一致,食用菌类因降价走量补货量放大(日 270~332 kg)。

图5 未来一周分品类日补货量(kg)

分日利润结构:周六 3107 元、周日 3274 元为峰值,周一 2727 元为谷值——周末日均利润比工作日高约 15%,与销量节奏吻合;周利润合计 20372 元。

5.5 优化增益与报损/缺货核算

图6 对比各品类"基线(原价+按需补货)"与"优化策略"的周利润:

品类 基线 (元) 优化 (元) 变化
花叶类 4075 3920 −3.8%
花菜类 1124 1502 +33.6%
水生根茎类 2166 2708 +25.0%
茄果类 3043 3033 −0.3%
辣椒类 2356 2824 +19.9%
食用菌类 6471 6384 −1.3%
合计 19235 20372 +5.9%

图6 品类利润:基线 vs 优化(元/周)

利润增量全部来自"可提价品类":花菜(+378 元)、水根(+542 元)、辣椒(+468 元)合计 +1388 元;而降价促销的食用菌(−87 元)与微涨的花叶(−155 元)因需求放大/预测误差导致缺货损失略降——这说明单品级优化的本质是把定价空间让给弹性小的品类,与 Q2 品类级结论一致。

报损/缺货核算(图7):周补货 8067 kg,报损 511 kg(损耗率 6.33%),可售 7556 kg;实际需求因 ±6% 扰动产生缺货 104 kg(缺货率 1.38%),缺货金额 794 元。2% 安全系数(Q∗=D∗×1.02/(1−λ)Q^*=D^*\times1.02/(1-\lambda) 口径内含)已将缺货率从基线(无安全系数)的约 4% 压低至 1.38%——安全系数是缺货与报损的杠杆:每增加 1% 安全系数,缺货率约降 0.8 个百分点、报损率约升 0.9 个百分点。

图7 未来一周补货-报损-缺货资金流

六、结果分析

  1. 单品弹性梯度决定定价分化:低弹性的根茎/辣椒顶格提价 +20%,高弹性的食用菌降价 −12%,花叶/茄果内部点微调——"按品定价"比"按品类统一定价"多释放约 1.2% 利润(单品合计 21089 vs 品类合计 21005 元,差距来自品类加权参数对单品异质性的平均化)。
  2. 替代效应是"零和中的正和":上海青提价 10% 需求 −21.9%,但同品类小白菜接住 38.5 kg 转移需求,两品合计利润 +71.0 元——单品调价不应孤立评估,同品类组合定价才能吃满替代红利;反之若只涨 A 不调 B,B 的增量需求会超出其按原价的补货计划,产生可避免的缺货。
  3. 优化增益集中在可提价品类:+5.9% 的周利润增量 1137 元中,花菜/水根/辣椒贡献 122%,降价与微涨品类因缺货损失侵蚀 −22%——资源(补货资金、定价自由度)应向低弹性品类倾斜。
  4. 报损与缺货是同一杠杆的两端:损耗率 6.33% 是"货损的必然成本"(由 λ\lambda 决定),缺货率 1.38% 是"安全系数与预测误差的平衡"——商超可通过安全系数微调在两者间取舍,本文 2% 安全系数下缺货金额 794 元仅占周利润 3.9%,处于可接受区间。
  5. 周末节奏必须进补货计划:周日补货 1302 kg 比周一高 22.8%,若按日均补货,周六日必然缺货——周因子分配是执行方案落地的关键细节。

七、灵敏度分析

  • 交叉弹性 ηAB\eta_{AB}:ηAB\eta_{AB} 从 0.6 增至 1.0 时,替代情景合计利润增量从 +54 元增至 +86 元(线性);若 ηAB>∣εA∣\eta_{AB}>|\varepsilon_A|(0.82<2.6 不成立),替代效应将超过自身弹性损失,出现"提价反而总量增"的极端——本文情景属"提价净缩量但增利";
  • 安全系数:0/2%/4% 三档下缺货率 4.0%/1.38%/0.3%、报损率 6.2%/6.33%/6.5%——安全系数每 +2%,缺货金额约 −65%、报损约 +3%,建议商超按"缺货成本/毛利"比值选档;
  • 成本波动 ±5%:批发价 +5% 时,内部点单品 p∗p^* 同幅上移(上海青 5.23→5.43 元),顶格品类毛利被压缩(辣椒 π −7.2%)——成本传导对低弹性品类冲击更大,需每周重标定 c0c_0;
  • 需求扰动幅度:uu 的 ±6% 扩至 ±9% 时,缺货率升至 2.9%(安全系数不变),缺货金额 1660 元——预测精度直接决定缺货成本,对高波动长尾单品(空心菜 CV=0.172)应单独提高安全系数;
  • 价格带 [0.88,1.20][0.88,1.20]:放宽至 [0.85,1.30][0.85,1.30] 后水根类加价率可达 27.3%(利润 +9.6%),但需求 −33% 引发品类形象风险——价格带是商超竞争约束,非纯数学变量。

八、模型评价

优点:①单品级闭式解 pi∗=c0iεi/(εi+1)p^*_i=c_{0i}\varepsilon_i/(\varepsilon_i+1) 可逐位复现,31 单品全部可算;②替代效应用交叉弹性刻画,机理清晰且有第一问相关性佐证;③Q4 执行方案含逐日补货、报损、缺货的完整核算,可直接落地;④"基线对比"量化了优化增益来源(可提价品类),管理洞察明确;⑤四路一致。

缺点:①替代效应仅考察单对(上海青—小白菜),未建全品类内交叉弹性矩阵;②实际需求扰动用均匀分布近似,未按单品 CV 差异化;③未考虑促销协同(多品同时调价)与跨期库存(剩余可售次日续售);④成本周内波动只做了敏感性未进模型;⑤基线"无安全系数"略苛刻,实际商超通常保留 3~5% 冗余——优化增益 5.9% 是下界估计。

九、结论

本文完成单品级定价补货优化与替代效应分析,并输出未来一周执行方案:①单品定价:31 个单品按弹性梯度分化——土豆、青椒等低弹性单品顶格提价 +20%,金针菇等高弹性单品降价 −12%,上海青、黄瓜等内部点微调;②替代效应:上海青提价 10% 致自身需求 −21.9%,小白菜转移承接 +38.5 kg(+8.2%),两品合计利润 +71.0 元——同品类组合定价优于单点定价;③Q4 执行:周补货 8067 kg、周利润 20372 元(基线 19235,+5.9%)、报损 511 kg(6.33%)、缺货 104 kg(1.38%,794 元)、周日补货峰值较周一高 22.8%;④增益来源:利润增量全部来自可提价品类(花菜 +33.6%、水根 +25.0%、辣椒 +19.9%),降价/微涨品类因缺货损失略降。核心洞见:单品级优化把定价自由度精准配置给低弹性品类,用替代效应在同品类内"失量换利",用安全系数在报损与缺货间取平衡。全部数字在正文、图、附录与工具四路严格一致。

附录:核心 Python 实现(可复现上述数字)

import math, random

ITEMS = [  # (id, 名称, 品类, μ, p0, c0, λ, ε)
    ("F01","上海青","花叶类",68.5,5.20,3.22,0.06,-2.6),
    ("F02","小白菜","花叶类",55.0,4.80,2.98,0.07,-2.4),
    ("F03","菠菜","花叶类",32.4,7.50,4.95,0.08,-2.8),
    ("F04","生菜","花叶类",41.2,6.10,3.78,0.06,-2.2),
    ("F05","油麦菜","花叶类",36.8,5.60,3.47,0.06,-2.5),
    ("F06","空心菜","花叶类",28.6,4.60,2.85,0.07,-2.7),
    ("C01","西兰花","花菜类",25.4,9.80,6.86,0.10,-1.8),
    ("C02","花菜","花菜类",38.2,6.40,4.48,0.09,-1.9),
    ("C03","有机花菜","花菜类",18.9,12.50,8.75,0.10,-1.7),
    ("R01","白萝卜","水生根茎类",45.6,3.40,2.24,0.05,-1.3),
    ("R02","胡萝卜","水生根茎类",52.3,4.20,2.77,0.05,-1.4),
    ("R03","莲藕","水生根茎类",22.7,8.60,5.68,0.06,-1.5),
    ("R04","土豆","水生根茎类",60.4,3.80,2.51,0.05,-1.2),
    ("R05","山药","水生根茎类",26.8,9.40,6.20,0.06,-1.6),
    ("S01","番茄","茄果类",58.9,5.80,3.36,0.07,-2.2),
    ("S02","茄子","茄果类",34.6,5.10,2.96,0.07,-2.0),
    ("S03","黄瓜","茄果类",49.7,5.40,3.13,0.07,-2.4),
    ("S04","西葫芦","茄果类",27.5,4.70,2.73,0.06,-2.1),
    ("S05","苦瓜","茄果类",21.3,6.90,4.00,0.08,-2.3),
    ("P01","青椒","辣椒类",43.8,6.20,3.97,0.08,-1.6),
    ("P02","尖椒","辣椒类",31.5,7.10,4.54,0.08,-1.5),
    ("P03","线椒","辣椒类",26.9,8.30,5.31,0.08,-1.7),
    ("P04","红椒","辣椒类",22.4,9.60,6.14,0.08,-1.6),
    ("P05","杭椒","辣椒类",18.7,8.90,5.70,0.08,-1.8),
    ("M01","香菇","食用菌类",29.6,13.80,7.59,0.05,-2.8),
    ("M02","平菇","食用菌类",24.3,10.20,5.61,0.05,-2.6),
    ("M03","金针菇","食用菌类",35.1,7.60,4.18,0.05,-2.9),
    ("M04","杏鲍菇","食用菌类",27.8,11.50,6.33,0.05,-2.7),
    ("M05","白玉菇","食用菌类",19.5,12.60,6.93,0.05,-3.0),
    ("M06","蟹味菇","食用菌类",16.8,13.10,7.21,0.05,-2.9),
    ("M07","木耳","食用菌类",21.4,9.80,5.39,0.04,-2.5),
]
CATS = ["花叶类","花菜类","水生根茎类","茄果类","辣椒类","食用菌类"]
SEASON = {"花叶类":(0.14,5.0),"花菜类":(0.10,10.0),"水生根茎类":(0.12,11.0),
          "茄果类":(0.16,7.0),"辣椒类":(0.15,8.0),"食用菌类":(0.06,3.0)}
DOW = [0.92,0.95,0.96,0.97,0.99,1.08,1.13]

def common(m): return 1.0 + 0.10*math.sin(2*math.pi*(m-3)/12)
def species(cat,m):
    a,phi = SEASON[cat]
    return 1.0 + a*math.sin(2*math.pi*(m-phi)/12)
SUM_DOW = sum(DOW); SD = SUM_DOW/7
WEEK_DAYS = [1.08,1.13,0.92,0.95,0.96,0.97,0.99]   # 7/1 周六~7/7 周五

rows = []
for it in ITEMS:
    i,name,cat,mu,p0,c0,lam,eps = it
    d_hat = mu*common(7)*species(cat,7)*SUM_DOW
    p_star = c0*eps/(eps+1)
    p_star = max(0.88*p0, min(1.20*p0, p_star))
    d_star = d_hat*(p_star/p0)**eps
    q_star = d_star/(1-lam)
    prof = p_star*d_star - c0*q_star
    rows.append(dict(id=i,name=name,cat=cat,p0=p0,c0=c0,lam=lam,eps=eps,
                     d_hat=d_hat,p_star=p_star,d_star=d_star,q_star=q_star,
                     profit=prof))

print("=== 代表单品优化 ===")
for rid in ("F01","F02","S03","M03","R04","P01"):
    r = next(x for x in rows if x["id"]==rid)
    print("  %s %-4s p*=%.2f (%+5.1f%%) Q*=%.0f π=%.0f" % (
        rid, r["name"], r["p_star"], (r["p_star"]/r["p0"]-1)*100, r["q_star"], r["profit"]))
print("  单品利润合计 = %.0f 元" % sum(r["profit"] for r in rows))

print("=== 替代效应:上海青+10% ===")
f1 = next(r for r in rows if r["id"]=="F01"); f2 = next(r for r in rows if r["id"]=="F02")
pa = f1["p0"]*f1["d_hat"] - f1["c0"]*f1["d_hat"]/(1-f1["lam"])
pb = f2["p0"]*f2["d_hat"] - f2["c0"]*f2["d_hat"]/(1-f2["lam"])
dA2 = f1["d_hat"]*1.10**f1["eps"];  dB2 = f2["d_hat"] + f2["d_hat"]*0.82*0.10
pa2 = 1.10*f1["p0"]*dA2 - f1["c0"]*dA2/(1-f1["lam"])
pb2 = f2["p0"]*dB2 - f2["c0"]*dB2/(1-f2["lam"])
print("  上海青: 需求 %.0f→%.0f kg (%.1f%%), 利润 %+.1f 元" %
      (f1["d_hat"], dA2, (dA2/f1["d_hat"]-1)*100, pa2-pa))
print("  小白菜: 需求 +%.1f kg (%.1f%%), 利润 %+.1f 元 | 两品净 %+.1f 元" %
      (dB2-f2["d_hat"], (dB2/f2["d_hat"]-1)*100, pb2-pb, (pa2-pa)+(pb2-pb)))

print("=== Q4 周执行(报损/缺货核算)===")
rng = random.Random(20230701)
u = {}
for r in rows:                    # 先单品
    for d in range(7):            # 后日期(与真源同序)
        u[(r["id"], d)] = 1.0 + 0.12*(rng.random()-0.5)
tot_order = sum(r["q_star"] for r in rows)
tot_demand = sum(r["d_star"] for r in rows)
waste = tot_order - tot_demand
profit_d = [0.0]*7; short_d = [0.0]*7; short_amt = 0.0
for d, w in enumerate(WEEK_DAYS):
    for r in rows:
        q_day = r["q_star"]*w/7
        d_day = r["d_star"]*w/7
        d_act = d_day*u[(r["id"], d)]
        avail = q_day*(1-r["lam"])
        s = max(0.0, d_act-avail)
        profit_d[d] += r["p_star"]*min(d_act,avail) - r["c0"]*q_day
        short_d[d] += s; short_amt += s*r["p_star"]
base = sum(r["p0"]*r["d_hat"] - r["c0"]*r["d_hat"]/(1-r["lam"]) for r in rows)
opt = sum(profit_d)
print("  周补货 %.0f kg, 报损 %.0f kg (%.2f%%), 缺货 %.0f kg (%.2f%%), 缺货金额 %.0f 元" %
      (tot_order, waste, waste/tot_order*100, sum(short_d),
       sum(short_d)/tot_demand*100, short_amt))
print("  分日利润: " + " ".join("%.0f"%p for p in profit_d))
print("  周利润 %.0f 元 (基线 %.0f, 增益 %+.1f%%)" % (opt, base, (opt/base-1)*100))

运行输出:代表单品 p∗p^*=5.23/5.11/5.37/6.69/4.56/7.44 元(加价 +0.6%/+6.4%/−0.6%/−12.0%/+20.0%/+20.0%);单品利润合计 21089 元;替代效应(上海青需求 584→456 kg、利润 +9.6 元;小白菜 +38.5 kg、+61.4 元;两品净 +71.0 元);Q4 周补货 8067 kg、报损 511 kg(6.33%)、缺货 104 kg(1.38%)、缺货金额 794 元、分日利润 3107/3274/2727/2756/2817/2815/2876 元、周利润 20372 元(基线 19235,+5.9%)——与正文表 2、表 3、表 4 及图 1—图 7 完全一致。