数学建模竞赛:基于数据驱动的供应链优化与定价补货决策
2026/8/27 10:11:30 网站建设 项目流程

1. 赛题核心与破题方向:从“蔬菜类商品”到“供应链优化”

每年高教社杯全国大学生数学建模竞赛(国赛)的C题,通常被认为是三道题中综合性最强、最贴近实际应用场景的题目。2023年的C题也不例外,它聚焦于一个看似日常却蕴含复杂数学问题的领域:蔬菜类商品的自动定价与补货决策。很多同学拿到题目,看到“蔬菜”、“超市”这些字眼,可能会觉得题目“接地气”,但恰恰是这种贴近生活的背景,往往隐藏着对数学建模综合能力的深度考察。这道题的本质,不是一个简单的预测或分类问题,而是一个典型的数据驱动的供应链优化决策问题

题目给出了某生鲜商超的销售流水明细,要求我们基于历史销售数据,解决两个核心问题:一是对单个品类的蔬菜进行日补货总量定价策略的制定;二是对各个蔬菜品类进行未来一周的日补货总量预测。这直接指向了零售业的核心痛点:如何在需求不确定、商品易损耗(蔬菜有保质期)的情况下,实现利润最大化或成本最小化。因此,破题的关键在于理解,我们不是在做一个纯粹的销量预测,而是在销量预测的基础上,叠加了库存管理和定价决策的优化模型

从数据角度看,题目提供了销售明细,这意味着我们拥有丰富的结构化数据:商品编码、品类、销售量、销售单价、销售日期。这为我们进行时间序列分析、关联规则挖掘、以及构建需求预测模型提供了基础。但题目也留下了巨大的建模空间:如何定义“售罄”?如何量化定价对销量的影响(即需求弹性)?如何将蔬菜的损耗(如腐烂)成本纳入模型?这些都需要我们基于合理的假设,构建数学模型来刻画。

所以,面对这道题,我们的思路不能停留在简单的回归预测上。一个完整的解题框架应该包含:数据预处理与特征工程 → 需求预测模型构建 → 集成定价与库存的联合优化模型 → 模型求解与结果分析。接下来,我将逐一拆解每个环节的核心思路、可选的模型方法以及需要特别注意的“坑”。

2. 数据预处理:从原始流水到建模可用特征

原始销售流水数据是建模的基石,但直接使用往往效果不佳。高效的数据预处理能极大提升后续模型的性能与可靠性。对于C题数据,预处理的核心目标是将原始的交易记录,转化为能够反映每日、每个品类供需状况的特征变量。

2.1 核心数据聚合与关键指标计算

首先,我们需要将数据按日期商品品类(或单品)进行聚合。这是最基本的一步,目的是得到每个品类每日的汇总信息。需要计算的指标至少包括:

  • 日销售总量:这是需求最直接的体现。
  • 日平均销售单价:注意,这里不能简单求均值,因为可能存在促销或价格变动。更合理的做法是计算加权平均单价(销售额/销售量),或者直接分析价格分布。
  • 日销售时长/是否售罄:题目隐含了“售罄”的概念。我们需要定义一个规则来判断某日某品类是否售罄。例如,可以检查该品类在当日最后一条销售记录的时间是否接近营业结束时间,或者当日销售量是否异常高(接近历史峰值)。定义一个二进制变量“是否售罄”作为后续需求预测的重要标签。
  • 日库存水平(需推算):这是一个难点,因为数据中没有直接的进货量。一个合理的假设是:当日初始库存 = 前一日剩余库存 + 当日补货量。而当日剩余库存 = 当日初始库存 - 当日销售量。我们可以设定一个初始库存(如第一天的数据),然后通过迭代和优化来反推每日的大致补货量。更精细的做法是,将“补货量”作为一个待优化的变量,在模型中与销售量一起求解。

2.2 特征工程:构建影响需求的关键变量

仅仅使用历史销量作为特征是不够的。我们需要构建能够解释销量变化的特征。这些特征可以分为以下几类:

  1. 时间特征:这是最重要的特征之一。包括:
    • 绝对时间:年、月、日。
    • 周期特征:星期几(周一至周日)、是否为周末、是否为节假日(需要外部日历数据)、是否为月初/月末。
    • 时序特征:相对于某个固定点(如赛季开始)的偏移量。
  2. 历史销量特征
    • 滞后特征:过去1天、3天、7天、14天、30天的销量。这对于捕捉短期趋势和周期性非常有效。
    • 滚动统计特征:过去N天的平均销量、销量标准差、最大值、最小值。这反映了近期需求的水平和波动性。
    • 同比/环比特征:与上周同一天、上月同一天的销量比。这对具有强周、月周期性的商品尤其重要。
  3. 价格特征
    • 自身价格:当日平均价格、价格相对于近期均值的变动率。
    • 交叉价格:可以考虑相关品类(如替代品、互补品)的价格作为特征,但这需要更复杂的数据关联分析。
  4. 事件与状态特征
    • 是否促销:可以从价格异常降低或销量激增中间接推断。
    • 是否售罄:如前所述,这是一个强标签,也反映了当日供给是否充足。
    • 库存水平(推算):低库存可能抑制销量(缺货),高库存可能伴随促销。

