基于全局优化的蔬菜进货与销售策略优化

本文使用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['销售价格']

代码解释

  1. 数据读取和预处理:

    • 读取销售数据文件 Q3_data.csv
    • 将销售日期转换为日期格式。
    • 筛选出上周的销售数据。
    • 统计上周每个单品的销售数量并可视化展示。
    • 计算每个单品的预测需求、平均损耗率、分类名称和销售单价,并存储到新的数据框 daily_sales_predict 中。
  2. 全局优化:

    • 初始化总利润 S_profit、购买策略 purchase_strategy 和销售价格 sales_price
    • 循环1000000次,每次循环随机选择进货量,并根据进货量、损耗率、预测需求、批发价格和销售单价计算利润。
    • 如果当前循环的利润大于之前的最大利润,则更新最大利润和购买策略。
  3. 结果存储:

    • 将最佳的购买策略和销售价格存储到数据框 purchase_strategy_df 中。

模型原理

该模型采用随机搜索算法进行全局优化。通过随机选择进货量和销售价格,并计算利润,不断更新最大利润和购买策略,最终找到最优的购买策略和销售价格,以最大化总利润。

应用场景

该模型可应用于蔬菜销售等场景,帮助商家优化经营策略,例如:

  • 确定每天的进货量和销售价格,以最大化利润。
  • 根据销售数据预测未来需求,制定更合理的进货计划。
  • 通过分析销售数据,了解不同商品的盈利能力,调整产品结构,提高利润率。

注意事项

  • 该模型是一个简化的模型,实际应用中可能需要考虑更多因素,例如库存成本、物流成本、市场价格波动等。
  • 该模型的性能取决于数据的质量和算法的参数设置。
  • 在实际应用中,建议使用更复杂的优化算法,例如遗传算法、粒子群算法等,以提高模型的性能。
基于全局优化的蔬菜进货与销售策略优化

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

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