【2023高教社杯】C题 蔬菜类商品的自动定价与补货决策 问题分析、数学模型及python代码实现

简介: 本文介绍了2023年高教社杯数学建模竞赛C题,涉及蔬菜类商品的自动定价与补货决策,包括问题分析、数学模型的构建以及Python代码实现,旨在优化商超的补货和定价策略以提高收益。

【2023高教社杯】C题 蔬菜类商品的自动定价与补货决策

在这里插入图片描述

1 题目

C题蔬菜类商品的自动定价与补货决策

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

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

附件 1 给出了某商超经销的 6 个蔬菜品类的商品信息;附件 2 和附件 3 分别给出了该商超 2020 年 7 月 1 日至 2023 年 6 月 30 日各商品的销售流水明细与批发价格的相关数据;附件 4 给出了各商品近期的损耗率数据。请根据附件和实际情况建立数学模型解决以下问题:

问题 1 蔬菜类商品不同品类或不同单品之间可能存在一定的关联关系,请分析蔬菜各品类及单品销售量的分布规律及相互关系。

问题 2 考虑商超以品类为单位做补货计划,请分析各蔬菜品类的销售总量与成本加成定价的关系,并给出各蔬菜品类未来一周(2023 年 7 月 1-7 日)的日补货总量和定价策略, 使得商超收益最大。

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

问题 4 为了更好地制定蔬菜商品的补货和定价决策,商超还需要采集哪些相关数据,这些数据对解决上述问题有何帮助,请给出你们的意见和理由。

附件 1:6 个蔬菜品类的商品信息
附件 2:销售流水明细数据
附件 3:蔬菜类商品的批发价格
附件 4:蔬菜类商品的近期损耗率
(1) 附件 1 中,部分单品名称包含的数字编号表示不同的供应来源。
(2) 附件 4 中的损耗率反映了近期商品的损耗情况,通过近期盘点周期的数据计算得到。

2 问题分析

2.1 问题一

分析每个蔬菜品类和单品的销售量分布规律,可以使用可视化工具展示销售量的直方图和箱线图,观察销售量的分布情况和异常值情况。然后,计算相关系数法分析蔬菜类商品之间的销售量相关性,以及不同品类或不同单品之间可能存在的销售量关联关系。

2.2 问题二

线性规划问题。首先,需要根据附件2的销售流水明细计算出各蔬菜品类的销售总量。具体来说,对于每个蔬菜品类 i i i,其销售总量 S i S_i Si​ 可以通过对其子类,即分类编码为包含品类编码的前 8 位数字的销售总量求和得到,即

$S_i = \sum_{j \in C_i} s_j$

其中,Ci​ 表示蔬菜品类 i所包含的子类集合,sj​ 表示子类 j 的销售总量。

接下来,需要计算每个蔬菜品类的成本加成定价。假设蔬菜品类 i 的成本为ci​,加成率为mi​,则成本加成定价为
$p_i = (1 + m_i) c_i$

需要根据附件3的批发价格数据来计算成本和利润。对于每个蔬菜品类 i,其成本 ci​ 可以通过对其子类的平均批发价格求和得到,即

$c_i = \dfrac{\sum_{j \in C_i} w_j p_j}{\sum_{j \in C_i} w_j}​​$

其中,wj​ 表示子类 j 的批发数量,pj​ 表示子类 j 的平均批发价格。

接下来,需要根据附件4的损耗率数据来计算每个蔬菜品类的损耗成本。具体来说,假设蔬菜品类 i 的损耗率为ri​,则其损耗成本li​ 可以通过对其子类的销售总量和批发价格求加权平均再乘以损耗率得到,即

$l_i = \dfrac{\sum_{j \in C_i} s_j w_j p_j}{\sum_{j \in C_i} s_j w_j} \times r_i$

最后,需要根据题目要求,设计一个数学模型,计算出未来一周每个蔬菜品类的日补货总量和定价策略,使得商超收益最大。

请下载完整资料

2.3 问题三

在问题二模型的基础上,需要考虑进一步制定单品的补货计划的问题,即需要限制每个蔬菜品类的可售单品总数控制在 27-33 个,且各单品订购量满足最小陈列量 2.5 千克的要求。将其转为整数规划问题。改进的主要包括两个地方:

(1)添加约束条件,限制每个蔬菜品类的可售单品总数不超过 33 个,同时除最后一天外,每天需补货的种类数也不超过 33 个。

(2)将原优化问题拆分为 7 天的子问题,在满足第一步限制条件的前提下,求解出每天的最优补货量和售价。

数学模型如下:

请下载完整资料

其中第一个约束限制了每个蔬菜品类在每天的日补货总量不超过其最大日补货量。
第二个约束限制了除最后一天外,每天需补货的种类数不超过 33 个。
第三个约束限制了最后一天无需补货。
第四个约束限制了补货量和售价必须为整数。