注意:特征不是越多越好。需要进行特征相关性分析、重要性排序(如使用树模型的特征重要性),避免多重共线性。对于时间序列数据,要特别注意避免“未来信息泄露”,即不能用未来的数据(如明天的价格)来预测今天的需求。

2.3 处理缺失值与异常值

生鲜销售数据中,异常值很常见。例如,某天因系统问题记录不全,或某天因大型团购导致销量暴增。对于缺失的日期(如超市歇业),可以考虑直接删除或进行插值(但需谨慎)。对于异常值,需要分析其产生原因:

  • 可解释的异常:如法定节假日、恶劣天气、促销活动导致的销量剧增。这类异常值不应简单删除,而应将其作为特殊事件,通过引入哑变量(0-1变量)来刻画。
  • 不可解释的异常:可能是数据记录错误。可以通过统计方法(如3σ原则)或业务规则进行识别,并采用前后均值填充、中位数填充或直接删除。

3. 需求预测模型选型与构建

在获得干净、富含特征的数据后,下一步就是构建需求预测模型。这是整个课题的基础,预测的准确性直接决定了后续补货和定价决策的质量。模型的选择需要权衡预测精度、可解释性、计算复杂度以及对时序特征的捕捉能力。

3.1 经典时间序列模型

对于有明显趋势和季节性的品类,传统时间序列模型是很好的基线模型。

  • ARIMA/SARIMA模型:适用于平稳或可差分平稳的单变量时间序列。SARIMA是其季节性扩展版本。优点是理论成熟、可解释性强,能提供预测区间。缺点是对多变量外生特征(如价格、促销)的支持较弱,需要手动进行平稳性检验和参数定阶,过程繁琐。
  • 指数平滑模型(如Holt-Winters):同样适用于具有趋势和季节性的序列。它通过加权平均历史数据来预测未来,权重随时间指数衰减。实现简单,对于周期性明显的需求预测效果不错。

实操心得:在国赛有限的时间内,不建议将主要精力花在精细调优ARIMA上。可以将其作为一个基准模型,快速跑出结果,用于对比后续更复杂模型的提升效果。使用statsmodels库可以方便实现。

3.2 机器学习回归模型

当引入了丰富的特征后,机器学习模型通常能取得更好的效果。

  • 树模型(XGBoost/LightGBM):这是本次竞赛的强力推荐模型。它们能自动处理特征间的非线性关系,对缺失值不敏感,并且能够给出特征重要性排序,模型可解释性相对较好。LightGBM在处理大规模数据时效率更高。我们可以将时间序列问题转化为监督学习问题:用过去N天的特征(包括滞后特征)来预测未来第T天的销量。
  • 支持向量回归(SVR)与神经网络:SVR在小样本、非线性问题上表现可能不错,但调参复杂,且对大数据量支持一般。神经网络(如多层感知机MLP、循环神经网络RNN)理论上具有很强的拟合能力,但对于这道题的数据量和赛程时间来说,训练、调参成本高,容易过拟合,且可解释性差,不是首选。

构建监督学习框架的关键步骤

  1. 定义训练集和测试集绝对不能随机划分!必须按时间顺序划分。例如,用前80%的日期数据做训练,后20%做测试,以模拟真实的预测场景。
  2. 创建滞后特征:这是将时间序列转化为表格数据的关键。为每个样本(某天某品类)添加过去几天的销量、价格等作为特征。
  3. 模型训练与验证:使用时间序列交叉验证(TimeSeriesSplit),而不是普通的K折交叉验证,来评估模型性能,防止信息泄露。
  4. 性能评估:回归问题常用的指标有均方根误差(RMSE)、平均绝对误差(MAE)、平均绝对百分比误差(MAPE)。MAPE由于具有百分比解释性,在此类业务问题中更受青睐。

3.3 集成策略与模型融合

