ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

数学建模实战:基于需求预测与动态优化的生鲜商品定价补货决策

数学建模实战:基于需求预测与动态优化的生鲜商品定价补货决策 1. 项目概述从“卖菜”到“算菜”的决策革命去年国赛C题“蔬菜类商品的自动定价与补货决策”乍一看像是个超市运营问题但内核其实是一场对数据驱动决策能力的综合大考。我身边不少参赛队伍包括我带的学生一开始都低估了它的难度以为就是套几个预测模型、算个经济订货批量EOQ就完事了。结果一上手才发现从一堆看似杂乱无章的销售流水和损耗数据里理出定价和补货的逻辑再把它变成一个能自圆其说的数学模型每一步都是坑。这道题的核心是要求我们扮演一个“智能店长”的角色。给你过去三年多某个超市各种蔬菜的销售明细包括每天卖了什么、卖了多少钱、损耗了多少还有简单的成本信息。你的任务就两个第一建立模型给未来一周的蔬菜定个合理的价第二告诉采购员每天每种菜该进多少货。听起来是不是挺接地气但“合理”二字背后需要平衡的要素太多了你要保证超市有得赚利润不能让货架空着满足需求还得尽量减少菜烂在仓库里控制损耗同时价格不能太离谱把顾客吓跑。这绝对不是简单的“进价加20%”或者“昨天卖多少今天就进多少”。它考察的是对商业逻辑的理解、对时间序列数据的处理能力、对优化模型的构建技巧以及如何将复杂的现实问题抽象成数学语言的能力。接下来我就结合我们当时的解题思路和赛后复盘把这道题从问题理解、模型构建到编程实现的完整链条拆解清楚希望能给未来备战数模尤其是涉及运营优化类题目的同学一些实实在在的参考。2. 问题拆解与核心思路把大问题切成小块面对这种多目标、多约束的决策问题最忌讳的就是想用一个“大而全”的模型一口吃成胖子。我们的策略是“分而治之”将定价和补货这两个强相关的决策分解成相对独立又相互衔接的模块来处理。2.1 定价决策寻找市场均衡点定价不是孤立的它直接受供需关系影响。我们的核心思路是需求预测驱动定价。也就是说我们先要尽可能准确地预测出未来一段时间题目要求是未来一周每种蔬菜的需求量然后基于预测的需求、成本以及我们希望达到的商业目标如利润最大化、损耗最小化等来反推出一个“最优”价格。这里的关键在于需求本身又是价格的函数——菜卖得贵买的人可能就少卖得便宜可能就抢得快。这就形成了一个“价格-需求”的反馈环。因此一个更精细的模型需要考虑需求的价格弹性。简单来说就是价格变动1%需求量会变动百分之几。对于蔬菜这种生活必需品弹性可能较小但对于一些可有可无的“精品蔬菜”弹性可能就比较大。在题目数据有限的情况下我们可以通过历史数据中价格与销量的变化关系粗略估计出每种蔬菜的需求弹性系数这能让我们的定价模型更贴近现实。定价模型的目标函数通常是最大化日均利润或综合收益。约束条件包括价格不能低于成本否则亏本不能高于某个上限避免无人问津以及价格变动最好平滑避免今天白菜1块明天5块吓跑顾客。我们最终构建了一个以预测需求为基础纳入成本、损耗成本和需求弹性的非线性规划模型来求解每日最优价格。2.2 补货决策在库存的钢丝上跳舞补货决策与定价紧密相连因为定价影响了需求预测而需求预测直接决定了补货量。补货的核心矛盾是库存成本与缺货成本的权衡。进多了卖不完就损耗占用资金和冷库空间进少了货架空空如也错过销售机会顾客满意度下降。我们采用了经典的报童模型思想的扩展。报童模型解决的是单周期、不确定需求下的最优订货量问题其精髓是找到一个“临界点”使得最后一单位产品被卖出的概率等于其“成本-收益比”。对于蔬菜这种多周期、每天都要决策的情况我们需要一个动态的视角。我们的补货模型分两步走确定安全库存考虑到需求预测总有误差我们需要准备一部分“安全库存”来缓冲不确定性。安全库存的水平取决于需求波动的程度标准差和我们希望达到的服务水平比如希望95%的日子不脱销。计算每日订货量每日订货量 未来几天的预测需求之和 安全库存 - 当前库存。这里“未来几天”就是补货提前期。题目中假设当天订货当天凌晨到货所以提前期可以视为0公式简化为订货量 预测的次日需求量 安全库存 - 当前库存。如果算出来是负数则说明库存充足不需要订货。注意这里有一个巨大的坑就是损耗。蔬菜不是工业品它每天都在变质。因此“当前库存”不是一个固定值你需要根据历史损耗率预估从当前到次日销售前的库存损耗用净库存来计算订货量。很多队伍忽略了这一点导致补货模型在模拟时库存虚高。2.3 定价与补货的联动迭代定价和补货不是一次性算完就完事的它们需要在一个模拟系统中迭代。我们的整体框架是这样的基于历史数据初始化模型参数如需求弹性、损耗率、需求波动率。对于未来要模拟的每一天步骤一定价输入当前的库存、成本等信息结合需求预测模型该模型考虑了历史价格的影响运行定价优化模型得出当天的推荐售价P_t。步骤二需求预测更新将推荐售价P_t代入需求函数得到基于新价格调整后的当日需求预测值D_t。步骤三补货基于调整后的需求预测D_t、当前实际库存I_t和安全库存水平运行补货模型得到当日订货量Q_t。步骤四模拟运营在模拟环境中执行销售销售量受实际需求随机性影响、损耗按比例减少库存、到货增加库存Q_t等操作更新库存状态至I_{t1}。将t1重复步骤一至四。这个动态模拟的过程能让我们评估一套定价-补货策略在较长时期内的综合表现总利润、平均损耗率、缺货率等也是我们论文中需要展示的关键部分。3. 核心模型构建与技术选型详解思路理清了接下来就是选用什么“数学工具”来实现。国赛论文看重模型的合理性与创新性一味堆砌复杂模型不如把基础模型用得巧妙。3.1 需求预测模型ARIMA与回归的组合拳需求预测是整个决策系统的基石。题目给出的数据是典型的销售时间序列数据存在明显的趋势如季节性、节假日效应和随机波动。我们采用了组合预测的思路以提升鲁棒性。主力模型季节性ARIMA (SARIMA)对于表现出明显周期性如每周周期的蔬菜销量SARIMA模型是首选。它的优势在于完全基于数据自身的历史规律进行预测不依赖外部变量。我们使用Python的statsmodels库进行建模关键步骤包括平稳性检验与差分用ADF检验判断序列是否平稳。对于非平稳序列通常都有趋势或季节项通过差分d阶和季节性差分D阶使其平稳。例如对于日数据季节性周期S7一阶季节性差分就能很好地消除周效应。模型识别p, q, P, Q观察差分后序列的自相关图ACF和偏自相关图PACF初步确定自回归阶数p、移动平均阶数q以及它们的季节性分量P、Q。模型拟合与评估用网格搜索寻找最优的(p,d,q)(P,D,Q,S)参数组合以AIC或BIC信息准则最小化为目标。拟合后需检验残差是否为白噪声Ljung-Box检验确保模型已充分提取信息。辅助模型多元线性回归SARIMA虽好但它是“盲预测”不知道明天是不是国庆节、是不是暴雨天。为了纳入这些外生因素我们同时建立了一个多元线性回归模型。特征工程是关键核心特征前1天、前7天、前30天的销量滞后项捕捉自相关性和周期。价格特征当日价格、与前一日价格的比例用于捕捉需求弹性。时间特征星期几哑变量、是否为节假日、月份。这部分需要自己根据日期信息构建。交互特征例如“节假日*星期几”可能产生特殊的消费模式。最终我们将SARIMA的预测结果和回归模型的预测结果进行加权平均权重可通过历史预测误差的倒数来确定作为最终的需求预测值。这种组合能在利用时间序列内在规律的同时响应外部事件的变化。3.2 定价优化模型一个带约束的非线性规划定价模型的目标是最大化单日利润。对于第i种蔬菜在第t天预测需求量D_{it}是价格P_{it}的函数D_{it} f(P_{it})。我们采用线性需求函数D_{it} a_i - b_i * P_{it}其中a_i是潜在最大需求b_i是需求弹性系数可从历史数据回归得到。成本C_{it}包括进货成本和预估的损耗成本。损耗成本可表示为(损耗率 * 库存 * 单位成本)。因此单日利润π_{it} (P_{it} - C_{it}) * D_{it}。定价优化模型可以表述为Maximize: Σ_i π_{it} 总利润最大化或考虑加权 Subject to: 1. P_{it} C_{it} * (1 最低利润率) // 价格下限保证不亏本 2. P_{it} 市场最高接受价格可通过历史最高价或竞品价设定 // 价格上限 3. |P_{it} - P_{i,t-1}| / P_{i,t-1} δ // 价格波动约束δ可取5%-10%保持价格稳定 4. D_{it} 最低展示量 // 保证每日有足够销量维持货架陈列这是一个带约束的非线性规划问题因为利润函数是价格的二次函数。对于参赛而言由于蔬菜种类多但模型结构相同我们可以对每种蔬菜独立求解。使用Python的scipy.optimize.minimize求负利润的最小值可以方便地求解记得选择支持约束的算法如SLSQP。3.3 补货优化模型引入损耗率的动态报童模型经典的报童模型最优订货量Q*满足F(Q*) (p - c) / (p - s)。其中p是售价c是成本s是残值对蔬菜而言s通常为0或处理价F是需求分布的累积分布函数。我们需要对这个模型进行两项关键改造以适应蔬菜补货引入损耗蔬菜的“有效库存”会随时间减少。假设每日损耗率为θ那么今天订货Q_t到明天销售时实际可售库存约为Q_t * (1 - θ)。因此在计算订货量时我们需要用净需求来思考。调整后的临界分位数公式变为F(Q*) (p - c) / (p * (1 - θ))。分母中的p*(1-θ)可以理解为考虑损耗后的“有效售价”。动态安全库存安全库存SS z * σ。其中z是服务水平对应的Z值如95%服务水平对应z≈1.65σ是预测误差的标准差。我们可以在滚动预测的过程中动态计算最近一段时间预测误差的标准差从而使安全库存量能适应需求波动性的变化。最终的每日补货决策逻辑如下当前库存 I_t 次日需求预测 D_{t1}来自组合预测模型 需求预测误差的标准差 σ_t 服务水平对应的Z值 z 每日损耗率 θ_i (按品类) 计算考虑损耗后的净需求预测D_net D_{t1} / (1 - θ_i) 计算安全库存SS z * σ_t 计算目标库存水平TIL D_net SS 计算订货量Q_t max(0, TIL - I_t)这个Q_t就是模型推荐的补货量。它既考虑了未来的需求也考虑了需求的不确定性和库存自身的衰减是一个相对稳健的策略。4. 数据预处理与特征工程磨刀不误砍柴工原始销售数据往往充满“噪音”直接喂给模型效果会很差。数据预处理和特征工程是决定模型上限的关键环节这部分工作可能占整个项目时间的40%以上。4.1 异常值检测与处理销售数据中常出现异常值比如因系统错误记录的巨额销量如9999或因促销、断货导致的销量骤升骤降。方法1统计方法对于每个单品的历史销量计算其均值μ和标准差σ将超出μ ± 3σ范围的数据视为异常值。可以用前后两天的均值进行平滑替换。方法2业务规则结合损耗数据判断。如果某天销量为0但损耗量巨大很可能是当天缺货这个“0”是真实的不应视为异常。如果某天销量远高于正常水平且无促销记录则可能是异常。处理对于确认为异常的数据点我们通常采用线性插值或前后窗口均值的方法进行填补而不是简单删除以保持时间序列的连续性。4.2 缺失值填补某些天可能完全没有某种蔬菜的记录销量、损耗均为空。连续少量缺失同样采用线性插值或季节性插值。连续多日缺失这可能意味着该商品在该时段未上架。此时不宜强行填补销售数据。更合理的做法是在模型训练和预测时将这部分时间段从该商品的数据中剔除或将其视为一个独立的“商品未上架”状态在补货决策时直接建议订货量为0。4.3 关键特征构建这是提升预测模型性能的核心。除了之前提到的滞后项、价格比、时间特征外还有一些高级特征值得尝试滚动统计特征过去7天销量的均值、标准差、最大值、最小值。这能捕捉需求的近期水平和波动情况。事件标志不仅仅是法定节假日还可以构建“周末前一日”周五、“节假日调休工作日”等标志。品类聚合特征对于单个蔬菜可以引入同大类蔬菜如叶菜类、根茎类的整体销量均值作为特征反映品类层面的趋势。天气特征如果数据允许温度、降水量等对蔬菜需求影响显著。虽然本题未提供但在论文中可以将其作为模型可扩展性的一个讨论点。4.4 数据标准化与编码数值特征如销量、价格由于后续的回归模型和优化求解对尺度敏感建议进行标准化Z-score或归一化Min-Max。类别特征如星期几、月份使用独热编码One-Hot Encoding避免引入错误的序关系。实操心得特征工程不是一蹴而就的。我们采用了一个“循环测试”的方法先构建一组基础特征训练模型得到预测结果和特征重要性排名然后分析预测误差较大的样本点思考是否遗漏了某些影响因素据此设计新的特征再加入新特征重新训练观察性能是否提升。这个过程反复进行直到预测精度达到一个稳定且可接受的水平。5. 模型求解、模拟与结果分析模型建好了接下来就是让它们跑起来并评估效果。我们使用Python搭建了一个完整的模拟系统。5.1 编程实现框架我们主要依赖以下Python库pandas,numpy: 数据处理和矩阵运算的基石。statsmodels: 用于构建ARIMA/SARIMA模型。scikit-learn: 用于构建线性回归等机器学习模型以及进行数据标准化、特征工程。scipy.optimize: 用于求解定价优化模型。matplotlib,seaborn: 用于结果可视化。模拟流程的伪代码结构如下# 1. 数据加载与预处理 data load_and_clean_data(sales_data.csv) data create_features(data) # 构建所有特征 # 2. 划分训练集和测试集最后一段时间用于模拟测试 train_data data[data[日期] 2023-06-01] test_start_date 2023-06-01 simulation_days 30 # 3. 初始化模型和参数 for 每种蔬菜 in 蔬菜列表: 训练 SARIMA模型(训练数据) 训练 回归模型(训练数据) 计算 需求弹性系数b, 平均损耗率θ, 需求波动率σ # 4. 开始多周期滚动模拟 results [] current_inventory 初始库存 for day in range(simulation_days): current_date test_start_date timedelta(daysday) daily_decisions {} for 每种蔬菜 in 蔬菜列表: # 步骤A定价 输入 [当前库存 成本 历史价格 历史销量...] 最优价格 solve_pricing_model(输入) # 调用scipy优化器 # 步骤B更新需求预测 调整后需求 demand_function(最优价格) # 使用带价格弹性的需求函数 # 步骤C补货 订货量 calculate_order_qty(调整后需求 当前库存 安全库存 损耗率) # 步骤D记录决策 daily_decisions[蔬菜] {价格: 最优价格 订货量: 订货量} # 步骤E模拟当日运营销售、损耗、到货 实际销量 simulate_sales(调整后需求) # 加入随机扰动 损耗量 current_inventory * 损耗率 订货量 * 在途损耗率 当前库存 current_inventory - 实际销量 - 损耗量 订货量 # 记录本日总体指标 本日总利润 sum(每种蔬菜利润) 本日总损耗率 sum(损耗成本) / sum(销售成本进货成本) results.append({‘日期’: current_date, ‘决策’: daily_decisions, ‘总利润’: 本日总利润 ‘损耗率’: 本日总损耗率})5.2 结果可视化与解读模拟结束后不能只扔出一堆数字必须用图表说话直观展示策略效果。利润趋势图绘制模拟期间每日总利润的折线图。观察利润是否稳定有无周期性波动整体趋势是上升还是下降。与使用简单策略如固定利润率定价、按昨日销量补货的模拟结果进行对比突出优化策略的优势。库存水平图选择几种代表性蔬菜绘制其模拟期间每日库存水平的曲线。健康的库存曲线应该围绕安全库存水平上下波动避免长期处于高位高损耗风险或频繁触底高缺货风险。价格-销量散点图对于主要蔬菜绘制其模拟期内价格与销量的散点图并叠加拟合的需求曲线。这可以直观验证需求弹性模型的合理性看数据点是否大致沿反比例趋势分布。关键指标对比表制作一个清晰的表格对比优化策略与基线策略在多个核心指标上的表现。评估指标优化策略基线策略固定利润率经验补货提升幅度模拟期总利润元158, 420142, 30011.3%平均每日损耗率4.7%6.8%-30.9%平均库存周转天数2.1天3.5天-40.0%缺货发生率1.5%3.2%-53.1%这样的对比能强有力地证明模型的价值。5.3 敏感性分析与模型鲁棒性讨论一个好的模型不仅要结果好还要经得起推敲。我们需要测试模型在不同条件下的稳定性。参数敏感性比如需求弹性系数b估计有误差怎么办我们在其估计值附近如±20%进行扰动重新运行模拟观察总利润等关键指标的变化幅度。如果变化平缓说明模型对参数不敏感鲁棒性好如果变化剧烈则说明模型依赖精确参数在实际应用中风险较高。外部冲击测试模拟一些极端情况比如某热门蔬菜突然因舆情导致需求腰斩或者进货成本短期暴涨20%。观察模型能否通过调整价格和补货量快速适应还是会导致库存积压或利润暴跌。这体现了模型的适应能力。策略对比分析除了和简单基线比还可以设计其他策略如“仅优化定价补货按经验”、“仅优化补货定价按成本加成”然后与我们的“联合优化”策略对比。这样可以量化出定价优化和补货优化各自带来的贡献让分析更有层次。6. 论文写作要点与常见陷阱规避数学建模竞赛“建模”和“论文”各占半壁江山。模型再好表达不清也拿不到高分。6.1 论文结构规划一篇完整的数模论文结构要清晰逻辑要闭环。摘要重中之重用一段话浓缩全部精华。必须包含问题重述用自己话、建模思路用什么方法解决什么问题、主要模型名称、求解方法、关键结论主要数值结果和模型特色创新点。控制在300-500字字字珠玑。问题重述与分析不要照抄题目。用自己的语言梳理问题的背景、目标和约束条件。画出逻辑框图来展示你对问题的分解思路定价、补货、关联这能让评委一眼看清你的思考脉络。模型假设合理的假设是简化问题的关键。假设要具体、合理、必要。例如“假设同一品类内不同单品蔬菜的需求模式相似可共享部分模型参数”“假设损耗主要发生在仓储环节且每日损耗率相对稳定”“假设短期内市场容量和消费者偏好不变”。避免出现“假设数据完全准确”这类不切实际的假设。符号说明将文中用到的主要变量、参数用三线表列出注明含义和单位。规范清晰方便查阅。模型建立与求解这是论文主体。对应之前思路拆解的各个部分分小节详细阐述。每个模型都要讲清为什么用这个模型理由- 模型具体形式公式- 模型中参数如何确定如回归得到、统计得到- 模型如何求解算法、软件。公式要编号推导过程可以放在附录。模型检验与结果分析展示模拟结果、对比图表和敏感性分析。分析要深入不能只说“利润提高了”要说“利润提高了X%主要原因是定价模型通过需求弹性挖掘了高端蔬菜的溢价空间同时补货模型将损耗率降低了Y%两者共同作用...”。模型评价与推广客观评价自己模型的优点如综合考虑多因素、动态联动和缺点如未考虑竞争对手定价、假设损耗率固定。提出可行的改进方向如引入机器学习预测、结合天气数据。将模型推广到其他类似场景如生鲜电商、便利店货品管理。参考文献与附录参考文献格式要规范。附录可以放核心代码片段、大量中间结果表格、详细的数据预处理步骤等。6.2 常见陷阱与避坑指南根据评审经验和赛后交流以下几个坑踩中了很容易失分误区一预测模型追求绝对精度忽视业务逻辑。一味追求预测误差最小化用了非常复杂的LSTM、XGBoost但模型可解释性差且预测出的未来需求可能为负数这显然不符合业务常识。在数模中合理比复杂更重要。一个能清晰解释、结果符合常识的线性回归或ARIMA往往比一个黑箱的复杂模型得分更高。误区二定价与补货模型割裂。分别建立了定价模型和补货模型但两者之间没有数据流交互。在论文中表现为两个独立的章节没有说明“定价模型输出的价格如何影响补货模型的输入需求”。必须强调并展示二者的联动迭代过程这是本题的核心考点之一。误区三忽略损耗或处理不当。很多队伍只在计算成本时考虑了损耗但在补货决策时用的还是原始需求预测和原始库存没有将损耗作为库存的“减项”动态考虑进去。这会导致补货量系统性偏高。必须在补货公式中明确体现损耗率的影响。误区四模型求解部分一笔带过。只说“我们使用Python求解”这是不够的。需要说明用了哪个库的哪个函数如scipy.optimize.minimize(method‘SLSQP’)关键参数如何设置为什么选择这个算法如SLSQP适合处理带约束的非线性规划。这体现了你真正实现了模型而不只是空谈理论。误区五结果分析空洞没有对比。只给出了自己模型运行的结果没有与任何基准策略进行比较。无法证明你的模型是“优”的。至少设计一个“凭经验决策”的基线模型进行对比才能凸显优化价值。误区六论文像实验报告缺乏逻辑主线。论文不是代码说明书不能堆砌公式和图表。要用文字串联起整个故事我们遇到了什么问题 - 我们是如何分解问题的 - 针对每个子问题我们选择了什么模型及原因 - 这些模型如何连接成一个系统 - 这个系统运行效果如何 - 它好在哪里还有何不足。保持强烈的逻辑递进关系。最后在模拟测试时我们曾因为初始安全库存设置过低导致模拟前几天频繁缺货拉低了整体利润。后来我们调整策略在模拟初期采用一个较高的安全库存系数运行一段时间待模型“热身”后再切换到动态计算的安全库存有效解决了启动阶段的震荡问题。这个小技巧背后体现的是对模型实际应用场景的深入思考也成为了我们论文中一个不错的亮点。数学建模从来都不是纯粹的数学游戏它是用数学工具解决实际问题的艺术理解问题本身往往比推导公式更重要。
返回列表