2.4 问题四

商品交易是买卖双方的事情,尽可能的采集买卖双方的数据,就能实现客户定制化,卖家合理化的销售方案。

(1)顾客信息:购买偏好以及消费者的人口统计信息,如年龄、性别、职业、月收入等,分析市场需求和制定适合不同消费者群体的销售组合和定价策略。

(2)商品信息:商品的产地、采购时间、采购批次等信息,分析不同季节的采购价格、采购成本及商品质量。

3 python代码

3.1 问题一

读取数据

import pandas as pd
import numpy as np
import warnings
import matplotlib.pyplot as plt 
import seaborn as sns 
import scipy.stats as st
%matplotlib  inline
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = 'SimSun' # 换成自己环境下的中文字体,比如'SimHei'
plt.style.use('seaborn-darkgrid')
sns.set(style = 'darkgrid')

# 使用分类编码和单品编码进行合并
item_info = pd.read_excel('data/附件1.xlsx')
item_info = item_info.fillna(method='ffill')
item_info['单品编码'] = item_info['单品编码'].astype('str')
item_info['分类编码'] = item_info['分类编码'].astype('str')
item_info['分类-单品编码'] = item_info['分类编码'] + '-' + item_info['单品编码']

# 计算出每个商品的销售总量、销售总额等信息
sales_details = pd.read_excel('data/附件2.xlsx')
sales_details['单品编码'] = sales_details['单品编码'].astype('str')
sales_details = sales_details[['销售日期', '单品编码', '销量(千克)', '销售单价(元/千克)']]
sales_details['销售额(元)'] = sales_details['销量(千克)'] * sales_details['销售单价(元/千克)']
sales_by_item = sales_details.groupby('单品编码').agg({'销量(千克)': 'sum', '销售额(元)': 'sum'}).reset_index()

# 计算出每个商品的平均批发价格、总批发额等信息
wholesale_price = pd.read_excel('data/附件3.xlsx')
wholesale_price
wholesale_price['单品编码'] = wholesale_price['单品编码'].astype('str')
wholesale_by_item = wholesale_price.groupby('单品编码').agg({'批发价格(元/千克)': 'mean'}).reset_index()
wholesale_by_item.columns = ['单品编码', '平均批发价格(元/千克)']
wholesale_by_item['总批发额(元)'] = wholesale_by_item['平均批发价格(元/千克)'] * sales_by_item['销量(千克)']

# 与商品信息合并,得到每个商品的损耗率
loss_rate = pd.read_excel('data/附件4.xlsx')
loss_rate
loss_rate['小分类编码'] = loss_rate['小分类编码'].astype('str')
item_info['单品编码'] = item_info['单品编码'].astype('str')
item_loss_rate = pd.merge(item_info, loss_rate, left_on='分类编码', right_on='小分类编码', how='left')

(1)分析每个蔬菜品类和单品的销售量分布规律,使用直方图和箱线图展示销售量的分布情况,

# 统计根茎类不同单品的销售量
sales_by_item = sales_details.merge(item_info, on='单品编码', how='left')
sales_by_item = sales_by_item.groupby(['分类名称', '单品名称']).agg({'销量(千克)': 'sum'}).reset_index()

# 绘制直方图展示销售量分布情况
sales_by_item[sales_by_item['分类名称'] == '根茎类'].sort_values('销量(千克)', ascending=False).plot(kind='bar', x='单品名称', y='销量(千克)',
                                                                                             figsize=(10, 6))
plt.title('根茎类销售量直方图')
plt.xlabel('单品名称')
plt.ylabel('销量(千克)')
plt.show()

# 绘制箱线图展示销售量分布情况
sales_by_item.boxplot(column='销量(千克)', by='分类名称', figsize=(10, 6))
plt.title('各品类销售量箱线图')
plt.xlabel('品类名称')
plt.ylabel('销量(千克)')
plt.show()

在这里插入图片描述
在这里插入图片描述

(2)分析蔬菜类商品之间的销售量相关性,使用相关系数矩阵和热力图来分析不同蔬菜类商品之间的销售量相关性

# 将销售流水明细和商品信息合并,得到分类-单品编码和销售量的对应关系
sales_by_category = sales_details.merge(item_info, on='单品编码', how='left')
# 只取了20个进行可视化分析
sales_by_category = sales_by_category[0:20]
sales_matrix = sales_by_category.pivot(columns='分类-单品编码', values='销量(千克)')
corr_matrix = sales_matrix.corr()

plt.figure(figsize=(10, 8))
plt.imshow(corr_matrix, cmap=plt.cm.Reds_r)
plt.xticks(range(len(corr_matrix.columns)), corr_matrix.columns, rotation=90)
plt.yticks(range(len(corr_matrix.columns)), corr_matrix.columns)
plt.colorbar()
plt.title('销售量相关系数热力图')
plt.savefig('3.png',dpi=300)
plt.show()

