菜鸟-需求预测与分仓规划

菜鸟-需求预测与分仓规划

Another url: https://bulihanjie.github.io/2016/09/27/菜鸟-需求预测与分仓规划/


题目描述:

https://tianchi.shuju.aliyun.com/competition/introduction.htm?spm=5176.100068.5678.1.ZBYlCN&raceId=231530


基本流程:

和其他机器学习比赛的思路大致是一样的:数据按照分仓和全国分开处理,划分时间窗口提取特征,跑模型,模型融合等,可能这比赛中可以添加规则来提高成绩。
在这里,我主要讲的是比赛中的尝试,与以前不一样的是改变模型求解的损失函数使得更加符合本题。


损失函数分析:

在赛题中,成本的计算受两个参数控制:补多成本和补少成本。当预测库存比实际库存少时,成本总和加上补少成本×库存之差;当预测库存比实际库存多时,成本总和加上补多成本×库存之差。因此补少成本和补多成本对于目标函数有着重大的影响,而如果直接调用模型进行训练,由于训练的损失函数不同,导致总的成本过高。
  举个例子:

补多 补少 实际成本
4 3 1
1 2 1
3 4 1
3 5 1
2 1 50

如果忽略了补多成本和补少成本,可能全部预测为10(均值),得到的总成本为139。当预测为1的时候,总成本为49,所以能得到更好的结果。


思路方案:

GBDT中,对于每个树节点的样本集合,其预测值为样本观察值的均值(如果有权重则是加权平均),如果考虑补多成本以及补少成本,可以有以下一个结论:
  样本集合的最优

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
需求预测分仓规划是一个很常见的问题,一般需要使用时间序列分析和优化算法来解决。以下是一个简单的Python代码示例,可以帮助你对需求进行预测和进行分仓规划。 首先,我们需要导入一些必要的库: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.arima_model import ARIMA from sklearn.metrics import mean_squared_error import pulp ``` 接下来是数据预处理部分。我们需要读取销售数据和库存数据,并将它们合并成一个数据框: ```python sales_data = pd.read_csv('sales_data.csv') inventory_data = pd.read_csv('inventory_data.csv') df = pd.merge(sales_data, inventory_data, on='date') df['date'] = pd.to_datetime(df['date']) df.set_index('date', inplace=True) ``` 接下来是时间序列分析部分。我们可以使用ARIMA模型来预测销售量: ```python def arima_model(series): model = ARIMA(series, order=(3,1,0)) model_fit = model.fit(disp=0) return model_fit.forecast()[0] sales_prediction = [] for i in range(len(df)): if i < 7: sales_prediction.append(np.nan) else: sales_prediction.append(arima_model(df['sales'][i-7:i])) df['sales_prediction'] = sales_prediction plt.plot(df['sales']) plt.plot(df['sales_prediction']) plt.show() ``` 然后,我们可以使用线性规划来进行分仓规划。我们可以使用pulp库来构建和求解线性规划问题: ```python def optimize_warehouses(num_warehouses, max_capacity): prob = pulp.LpProblem("Warehouse Planning", pulp.LpMinimize) inventory_vars = [] for i in range(num_warehouses): inventory_vars.append(pulp.LpVariable(f"inventory_{i}", lowBound=0, upBound=max_capacity)) total_cost = 0 for i in range(len(df)): demand = df['sales_prediction'][i] if np.isnan(demand): continue shortfall = [] for j in range(num_warehouses): shortfall.append(demand - inventory_vars[j]) prob += pulp.lpSum(shortfall) == 0 total_cost += pulp.lpSum([inventory_vars[j] for j in range(num_warehouses)]) * 0.01 prob += total_cost prob.solve() inventory_levels = [] for v in prob.variables(): inventory_levels.append(v.varValue) return inventory_levels ``` 最后,我们可以调用optimize_warehouses函数来进行分仓规划,并将结果保存到一个新的数据框中: ```python inventory_levels = optimize_warehouses(num_warehouses=3, max_capacity=1000) df['inventory_level'] = inventory_levels plt.plot(df['inventory_level']) plt.show() ``` 这是一个简单的示例,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值