2024年MathorCup高校数学建模挑战赛(C题)深度剖析|建模完整过程+详细思路+代码全解析

2024年MathorCup高校数学建模挑战赛(C题)深度剖析|建模完整过程+详细思路+代码全解析

问题1

本问题属于时间序列预测问题,其目标是对未来一段时期内的信息进行预测。因此可以采用基于时间序列的回归模型进行货量预测。具体而言,将首先分析时间序列的性质,然后构建回归模型,最后利用模型对未来30天每天及每小时的货量进行预测。

【算法原理】
(1)时间序列的性质
时间序列实际上是一种随时间变化的连续数据,其特点主要体现在两个方面:趋势性和周期性。趋势性是指时间序列数据在长期内呈现出的增长或减小的趋势,周期性是指时间序列数据在短期内呈现出的周期性变化。另外,时间序列数据还存在着随机性,即随着时间的变化,数据的波动并不总是按照某种规律进行变化,因此时间序列数据还具有随机性。基于以上特点,本文将采用ARIMA模型进行时间序列的预测,ARIMA模型是一种针对时间序列数据的平稳性、趋势性和周期性进行分析的模型。

(2)构建回归模型
在ARIMA模型中,将时间序列数据进行平稳化处理,然后再对其进行建模,具体而言,将时间序列数据进行差分,使其转换为平稳序列。平稳序列是指数据的均值和方差在长期内保持不变,因此可以利用平稳序列进行建模。在本问题中,将对时间序列数据进行一阶差分,即对每天的货量进行差分,得到每天的货量增量。然后,将差分后的数据作为因变量,以过去一段时间的货量数据作为自变量,构建回归模型,采用多元线性回归的方法进行参数估计。

(3)模型参数估计
利用多元线性回归的方法可以得到模型的参数估计值,具体而言,将以过去一段时间的货量数据作为自变量,以差分后的货量增量作为因变量,进行回归分析,得到每个分拣中心对应的回归系数。然后,将这些回归系数作为模型的参数估计值,即得到了模型。

(4)模型预测
在得到模型参数估计值之后,即可利用模型对未来30天每天的货量进行预测。具体而言,根据模型的参数估计值,利用过去一段时间的货量数据,计算出每天的货量增量。然后,再根据这些货量增量,得到每天的货量预测值。同时,还可利用模型对每小时的货量进行预测,具体方法与预测每天的货量类似。

一、模型的建立

针对问题1,本文将提出基于时间序列的分拣中心货量预测模型,通过分析历史货量数据,得出每个分拣中心未来30天每天及每小时的货量预测结果。本文假设分拣中心的货量受到以下因素的影响:

  1. 时间因素:每天的货量存在周期性变化,每个小时的货量也存在周期性变化
  2. 节假日因素:节假日的到来会对货量产生影响,如双十一、春节、圣诞节等
  3. 单位时间内订单量与货量之间的关系:根据历史数据分析,单位时间内的订单量与货量之间存在一定的线性关系,即订单量越多,货量越大
  4. 分拣中心之间的运输线路:分拣中心之间的运输线路关系对各个分拣中心的货量有一定的影响

根据以上假设,本文建立的分拣中心货量预测模型包括两部分,分别为每天每小时货量预测模型和每天货量预测模型。

二、每天每小时货量预测模型

每天每小时货量预测模型公式:

y t = α + β x t + ϵ t y_t = \alpha + \beta x_t + \epsilon_t yt=α+βxt+ϵt

其中, y t y_t yt为每天每小时的货量预测值, α \alpha α为截距项, β \beta β为斜率项, x t x_t xt为每天每小时的订单量, ϵ t \epsilon_t ϵt为误差项。

首先,本文使用时间序列分析的方法,对历史每小时货量数据进行分析和处理,得出每个分拣中心未来30天每小时的货量预测结果。具体步骤如下:

  1. 数据预处理
    本文使用附件2中过去30天每小时货量数据,对数据进行预处理。首先,根据分拣中心的数量,将数据分为57个数据集,每个数据集包含一个分拣中心过去30天每小时的货量数据。然后,对每个数据集进行缺失值处理,采用插值法填充缺失值,使得数据集中不存在缺失值。最后,对每个数据集进行标准化处理,将数据转化为均值为0,方差为1的标准正态分布。

  2. 建立时间序列模型
    根据时间序列分析的方法,本文选取ARIMA模型作为时间序列模型,ARIMA模型是一种常用的时间序列预测模型,能够分析时间序列数据的趋势、周期和随机波动。ARIMA模型包括自回归(AR)模型、差分(I)模型和移动平均(MA)模型,因此,ARIMA模型可以表示为ARIMA(p,d,q)。其中,p为自回归项的阶数,d为差分阶数,q为移动平均项的阶数。

  3. 模型拟合和参数估计
    本文使用ARIMA模型拟合每个分拣中心的数据集。首先,通过自相关图和偏自相关图选取合适的模型阶数。然后,使用最小二乘法对模型参数进行估计。

  4. 模型检验
    本文使用均方根误差(RMSE)和平均绝对百分比误差(MAPE)对模型预测结果进行评估。其中,RMSE用于衡量预测值和实际值之间的误差,MAPE用于衡量预测值和实际值之间的相对误差。

  5. 模型预测
    根据模型参数和历史数据,得出每个分拣中心未来30天每小时的货量预测结果。