单一模型可能有其局限性。可以采用模型融合策略来提升预测的稳健性和精度。

  • 简单加权平均:将ARIMA、LightGBM等不同模型的预测结果进行加权平均。权重可以根据各模型在验证集上的表现(如RMSE的倒数)来确定。
  • Stacking:用初级模型(如ARIMA、LightGBM)的预测结果作为新特征,训练一个次级模型(如线性回归)进行最终预测。这种方法潜力更大,但实现更复杂,需要小心过拟合。

避坑指南:很多队伍在预测环节花费过多时间追求极致的预测精度(如MAPE降低0.5%),而忽略了本题的核心是“决策优化”。预测模型达到一个合理的精度(例如,在测试集上MAPE小于15%)后,就应及时进入下一阶段。决策模型对预测误差有一定的鲁棒性。

4. 定价与补货联合优化模型

这是本题的精华和难点所在。我们需要建立一个数学模型,在需求预测的基础上,同时决定补货量销售价格,以实现商超的目标(通常是日均利润最大化)。这本质上是一个随机优化问题或动态规划问题,因为未来的需求是不确定的。

4.1 模型要素定义

首先,我们需要明确定义模型中的各个要素:

  • 决策变量
    • Q_t:第t天对某品类的补货量(决策变量)。
    • P_t:第t天该品类的销售单价(决策变量)。
  • 状态变量
    • I_t:第t天开始时的库存水平。I_t = I_{t-1} + Q_{t-1} - D_{t-1},其中D_{t-1}是第t-1天的实际需求量。
  • 外部输入
    • D_t(P_t):第t天的需求量,它是价格P_t的函数,同时也是一个随机变量。我们可以用上一节的需求预测模型来估计其期望值E[D_t | P_t],并估计其波动性(方差)。
    • C:蔬菜的单位进货成本(假设恒定或可从数据中推算)。
    • S:蔬菜的单位残值(过期后处理的价格,通常远低于成本,甚至为负表示处理成本)。
    • H:单位库存持有成本(每日)。
  • 目标函数:最大化计划期(如T天)内的总期望利润。总利润 = Σ_{t=1}^T [ 销售收入 - 进货成本 - 缺货损失 - 持有成本 - 损耗成本 ]其中:
    • 销售收入 =P_t * min(实际需求量, 可用库存)
    • 缺货损失:当需求大于库存时,损失了潜在的销售收入。可以引入缺货惩罚系数。
    • 损耗成本:期末未售出库存的损失(C - S) * 期末剩余库存

4.2 需求作为价格的函数:价格弹性

这是连接定价与补货的关键。我们需要刻画需求量如何随价格变动,即需求的价格弹性。一个常用的模型是线性需求函数:D_t(P_t) = a_t - b_t * P_t + ε_t其中,a_t表示第t天的潜在市场规模(受星期、季节等因素影响),b_t是价格敏感系数,ε_t是随机误差项。

如何估计参数a_t和b_t?我们可以利用历史数据,对不同日期类型(如周一、周末)分别进行回归分析。将历史数据中的“日销量”作为因变量,“日平均价格”作为自变量,同时控制其他时间特征(星期几、节假日等),进行线性回归,得到的斜率就是b的估计值,截距结合其他特征值可以反映a_t

4.3 优化模型建立与简化求解

完整的随机动态规划模型求解非常复杂。在竞赛中,我们可以采用合理的简化,将其转化为一个确定性规划模型两阶段模型

方法一:基于期望值的确定性模型假设我们忽略随机性,用需求的期望值E[D_t(P_t)]代替随机需求D_t(P_t)。那么,对于单品类单日的问题,模型可以简化为:

Maximize: Profit = P * min(Q, D(P)) - C * Q - h * I (忽略损耗和缺货细节) Subject to: D(P) = a - b*P (需求函数) P, Q >= 0

这是一个带约束的非线性规划问题(因为目标函数中有min函数和P*D(P)项)。我们可以进一步分析:

  • 最优定价P*可以通过求导得到,当需求函数为线性时,P* = (a + C) / (2b)。这是经典的经济学定价公式。
  • 给定最优价格P*,可以计算出对应的期望需求D* = a - bP*
  • 最优补货量Q*则应考虑需求的不确定性。一个经典的方法是Newsvendor Model(报童模型)。在报童模型中,最优补货量满足:F(Q*) = (P - C) / (P - S),其中F(·)是需求量的累积分布函数。(P - C) / (P - S)被称为临界分位数。这意味着,我们应该让补货量满足“需求小于等于该量的概率”等于这个临界比值。这个比值衡量了“多进货一个单位带来的边际收益(售出赚P-C)”与“边际损失(未售出亏C-S)”之间的权衡。

