基于全局优化的蔬菜进货与销售策略优化
基于全局优化的蔬菜进货与销售策略优化
本文使用Python代码实现了一个全局优化模型,旨在帮助商家找到最佳的蔬菜进货和销售策略,以最大化利润。该模型通过模拟随机进货和销售价格,并计算利润,最终找到最佳的进货策略和销售价格。
代码实现
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os
import warnings
warnings.filterwarnings('ignore')
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score,confusion_matrix,classification_report
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
import matplotlib.font_manager as fm
from datetime import datetime, timedelta
from scipy.optimize import curve_fit
import random
from scipy.optimize import curve_fit
from scipy.optimize import minimize
from deap import base, creator, tools, algorithms
import re
# 设置全局字体
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['SimHei']
data = pd.read_csv('Q3_data.csv')
data['销售日期'] = pd.to_datetime(data['销售日期'])
# get the start and end dates of the last week
e_date = data['销售日期'].max()
s_date = e_date - pd.Timedelta(days=6)
# filter the dataframe to only include the rows within the last week
last_week_data = data.loc[(data['销售日期'] >= s_date) & (data['销售日期'] <= e_date)]
# count the number of occurrences of each item in the last week
item_counts = last_week_data['单品名称'].value_counts()
# print the resulting counts
print(item_counts)
plt.figure(figsize=(16, 8))
last_week_data['单品名称'].value_counts().plot(kind='bar', figsize=(16, 8), fontsize=14)
plt.xlabel('单品名称')
plt.ylabel('销售数量')
plt.title('上周销售数量')
plt.show()
daily_sales = last_week_data.groupby(['销售日期', '单品名称']).size().reset_index(name='销售数量')
daily_sales = pd.merge(daily_sales, data[['销售日期', '单品名称', '销售单价(元/千克)', '批发价格(元/千克)', '平均损耗率','分类名称']], on=['销售日期', '单品名称'], how='left')
# 将每个单品的上周的平均值作为未来一天的预测值
daily_sales['预测需求'] = daily_sales.groupby('单品名称')['销售数量'].transform('mean')
daily_sales['批发价格'] = daily_sales.groupby('单品名称')['批发价格(元/千克)'].transform('mean')
daily_sales['销售单价(元/千克)'] = daily_sales.groupby('单品名称')['销售单价(元/千克)'].transform('mean')
# 存储到新的dataframe中
daily_sales = daily_sales[['销售日期', '单品名称', '预测需求','批发价格','平均损耗率','分类名称','销售单价(元/千克)']]
daily_sales['销售日期'] = '2023-07-01'
# 去重
daily_sales_predict = daily_sales.drop_duplicates()
# 全局优化
S_profit = 0
purchase_strategy = []
sales_price = []
for i in range(0,1000000):
# 初始化列表
lst = [0] * 49
# 随机选择元素
while sum(lst) < 27 or sum(lst) > 33:
lst = [random.randint(0, 1) for _ in range(49)]
num_lst = np.multiply( np.array(lst) , np.array([random.uniform(2.5, 30) for _ in range(49)])) #进货量
cost_lst = np.multiply( np.array(lst) , np.array(daily_sales_predict['平均损耗率'])) / 100 #损耗量
# 将lst转换为布尔列表
bool_lst = [bool(x) for x in lst]
# 使用布尔索引筛选DataFrame
filtered_df = daily_sales_predict[bool_lst]
num_veg = len(filtered_df['分类名称'].unique())
num_veg_1 = len(filtered_df['单品名称'].unique())
cost_num_lst = np.multiply( num_lst, cost_lst) #损耗量
max_sale_lst = num_lst - cost_num_lst #最大销售量
p_lst = np.multiply( num_lst, np.array(daily_sales_predict['批发价格'])) #进货价格
price_lst = np.multiply( np.array(lst) , np.array(daily_sales_predict['销售单价(元/千克)'])) #销售价格
sale_lst = np.multiply( np.array(lst) , np.array(daily_sales_predict['预测需求'])) #销售量
actually_sale = np.where(max_sale_lst- sale_lst < 0, max_sale_lst , max_sale_lst- sale_lst )
profit_lst = np.multiply( actually_sale , price_lst) - p_lst #利润
s_profit = sum(profit_lst) + 5 * num_veg + num_veg_1 #总利润
if s_profit > S_profit:
S_profit = s_profit
purchase_strategy = num_lst.tolist()
sales_price = price_lst.tolist()
S_profit = s_profit
# 结构化存储purchase_strategy和sales_price
purchase_strategy_df = pd.DataFrame()
purchase_strategy_df= pd.DataFrame(daily_sales_predict['单品名称'], columns=['单品名称'])
purchase_strategy_df['进货量'] = pd.DataFrame(purchase_strategy, columns=['进货量'])['进货量']
sales_price_df = pd.DataFrame(sales_price, columns=['销售价格'])
purchase_strategy_df['销售价格'] = sales_price_df['销售价格']
代码解释
-
数据读取和预处理:
- 读取销售数据文件
Q3_data.csv。 - 将销售日期转换为日期格式。
- 筛选出上周的销售数据。
- 统计上周每个单品的销售数量并可视化展示。
- 计算每个单品的预测需求、平均损耗率、分类名称和销售单价,并存储到新的数据框
daily_sales_predict中。
- 读取销售数据文件
-
全局优化:
- 初始化总利润
S_profit、购买策略purchase_strategy和销售价格sales_price。 - 循环1000000次,每次循环随机选择进货量,并根据进货量、损耗率、预测需求、批发价格和销售单价计算利润。
- 如果当前循环的利润大于之前的最大利润,则更新最大利润和购买策略。
- 初始化总利润
-
结果存储:
- 将最佳的购买策略和销售价格存储到数据框
purchase_strategy_df中。
- 将最佳的购买策略和销售价格存储到数据框
模型原理
该模型采用随机搜索算法进行全局优化。通过随机选择进货量和销售价格,并计算利润,不断更新最大利润和购买策略,最终找到最优的购买策略和销售价格,以最大化总利润。
应用场景
该模型可应用于蔬菜销售等场景,帮助商家优化经营策略,例如:
- 确定每天的进货量和销售价格,以最大化利润。
- 根据销售数据预测未来需求,制定更合理的进货计划。
- 通过分析销售数据,了解不同商品的盈利能力,调整产品结构,提高利润率。
注意事项
- 该模型是一个简化的模型,实际应用中可能需要考虑更多因素,例如库存成本、物流成本、市场价格波动等。
- 该模型的性能取决于数据的质量和算法的参数设置。
- 在实际应用中,建议使用更复杂的优化算法,例如遗传算法、粒子群算法等,以提高模型的性能。
原文地址: https://www.cveoy.top/t/topic/enqr 著作权归作者所有。请勿转载和采集!