三、每天货量预测模型

根据问题描述,每天货量预测模型的目标是根据历史货量数据预测每个分拣中心未来30天每天的货量。本模型将分为两个步骤,首先根据历史每小时货量数据得出每天的货量,然后根据每天的货量得出未来30天每天的货量预测结果。

每天货量预测模型公式:

y t = α + β x t + ϵ t y_t = \alpha + \beta x_t + \epsilon_t yt=α+βxt+ϵt

其中, y t y_t yt为每天的货量预测值, α \alpha α为截距项, β \beta β为斜率项, x t x_t xt为每天的订单量, ϵ t \epsilon_t ϵt为误差项。

  1. 数据预处理
    本文使用附件1中过去4个月每天货量数据,对数据进行预处理。首先,根据分拣中心的数量,将数据分为57个数据集,每个数据集包含一个分拣中心过去4个月每天的货量数据。然后,对每个数据集进行缺失值处理,采用插值法填充缺失值,使得数据集中不存在缺失值。最后,对每个数据集进行标准化处理,将数据转化为均值为0,方差为1的标准正态分布。

  2. 建立回归模型
    根据问题1中的假设,每个小时的订单量和货量之间存在一定的线性关系,因此,本文选择回归模型来预测每天的货量。回归模型可以表示为y = α + βx,其中y为每天的货量,x为每天的订单量。本文使用最小二乘法对模型参数进行估计。

  3. 模型检验
    本文使用均方根误差(RMSE)和平均绝对百分比误差(MAPE)对模型预测结果进行评估。其中,RMSE用于衡量预测值和实际值之间的误差,MAPE用于衡量预测值和实际值之间的相对误差。

  4. 模型预测
    根据模型参数和历史数据,得出每个分拣中心未来30天每天的货量预测结果。

下面给出使用python进行ARIMA模型预测的代码:

import pandas as pd
from statsmodels.tsa.arima_model import ARIMA
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_csv('附件1.csv')
# 将日期转换为时间序列
data['date'] = pd.to_datetime(data['date'])
data.set_index('date', inplace=True)
# 绘制数据图
data.plot()
plt.show()

# 对数据进行差分
diff = data.diff(1).dropna()
# 绘制差分后的数据图
diff.plot()
plt.show()

# 判断差分阶数
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# 绘制自相关图和偏自相关图
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = plot_acf(diff, lags=20, ax=ax1)
ax2 = fig.add_subplot(212)
fig = plot_pacf(diff, lags=20, ax=ax2)
plt.show()

# 确定ARIMA模型的p、d、q值
# 由自相关图和偏自相关图可以看出,p=1,q=1
# 由于差分后的数据具有平稳性,d=0
# ARIMA模型为ARIMA(1,0,1)
# 模型拟合
model = ARIMA(data, order=(1,0,1))
result = model.fit()
# 查看模型残差
residuals = pd.DataFrame(result.resid)
residuals.plot()
plt.show()
# 预测未来30天每天的货量
predict = result.predict(start='2021-04-26', end='2021-05-25')
# 预测结果写入表1
predict.to_csv('结果表1.csv')
# 预测未来30天每小时的货量
predict_hourly = result.predict(start='2021-04-25 00:00:00', end='2021-05-24 23:00:00', dynamic=True)
# 预测结果写入表2
predict_hourly.to_csv('结果表2.csv')

问题2

问题2的数学建模步骤如下:

  1. 数据预处理:根据附件1-4的数据,计算每个分拣中心过去90天的日均货量和每小时均量,作为模型输入的历史数据。
  2. 确定预测模型:根据问题1的要求,需要对每个分拣中心未来30天每天及每小时的货量进行预测,因此可以选择时间序列分析中的ARIMA模型,根据历史数据拟合出每个分拣中心的ARIMA模型。
  3. 模型参数选择:根据ARIMA模型的特性,需要确定模型的三个参数:AR§、I(d)、MA(q)。可以通过自相关图和偏自相关图来确定p和q的值,通过ADF检验来确定d的值。
  4. 模型训练:根据确定的模型参数,对每个分拣中心的历史数据进行模型训练。
  5. 模型预测:利用训练好的模型对每个分拣中心未来30天每天及每小时的货量进行预测。
  6. 结果分析:将预测结果与实际数据进行比较,分析模型的准确性和适用性,如果需要可以调整模型参数重新训练和预测。
  7. 结果输出:将预测结果写入结果表3和表4中。

模型建立:

首先,根据过去90天各分拣中心之间的各运输线路平均货量,可以得到各分拣中心之间的运输线路关系矩阵 M 90 × 57 M_{90\times57} M90×57,其中 M i j M_{ij} Mij表示第i个分拣中心到第j个分拣中心的平均运输货量。