方法二:分阶段决策框架我们可以将问题分解为两个阶段:

  1. 预测阶段:使用时间序列/机器学习模型,预测未来一段时间内在不同价格水平下的需求分布。这需要我们对多个潜在价格点进行预测模拟。
  2. 优化阶段:将预测结果(需求分布)输入到一个优化模型中。这个优化模型可以是一个数学规划模型(如混合整数规划),其决策变量是每日的价格和补货量,目标函数是期望利润最大化,约束包括库存平衡方程、价格变动范围等。可以使用PuLP(Python)或Lingo等优化求解器来求解。

核心技巧:对于多品类联合补货,问题会更复杂,因为可能存在总库存容量、总补货预算等约束。这时,优化模型就升级为一个带约束的多商品报童问题。我们可以先按单品类分别计算其“单位资源贡献率”(如期望利润/占用库存空间),然后按照贡献率高低,在总约束下分配资源。这体现了运筹学中的“贪婪算法”思想。

5. 模型求解、结果分析与论文呈现

有了模型,最后一步就是求解并将思路清晰地展现在论文中。这部分直接决定了论文的评分。

5.1 求解工具与实现

  • 预测模型:Python的scikit-learn,lightgbm,statsmodels库是绝对主力。数据处理用pandas,可视化用matplotlibseaborn
  • 优化模型
    • 对于简单的解析解(如报童模型公式),直接编程计算即可。
    • 对于复杂的数学规划,推荐使用PuLP(适合线性/整数规划)或CVXPY(适合凸优化)等建模库,调用如CBCGLPK(免费)或GurobiCPLEX(学术免费许可)等求解器。
  • 模拟验证:由于我们的模型基于许多假设(如需求分布形式),必须进行蒙特卡洛模拟来验证策略的有效性。即,根据估计的需求分布,随机生成成千上万条可能的需求路径,然后在每条路径上模拟运行我们制定的补货定价策略,计算平均利润、缺货率、损耗率等指标,并与一些基准策略(如固定补货量、固定价格)进行比较。

5.2 结果分析维度

在论文中,不能只给出冷冰冰的“第几天补多少,定多少价”的表格。必须进行深入分析:

  1. 敏感性分析:关键参数(如进货成本C、价格弹性b、损耗残值S)的变化,如何影响最优决策和最终利润?这能体现模型的稳健性和你的思考深度。
  2. 策略对比:将你的优化策略与几种简单策略对比,例如:
    • 经验策略:每日补货量为前几日平均销量。
    • 单纯预测策略:按预测需求补货,价格固定。
    • 通过对比平均利润、缺货频率、库存周转率等指标,突出你模型的优越性。
  3. 可视化呈现:用图形展示需求预测的效果(预测值与实际值对比图)、价格与销量的关系散点图、库存水平随时间变化的模拟图、不同策略的利润分布箱线图等。一图胜千言。

5.3 论文书写要点

国赛论文评审时间紧,清晰的逻辑和专业的呈现至关重要。

  • 摘要:用一段话浓缩整个工作:针对什么问题,用了什么方法(具体到模型名称,如“结合LightGBM需求预测与报童模型的联合优化框架”),得到了什么结果(关键指标提升百分比),有何特色与结论。避免空洞描述。
  • 模型假设:清晰列出所有主要假设(如需求服从正态分布、价格弹性为常数、不考虑竞争对手等),并说明其合理性。这是建模严谨性的体现。
  • 符号说明:在模型建立前,用表格列出所有主要变量、符号及其含义。
  • 模型建立:分小节阐述,从问题分析到模型推导,逻辑连贯。重点公式需编号并做解释。
  • 模型求解:说明使用了什么软件、什么算法、关键参数如何设置。
  • 优缺点与推广:客观评价自己模型的优点(如贴合实际、考虑全面)和缺点(如假设较强、未考虑某因素),并提出可行的改进方向或推广到其他场景(如其他生鲜产品、电商库存管理)。这体现了思维的完整性。

最后一点个人体会:数学建模竞赛,尤其是国赛,比拼的不仅仅是模型的高深和复杂,更是问题分析的透彻性、模型假设的合理性、求解过程的严谨性以及论文表述的清晰性。对于C题这种开放性的优化问题,选择一个清晰的、可实现的、逻辑自洽的建模路径,远比堆砌复杂算法但解释不清要有效得多。从数据清洗到特征构建,从预测到优化,每一步都要想清楚“为什么这么做”,并在论文中讲好这个“故事”。祝各位在比赛中能稳定发挥,取得好成绩。

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

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

立即咨询