当前位置:   article > 正文

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

2024mathorcupc题

问题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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

问题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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/585712
推荐阅读
相关标签
  

闽ICP备14008679号