2023年五一数学建模 B 题过程与结果

news/2024/10/30 9:31:48/

文章目录

  • 第一问
  • 第二问
    • 数据时序分析
    • Auto-ARIMA
      • 第二问求解
        • 解的情况
        • A->Q:
        • D-> A
        • Q-V
        • 总快递数
  • 第三问
  • 第四问
    • 遗传算法求解
  • 第五问
    • X-11 分解
      • 趋势:采用滑动均值模型求取
      • 季度趋势:
    • 残差
    • 求解
      • 残差分析
      • 固定需求、非固定需求
  • 代码

第一问

见 2023 年 五一杯 B 题过程 + 代码(第一问)

第二问

第二问考虑是一个时序预测问题,采用 ARIMA 模型即可

数据时序分析

对于 每一个路径,快递数时间序列,以路径 G->L 为例,其取值如下所示:
在这里插入图片描述
根据 ADF 检验,分析出路径 G->L 是否为稳定序列。根据 ADF 假设检验结果,由于ADF检验的 p值为: 0.002 检验统计量 ADF 为: -3.87。由于 p 值小于置信水平 0.05,因此可以认为时间序列是平稳的。

因此,采用 ARIMA(p,d,q)模型时,差分系数应为 d = 0。如果 ADF 检验的 p 值小于 0.05,则说明差分后的序列是平稳的。否则需要继续进行差分。此时差分系数 d 等于差分直至时序数据平稳时的差分次数。

绘制时序数据的自相关图,和偏自相关图,如下:
在这里插入图片描述
在这里插入图片描述
从图中可以得出,ARIMA 模型的自回归系数为 p=5(自相关系数截尾),移动平均系数 q=1(偏相关系数均衡衰减,取较小值 q)。

Auto-ARIMA

通过偏自相关系数图、自相关系数图筛选 p,q 带有主观性。因此结合 AIC 评价指标,将数据分为测试集和验证集,从而在众多(p,q)参数的组合中,筛选出最佳的 p,q 并与 ADF 检验确定的 d 值,从而得出最佳的 ARIMA 模型。