根据附件4的数据,可以得到未来30天各分拣中心之间的运输线路关系矩阵 M 30 × 57 M_{30\times57} M30×57,其中 M i j M_{ij} Mij表示第i个分拣中心到第j个分拣中心的平均运输货量。

因此,可得到未来30天各分拣中心每天的货量预测矩阵 Q 30 × 57 Q_{30\times57} Q30×57,其中 Q i Q_{i} Qi表示第i天各分拣中心的货量预测向量,且有以下关系式:

Q 30 × 57 = M 30 × 57 × Q 90 × 57 Q_{30\times57} = M_{30\times57} \times Q_{90\times57} Q30×57=M30×57×Q90×57

其中 Q 90 × 57 Q_{90\times57} Q90×57表示过去90天各分拣中心每天的货量数据矩阵,且每一列为一个分拣中心的货量数据。

类似地,根据附件3的数据,可以得到未来30天各分拣中心每小时的货量预测矩阵 H 30 × 57 H_{30\times57} H30×57,其中 H i H_{i} Hi表示第i小时各分拣中心的货量预测向量,且有以下关系式:

H 30 × 57 = M 30 × 57 × H 90 × 57 H_{30\times57} = M_{30\times57} \times H_{90\times57} H30×57=M30×57×H90×57

其中 H 90 × 57 H_{90\times57} H90×57表示过去90天各分拣中心每小时的货量数据矩阵,且每一列为一个分拣中心的每小时货量数据。

Python代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.stattools import adfuller

# 读取数据
df1 = pd.read_excel('附件1.xlsx', sheet_name='Sheet1')
df2 = pd.read_excel('附件2.xlsx', sheet_name='Sheet1')

# 数据预处理
# 合并数据
train_data = []
test_data = []
for i in range(1, 58):
    train_data.append(np.array(df1.iloc[i, 1:121]))
    test_data.append(np.array(df2.iloc[i, 1:721]))

# 数据可视化分析
plt.plot(train_data[0])
plt.show()

# 平稳性检验
def adf_test(timeseries):
    dftest = adfuller(timeseries)
    dfoutput = pd.Series(dftest[0:4], index=['Test Statistic', 'p-value', '#Lags Used', 'Number of Observations Used'])
    for key, value in dftest[4].items():
        dfoutput['Critical Value (%s)' % key] = value
    print(dfoutput)

adf_test(train_data[0])

# 模型训练
model = ARIMA(train_data[0], order=(2, 1, 2))
results_ARIMA = model.fit(disp=-1)

# 模型预测
forecast = results_ARIMA.forecast(30)
pred_data = forecast[0]

# 结果导出
result = pd.DataFrame(pred_data)
result.columns = ['未来30天每天货量预测结果']
result.to_excel('结果表3.xlsx', index=False)

result = pd.DataFrame(np.reshape(pred_data, (30, 24)))
result.columns = ['未来30天每小时货量预测结果']
result.to_excel('结果表4.xlsx', index=False)

查看完整思路详见:
【腾讯文档】2024年MathorCup高校数学建模挑战赛全题目深度解析(详细思路+建模过程+代码实现+论文指导)
https://docs.qq.com/doc/DSFZYb1FsQ3hqbHNs

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2019MathorCup高校数学建模挑战赛D 2019第九届MathorCup高校数学建模挑战赛 竞赛信息 竞赛简介 为了培养学生的创新意识及运用数学方法和计算机技术解决实际问的能力,中国优选法统筹法与经济数学研究会决定主办2019第九届MathorCup高校数学建模挑战赛,欢迎各高等院校按照竞赛章程及有关规定组织同学报名参赛。 组织机构 主办单位:中国优选法统筹法与经济数学研究会 【中国优选法统筹法与经济数学研究会是在中国科学技术协会直接领导下的学术性社会团体,是国家一级学会。学会由华罗庚教授于1981发起成立,至今成立了评价方法与应用、项目管理、计算机模拟、统筹、管理决策与信息系统、工业工程、高等教育管理、数学教育、经济数学与管理数学、应急管理、灰色系统研究,复杂系统研究等十余个专业分会】 竞赛时间 报名时间:即日起至2019 4 月 10日 12:00 竞赛时间:20194 月 11 日08:00至2019 4 月 15 日08:00 参赛对象 普通高校日制在校生(研究生、本科生、专科生)以队为单位参赛,每队不超过3人,不允许跨校组队参赛。 参赛费用 每支队伍需缴纳200元的报名费用。 奖项设置 参赛队伍:国一等奖(约5%)、国二等奖(约15%)、国三等奖(约30%),从一等奖队伍中经过决赛答辩决出4支队伍获得“MathorCup”荣誉奖杯; 组织单位:优秀组织单位、优秀组织社团、优秀组织个人; 其它奖励政策:参见《 MathorCup高校数学建模挑战赛奖励细则》( 可从官方主页下载)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值