(3)分析不同品类或不同单品之间可能存在的销售量关联关系,使用散点图来展示不同品类或不同单品之间可能存在的销售量关联关系

# 将销售流水明细和商品信息合并,得到分类名称和销售量的对应关系
sales_by_category = sales_details.merge(item_info, on='单品编码', how='left')
sales_by_category = sales_by_category.groupby('分类名称').agg({'销量(千克)': 'sum'}).reset_index()

# 绘制散点图展示不同品类之间的销售量关联情况
categories = list(set(item_info['分类名称']))
fig, ax = plt.subplots(figsize=(10, 6))
for c in categories:
    if c != '其他':
        ax.scatter(sales_by_category[sales_by_category['分类名称'] == c]['销量(千克)'], 
                   sales_by_category[sales_by_category['分类名称'] == c].index,
                   label=c)
plt.legend()
plt.ylabel('分类名称')
plt.xlabel('销售量(千克)')
plt.title('不同品类间销售量关联情况')
plt.show()

在这里插入图片描述

3.2 问题二、三

在这里插入图片描述

目录
相关文章
|
1天前
|
数据处理 开发者 Python
Python中的列表推导式:一种优雅的代码简化技巧####
【10月更文挑战第15天】 本文将深入浅出地探讨Python中列表推导式的使用,这是一种强大且简洁的语法结构,用于从现有列表生成新列表。通过具体示例和对比传统循环方法,我们将揭示列表推导式如何提高代码的可读性和执行效率,同时保持语言的简洁性。无论你是Python初学者还是有经验的开发者,掌握这一技能都将使你的编程之旅更加顺畅。 ####
9 1
|
2天前
|
人工智能 IDE 测试技术
使用通义灵码提升Python开发效率:从熟悉代码到实现需求的全流程体验
作为一名Python开发者,我最近开始使用通义灵码作为开发辅助工具。它显著提高了我的工作效率,特别是在理解和修改复杂代码逻辑方面。通过AI编码助手,我能够在短时间内快速上手新项目,实现新需求,并进行代码优化,整体效率提升了60%以上。通义灵码不仅加快了代码生成速度,还增强了代码的健壮性和稳定性。
|
3天前
|
缓存 程序员 开发者
探索Python中的装饰器:一种优雅的代码增强技巧
【10月更文挑战第13天】 在本文中,我们将深入探讨Python中的装饰器,这是一种强大的工具,它允许程序员以简洁而高效的方式扩展或修改函数和类的行为。通过具体示例,我们将展示如何利用装饰器来优化代码结构,提高开发效率,并实现如日志记录、性能计时等常见功能。本文旨在为读者提供一个关于Python装饰器的全面理解,从而能够在他们的项目中灵活运用这一技术。
13 1
|
6天前
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
10 1
|
6天前
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
13 2
|
8天前
|
设计模式 开发者 Python
Python中的装饰器:简化代码与增强功能
【10月更文挑战第9天】在编程的世界里,效率和可读性是衡量代码质量的两大关键指标。Python语言以其简洁明了的语法赢得了无数开发者的青睐,而装饰器则是其独特魅力之一。本文将深入探讨装饰器的工作原理、使用方法以及如何通过自定义装饰器来提升代码的重用性和可维护性,让读者能够更加高效地编写出既优雅又功能强大的代码。
|
9天前
|
缓存 Python
探索Python中的装饰器:简化你的代码之道
【10月更文挑战第8天】在Python的世界里,装饰器就像是一把瑞士军刀,小巧却功能强大。它们能够优雅地修改函数的行为,让代码更加简洁而不失强大。本文将带你走进装饰器的奇妙世界,从基础概念到实战应用,一步步解锁装饰器的秘密,让你的Python代码更上一层楼。
|
8天前
|
设计模式 存储 缓存
Python中的装饰器:提高代码可读性和复用性
【10月更文挑战第9天】Python中的装饰器:提高代码可读性和复用性
12 1
|
8天前
|
IDE 网络安全 开发工具
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
本文介绍了如何在PyCharm专业版中连接远程服务器并配置远程Python环境解释器,以便在服务器上运行代码。
56 0
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
|
9天前
|
设计模式 测试技术 开发者
Python中的装饰器:提升代码复用与模块化的艺术
本文将带你领略Python装饰器的魔力,探索如何通过装饰器来增强函数功能而不修改其代码。我们将从装饰器的基础概念出发,逐步深入到如何在实际项目中应用装饰器,以及如何编写自定义装饰器。文章最后,我们将通过一个实例,展示装饰器在日志记录和性能测试中的应用,让你的代码更加模块化和可重用。