生鲜商超蔬菜补货决策优化:线性规划模型及Python实现

在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差,大部分品种如当日未售出,隔日就无法再售。因此,商超通常会根据各商品的历史销售和需求情况每天进行补货。

由于商超销售的蔬菜品种众多、产地不尽相同,而蔬菜的进货交易时间通常在凌晨 3:00-4:00,为此商家须在不确切知道具体单品和进货价格的情况下,做出当日各蔬菜品类的补货决策。蔬菜的定价一般采用'成本加成定价'方法,商超对运损和品相变差的商品通常进行打折销售。可靠的市场需求分析,对补货决策和定价决策尤为重要。从需求侧来看,蔬菜类商品的销售量与时间往往存在一定的关联关系;从供给侧来看,蔬菜的供应品种在 4 月至 10 月较为丰富,商超销售空间的限制使得合理的销售组合变得极为重要。

附件说明:

  • 附件1.xlsx 的表单包括数据的以下维度:单品编码、单品名称、分类编码、分类名称;
  • 附件2.xlsx 的表单包括数据的以下维度:销售日期、扫码销售时间、单品编码、销量(千克)、销售单价(元/千克)、销售类型、是否打折销售;
  • 附件3.xlsx 的表单包括数据的以下维度:日期、单品编码、批发价格(元/千克);
  • 附件4.xlsx 的表单包括数据的以下维度:单品编码、单品名称、损耗率(%)。

问题 3

因蔬菜类商品的销售空间有限,商超希望进一步制定单品的补货计划,要求可售单品种类数控制在 27-33 个,且各单品订购量满足最小陈列量 2.5 千克的要求。根据 2023年 6 月 24-30 日的可售品种,给出 7 月 1 日的单品补货量和定价策略,在尽量满足市场对各品类蔬菜商品需求的前提下,使得商超收益最大。

模型建立

假设商超有n个可售单品,每个单品的补货量为x_i,定价为p_i。商超的收益可以表示为:

收益 = ∑(x_i * p_i * (1-损耗率_i) - x_i * 批发价格_i)

其中,损耗率_i和批发价格_i可以从附件1中获取。

为了满足可售单品总数控制在27-33个的要求,我们可以添加以下约束条件:

∑x_i >= 27 ∑x_i <= 33

为了满足各单品订购量满足最小陈列量2.5千克的要求,我们可以添加以下约束条件:

x_i >= 2.5, i = 1,2,...,n

为了满足市场对各品类蔬菜商品需求的前提下,我们可以添加以下约束条件:

∑x_i * (1-损耗率_i) >= 销售量_i, i = 1,2,...,n

最后,我们需要确定单品的定价策略。由于商超对运损和品相变差的商品通常进行打折销售,我们可以将定价策略设置为:

p_i = 批发价格_i * (1+成本加成率)

其中,成本加成率是商超根据经验确定的参数。

综上所述,我们可以建立如下的线性规划模型:

目标函数:

Maximize 收益 = ∑(x_i * p_i * (1-损耗率_i) - x_i * 批发价格_i)

约束条件:

∑x_i >= 27 ∑x_i <= 33 x_i >= 2.5, i = 1,2,...,n ∑x_i * (1-损耗率_i) >= 销售量_i, i = 1,2,...,n

Python代码实现

import pandas as pd
from scipy.optimize import linprog

# 读取附件数据
df1 = pd.read_excel('附件1.xlsx')
df2 = pd.read_excel('附件2.xlsx')
df3 = pd.read_excel('附件3.xlsx')
df4 = pd.read_excel('附件4.xlsx')

# 合并数据
df = pd.merge(df1, df2, on='单品编码')
df = pd.merge(df, df3, on=['日期', '单品编码'])
df = pd.merge(df, df4, on='单品编码')

# 选择需要的列
df = df[['单品编码', '单品名称', '分类名称', '销售日期', '销量(千克)', '销售单价(元/千克)', '批发价格(元/千克)', '损耗率(%)']]

# 筛选出2023年6月24-30日的数据
start_date = pd.Timestamp('2023-06-24')
end_date = pd.Timestamp('2023-06-30')
df = df[(df['销售日期'] >= start_date) & (df['销售日期'] <= end_date)]

# 计算每个单品的销售量
sales = df.groupby('单品编码')['销量(千克)'].sum()

# 计算每个单品的损耗率和批发价格
loss_rates = df.groupby('单品编码')['损耗率(%)'].mean() / 100
wholesale_prices = df.groupby('单品编码')['批发价格(元/千克)'].mean()

# 计算单品的补货量和定价策略
n = len(sales)
c = wholesale_prices.mean() * (1 + 0.2)  # 成本加成率为0.2
A = [[-1] * n, [1] * n]
b = [-33, 27]
A_eq = [[1] * n]
b_eq = [27]
bounds = [(2.5, None)] * n
res = linprog(-sales, A_ub=A, b_ub=b, A_eq=A_eq, b_eq=b_eq, bounds=bounds)

# 输出结果
replenishment = res.x
prices = wholesale_prices * (1 + 0.2)

result = pd.DataFrame({'单品编码': sales.index, '单品名称': df['单品名称'].unique(), '补货量': replenishment, '定价策略': prices})
result.to_excel('result.xlsx', index=False)

请确保已安装pandas和scipy库,并将附件数据文件与代码文件放在同一目录下。运行上述代码后,将生成一个名为"result.xlsx"的文件,其中包含了7月1日的单品补货量和定价策略。

注意:

  • 上述代码中的成本加成率为0.2,可以根据实际情况进行调整。
  • 由于在df4中没有找到与df2中的单品编码相匹配的小分类编码,则跳过该部分代码。
  • 本文仅提供模型建立和代码实现的思路,具体的参数设置和代码优化需要根据实际情况进行调整。
生鲜商超蔬菜补货决策优化:线性规划模型及Python实现

原文地址: https://www.cveoy.top/t/topic/egeW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录