具体流程为:

  1. 对每一个路径,绘制偏自相关系数、自相关系数图,筛选 p,q 的最大取值 p m a x , q m a x p_{max}, q_{max} pmax,qmax。如上例 G-> L 路径可取 p m a x = 5 , q m a x = 1 p_{max}=5, q_{max}=1 pmax=5,qmax=1
  2. p ∈ ( 0 , 1 , ⋯ , p m a x ) , q ∈ ( 0 , 1 , ⋯ , q m a x ) p\in(0,1,\cdots,p_max), q\in(0,1,\cdots,q_max) p(0,1,,pmax),q(0,1,,qmax),与 d 组合。d 根据 ADF 检验得来,如上例 G->L 路径可取 d = 0,构建 ARIMA 模型,同时按照 7:3 的比例将数据集切分为训练集和测试集
  3. 将模型在训练集中训练并计算 AIC 指标(AIC 只能在训练的过程中计算
  4. 重复 2 -3 步骤,指导遍历完所有 p、d、q 组合,输出 AIC 最小(即最佳)的 ARIMA 模型作为预测模型。并采用 MAPE,即平均绝对偏差的百分数,在测试集中评价模型
  5. 采用该预测模型预测数据的效果。

第二问求解

就以题目中的 M->U 为例吧,绘制图像
在这里插入图片描述
在这里插入图片描述

从自相关图和偏相关图可以取 p m a x = 3 , q m a x = 4 p_{max}=3, q_{max}=4 pmax=3,qmax=4,根据 ADF 的结果:

差分0次后时序稳定
ADF检验的 p值为: 2.63e-08
检验统计量 ADF 为: -6.35

取 d = 0, p m a x = 5 , q m a x = 5 p_{max}=5, q_{max}=5 pmax=5,qmax=5(考虑多种可能性)。根据网格寻优筛选出最佳模型为 p=1, d=0, q=3。

在这里插入图片描述
绘制出残差的 Q-Q 图,以观察残差是否服从正态分布:
在这里插入图片描述
感觉还行,然后用 MAPE 数值分析他的拟合优度:
M A P E = 100 n ∑ i = 1 n ∣ y i − y i ^ ∣ y i MAPE = \frac{100}{n} \sum_{i=1}^{n} \frac{|y_i - \hat{y_i}|}{y_i} MAPE=n100i=1nyiyiyi^
其中, n n n 是样本数量, y i y_i yi 是实际值, y i ^ \hat{y_i} yi^ 是预测值。可求出其值为:0.375

MAPE 的值越小,说明预测结果越准确。然而,MAPE 也有一些缺点,例如它对于实际值为 0 的样本会导致无法计算,同时它也对极端值比较敏感。因此,在使用 MAPE 作为评估指标时,需要结合实际情况进行分析。

解的情况

同理,可以求出其他模型,结论如下:

目前求解 M->U 路径
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -6.35
4 (根据自相关系数图像,筛选出的 p 值,下同)
3(根据偏自相关系数,筛选出的 q 值,下同)
模型的mape为: 0.38 最佳参数(p,d,q)为: (4, 0, 1)
M->U 路径中 4-18 和 4-19 的快递数量分别为:150.12 和 133.39
目前求解 Q->V 路径
差分1次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -8.39
8
4
模型的mape为: 46422190913933.88 最佳参数(p,d,q)为: (1, 1, 1)
Q->V 路径中 4-18 和 4-19 的快递数量分别为:48.17 和 48.17
目前求解 K->L 路径
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -4.4
5
3
模型的mape为: 0.26 最佳参数(p,d,q)为: (1, 0, 1)
K->L 路径中 4-18 和 4-19 的快递数量分别为:54.27 和 54.1
目前求解 G->V 路径
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -6.84
5
5
模型的mape为: 0.14 最佳参数(p,d,q)为: (1, 0, 1)
G->V 路径中 4-18 和 4-19 的快递数量分别为:599.71 和 552.6
目前求解 V->G 路径
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -6.94
5
2
模型的mape为: 0.1 最佳参数(p,d,q)为: (1, 0, 1)
V->G 路径中 4-18 和 4-19 的快递数量分别为:543.1800000000001 和 509.63
目前求解 A->Q 路径
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -4.65
6
3
模型的mape为: 110116766402955.56 最佳参数(p,d,q)为: (5, 0, 1)
A->Q 路径中 4-18 和 4-19 的快递数量分别为:129.09 和 119.93
目前求解 D->A 路径
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -5.45
4
2
模型的mape为: 1141794030037002.0 最佳参数(p,d,q)为: (1, 0, 1)
D->A 路径中 4-18 和 4-19 的快递数量分别为:43.18 和 42.47
目前求解 L->K 路径
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -4.16
6
2
模型的mape为: 0.15 最佳参数(p,d,q)为: (1, 0, 1)
L->K 路径中 4-18 和 4-19 的快递数量分别为:272.32 和 248.46

PS: ARIMA 效果其实也就那样,不过用 LSTM 更惨!!!,本人综合考虑了很多,最终决定采用 ARIMA 模型

D-> A,A-> Q, Q-> V, 这三个路径的 ARIMA 模型,MAPE 值太大了,预测结果不可信。应考虑采用其他办法。

我们可以画出他实际值和预测值的图像

A->Q:

在这里插入图片描述
在这里插入图片描述

D-> A

在这里插入图片描述
在这里插入图片描述

Q-V

在这里插入图片描述
在这里插入图片描述
其实从图中可以看出,勉强可以用。把上述的解取整,就可以了。

总快递数

对总快递数也是一样的

差分0次后时序稳定,ADF检验的 p值为: 0.01 ,检验统计量 ADF 为: -3.56
在这里插入图片描述
在这里插入图片描述
根据图片,设置 p m a x = 7 , q m a x = 5 p_{max}=7, q_{max}=5 pmax=7,qmax=5,筛选模型,从而得到最佳模型的mape为: 1.45。 最佳参数(p,d,q)为: (1, 0, 2)

模型训练过程中的实际值和预测值如下,可以看到基本上是挺准确的。
在这里插入图片描述
在这里插入图片描述
采用模型,求取4-18 和 4-19 的总快递数量分别为:10257.52 和 9473.54,然后取整就行了!

问题二解决。

第三问

首先对每一个路径数据增加一个标签列“可否正常发货”,取值为 0 和 1。1代表可以发货。若有某天缺失了数据,或该天的销售量为 0,则该行的 “可否正常发货” 为 0。

以 A->O 为例:
在这里插入图片描述

按照问题 2 的方法,对每一路径,按照“可否正常发货”这个时序数据,构建一个 ARIMA 模型。求解如下:

目前求取的路径是: I->S
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -4.18
模型的最佳参数(p,d,q)为: (3, 0, 1)
ARIMA 模型的精确度为: 0.94
I->S 路径中 4-18 和 4-19 的快递数量分别为:1 和 1
目前求取的路径是: M->G
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -9.79
模型的最佳参数(p,d,q)为: (1, 0, 1)
ARIMA 模型的精确度为: 0.84
M->G 路径中 4-18 和 4-19 的快递数量分别为:1 和 1
目前求取的路径是: S->Q
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -4.07
模型的最佳参数(p,d,q)为: (1, 0, 1)
ARIMA 模型的精确度为: 0.71
S->Q 路径中 4-18 和 4-19 的快递数量分别为:0 和 0
目前求取的路径是: V->A
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -4.29
模型的最佳参数(p,d,q)为: (2, 0, 2)
ARIMA 模型的精确度为: 0.88
V->A 路径中 4-18 和 4-19 的快递数量分别为:1 和 1
目前求取的路径是: Y->L
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -6.47
模型的最佳参数(p,d,q)为: (1, 0, 1)
ARIMA 模型的精确度为: 0.75
Y->L 路径中 4-18 和 4-19 的快递数量分别为:1 和 1
目前求取的路径是: D->R
差分0次后时序稳定
ADF检验的 p值为: 0.04
检验统计量 ADF 为: -2.99
模型的最佳参数(p,d,q)为: (2, 0, 1)
ARIMA 模型的精确度为: 0.84
D->R 路径中 4-18 和 4-19 的快递数量分别为:1 和 1
目前求取的路径是: J->K
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -4.27
模型的最佳参数(p,d,q)为: (1, 0, 2)
ARIMA 模型的精确度为: 0.83
J->K 路径中 4-18 和 4-19 的快递数量分别为:1 和 1
目前求取的路径是: Q->O
差分1次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -12.1
模型的最佳参数(p,d,q)为: (2, 1, 1)
ARIMA 模型的精确度为: 0.87
Q->O 路径中 4-18 和 4-19 的快递数量分别为:1 和 1
目前求取的路径是: U->O
差分0次后时序稳定
ADF检验的 p值为: 0.03
检验统计量 ADF 为: -3.11
模型的最佳参数(p,d,q)为: (1, 0, 2)
ARIMA 模型的精确度为: 0.86
U->O 路径中 4-18 和 4-19 的快递数量分别为:1 和 1
目前求取的路径是: Y->W
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -6.76
模型的最佳参数(p,d,q)为: (1, 0, 1)
ARIMA 模型的精确度为: 0.82
Y->W 路径中 4-18 和 4-19 的快递数量分别为:1 和 1

因此,对于 [‘I->S’, ‘M->G’, ‘V->A’, ‘Y->L’, ‘D->R’, ‘J->K’, ‘Q->O’, ‘U->O’, ‘Y->W’],还要继续分析。这次亦可以用问题二的方法求解。不考虑不能发货的情况,直接拟合。(当然也可以考虑进去,看那种效果好咯)

目前求解 I->S 路径
差分0次后时序稳定
ADF检验的 p值为: 0.0
检验统计量 ADF 为: -8.31
根据图像,p_max 取值为5
根据图像,q_max 取值为4
I->S 路径中 4-18 和 4-19 的快递数量分别为:46.62 和 46.23
模型的预测拟合如下:
在这里插入图片描述

同理…

目前求解 V->A 路径
差分0次后时序稳定
ADF检验的 p值为: 0.04
检验统计量 ADF 为: -2.97
根据图像,p_max 取值为9
根据图像,q_max 取值为2
V->A 路径中 4-18 和 4-19 的快递数量分别为:51.8 和 54.17
在这里插入图片描述

后面不再列举

第四问

以 2023年4月23日 为例,首先求出“发货-收货”站点城市(共81个)对之间使用的路径,以 ‘R->O’ 为例,有:

[[‘R’, ‘K’, ‘V’, ‘F’, ‘O’],
[‘R’, ‘K’, ‘J’, ‘X’, ‘O’],
[‘R’, ‘X’, ‘O’],
[‘R’, ‘X’, ‘I’, ‘M’, ‘O’],
[‘R’, ‘F’, ‘U’, ‘G’, ‘O’],
[‘R’, ‘F’, ‘O’]]

求出这样的 81 各矩阵,然后问题转变为,从这个 81 个矩阵 P i , i ∈ ( 1 , 2 , ⋯ , 81 ) P_i,i\in(1,2,\cdots,81) Pi,i(1,2,,81),每个矩阵 P i P_i Pi n i n_i ni 个行向量构成的 n 1 ⋅ n 2 ⋅ , ⋯ , ⋅ n 81 = N n_1 \cdot n_2 \cdot,\cdots,\cdot n_{81}= N n1n2,,n81=N 个组合中,找到其中一个组合,使得成本最小。

最简单的办法无疑是暴力求解,但是这不可取,假设每一个“发货-收货”站点城市使用的路径平均为 5 条,则 5 81 = 413590306276513837435704346034981426782906055450439453125 5^{81}= 413590306276513837435704346034981426782906055450439453125 581=413590306276513837435704346034981426782906055450439453125 不可能求解得完。因此,可以考虑采用遗传算法求解。

遗传算法求解

设置基因型为一个长度为 81 的向量。向量中的每一个元素代表着 P i P_i Pi 选择的路径。以 P R − > O P_{R->O} PR>O为例,若该元素为 2,则表示路径 [‘R’, ‘K’, ‘J’, ‘X’, ‘O’] 。

基因的进化方式,考虑两种。一种是自进化,一种是交配。考虑产生 320 个基因型,构成 320 个个体组成的群落。将这个群落按照 8 个个体分成 40 个种群。每个种群中,挑选出最佳的 个体和次佳个体,得到 80 个个体。成本最低,则为最佳个体。

随后,保留最佳个体,然后又最佳个体随机改变其中{1,1,2,2,3,}基因,产生 5 个新的个体。再有最佳个体和次佳个体,交换基因片段产生新的 2 个个体,总共 1 + 5 + 2 = 8 个新个体进入下一代。

如是循环 200 遍,从迭代历史中,找出这 200 代,200 个群落中最佳的个体,即可成为最佳的路径设计和最低成本。

其中,自进化的方式能够加快算法的收敛,而交配的方式则提高了算法的随机性,使得不容易进入局部最优值。同时,分组的方式也能够避开局部最优的问题。

以 2023年4月23日 为例,使用遗传算法求解的最低成本的过程,如下所示。可以看出到 100 步开始就已经收敛了。

在这里插入图片描述

最终可得,最低的成本为 28170。

PS:有一些“发货-收货”站点城市对之间使用的路径,不会小于 5(可能是出题人出错了),所以这里用最小的路径去代替。

第五问

X-11 分解

对每一个 “发货-收货”站点城市,将 2020-4-29 至 2023-4-27 的数据按月求和,从而得到 37 个月的总快递数。

让数据按照 3 个月(一季度)为单位,采用加法模型,进行季度分解。从而得到数据的:趋势、季节性成分、残差

趋势:采用滑动均值模型求取

趋势可以当做固定需求。

具体来说,可以通过以下公式来计算
T ^ t = 1 m ∑ i = 1 m y t − m + i \hat{T}_t = \frac{1}{m} \sum_{i=1}^{m} y_{t-m+i} T^t=m1i=1mytm+i

其中, T ^ t \hat{T}_t T^t 表示在时间 t t t 的趋势估计值, m m m 表示移动窗口的大小, y t y_t yt 表示在时间 t t t 的原始序列值。这个公式表示对于时间序列中每一个时刻 t t t,都取它前 m m m 个时刻的平均值作为该时刻的趋势估计值。

季度趋势:

趋势是非静态的,可以用做非固定需求

S t = ∑ j = 1 m ( w j − m − 1 2 + w j − 1 + w j + 1 2 ) x t − m + j S_t = \sum_{j=1}^{m} \left( \frac{w_{j-m-1}}{2} + w_{j-1} + \frac{w_{j+1}}{2} \right) x_{t-m+j} St=j=1m(2wjm1+wj1+2wj+1)xtm+j

其中, m m m 表示季节长度, x t x_t xt 表示原始时间序列的第 t t t 个观测值, w j w_j wj 表示加权函数,具体定义为:

w j = { 1 − 3 j 2 m 2 , 0 ≤ j ≤ m 3 1 2 ( 1 − j m ) 2 , m 3 < j ≤ 2 m 3 0 , 2 m 3 < j ≤ m − 1 w_j = \begin{cases} 1 - \frac{3j^2}{m^2}, & 0 \leq j \leq \frac{m}{3} \\ \frac{1}{2} \left( 1 - \frac{j}{m} \right)^2, & \frac{m}{3} < j \leq \frac{2m}{3} \\ 0, & \frac{2m}{3} < j \leq m-1 \end{cases} wj= 1m23j2,21(1mj)2,0,0j3m3m<j32m32m<jm1

残差

残差是静态的

求解

以 ‘V->N’ 为例,每月的快递数如下图
在这里插入图片描述
进行季度分解,可得:
在这里插入图片描述

可以看到:Seasonal 列非常的规律性。作为非固定需求是比较可以的。

残差分析

分析残差以验证分解是否妥帖

绘制残差的核密度图,可见大致服从正态分布
在这里插入图片描述

绘制残差的 Q-Q图,正态分布没跑了
在这里插入图片描述
采用 ADF 检验分析是否静态,如下:

残差差分0次后时序稳定
ADF检验的 p值为: 0.01
检验统计量 ADF 为: -3.5

可见该残差已经没有信息量,属于噪声,分解比较成功。

固定需求、非固定需求

于是,用分解结果的趋势,代表固定需求,以 ‘V->N’ 为例,可得V->N 22年第三季度的固定需求数为 8670.67, 23年第一季度的固定需求数为 10840。

用季度性趋势代表非固定需求,可得 V->N 22年第三季度的非固定需求均值为 0, 23年第一季度的非固定需求数为 864.39

其余路径可以按照上述思路求解:

V->Q 22年第三季度的固定需求数为 5737.0,
23年第一季度的固定需求数为 8707.67
V->Q 22年第三季度的非固定需求均值为 -0.0,
23年第一季度的非固定需求数为 708.16
J->I 22年第三季度的固定需求数为 11851.33,
23年第一季度的固定需求数为 19308.0
J->I 22年第三季度的非固定需求均值为 0.0,
23年第一季度的非固定需求数为 1565.52
O->G 22年第三季度的固定需求数为 7553.67,
23年第一季度的固定需求数为 11163.33
O->G 22年第三季度的非固定需求均值为 -0.0,
23年第一季度的非固定需求数为 973.04

代码

代码下载


http://www.ppmy.cn/news/98774.html

相关文章

低资源方面级情感分析研究综述

文章目录 前言1. 引言2. 问题定义、数据集和评价指标2.1 问题定义2.2 任务定义2.3 常用数据集 3. 方面级情感分析的方法3.1 **方面词抽取**3.1.1 基于无监督学习的方法3.1.1.1 基于规则的方面词抽取3.1.1.2 基于统计的方面词抽取 3.1.2 基于有监督浅层模型的方法3.1.3 基于有监…

码蹄杯语言基础:选择结构(C语言)

⭐MT1109和10相比 请编写一个简单程序&#xff0c;输入一个整数&#xff0c;和10比较&#xff0c;输出比较结果 格式 输入格式&#xff1a; 输入整型 输出格式&#xff1a; 输出…大于或者等于或者小于10 #include<stdio.h> int main() {int x;scanf("%d",…

CVPR 2018 | Spotlight论文:单摄像头数秒构建3D人体模型

想把自己的身体形象投射进电子游戏里?现在已经是很容易的事了。人工智能算法此前已被广泛应用于虚拟现实头像、监视、服装试穿或电影等多种任务的人体建模上,但大多数方法需要特殊的照相设备来检测景深,或从多个角度探查人体。近日,来自德国布伦瑞克工业大学和 Max Planck …

批量单独下载package.json中的包

根据package.json文件中指定的版本限制来下载依赖项&#xff0c;并确保符合指定的版本限制 我使用semver库来进行版本比较和匹配。以下是优化后的代码示例&#xff1a; const { execSync } require(child_process) const semver require(semver) const devDependencies re…

【分糖果】

有 N N N 个盒子排成一排&#xff0c;第 i i i 个盒子里有 A i A_i Ai​ 个糖果。你需要从一些连续的盒子里取出糖果&#xff0c;分给 M M M 个小朋友&#xff0c;使得每个小朋友得到的糖果数量相等。求有多少种取法满足以下两个条件&#xff1a; 取出的盒子数为 r − l …

C++11 -- lambda表达式

文章目录 lamaba表达式的引入lambda表达式语法lamabda达式各部分说明捕获列表说明 lamaba表达式底层原理探索 lamaba表达式的引入 在C11之前,如果我们想对自定义类型Goods排序,可以根据姓名,价格,学号按照从大到小或者从小到大的方式排序,可是,这样我们要写额外写6个相关的仿函…

springboot配置Swagger3.0

springboot配置Swagger3.0 1、pom加入依赖 我们创建一个SpringBoot项目&#xff0c;引入 swagger3 依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>…

电脑msvcp120.dll缺失怎么办?由于找不到msvcp120.dll的解决方案

MSVCP120.dll文件是Windows操作系统中的一种动态链接库文件。它是由Microsoft C软件包提供的重要组件。当系统提示“MSVCP120.dll文件缺失”时&#xff0c;可能会导致某些应用程序无法正常运行。 以下是修复MSVCP120.dll缺失问题的几种方法&#xff1a; 方法一&#xff1a;修复…