2023 Mathorcup(C题)深度剖析|数学建模完整代码+建模过程全解全析
数字商品 教育 / 知识

2023 Mathorcup(C题)深度剖析|数学建模完整代码+建模过程全解全析

CS数模 · 2 · 0

商品介绍
当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2021年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。
我的解题思路是基于数学建模领域的前沿理论和实践研究,具有极强的创新性和实用性。我深入分析了各种数学建模问题,并总结出了一套行之有效的解决方案,帮助大家在竞赛中脱颖而出,或在实际情景中解决问题。我们的团队既注重理论分析,又重视实际应用。在此次美赛中,我们依据实际问题出发,结合数学建模理论进行分析,并给出可行的解决方案。通过我的解题思路,你可以快速理解各种数学建模问题,并有效地解决它们。
我的解题思路的实用性得到了众多用户的认可,许多人已经使用我的方法成功地解决了各种问题,了解了各种思路和技巧。通过使用我的解题思路,大家可以快速理解和掌握数学建模问题,并且取得更好的成绩和效果。以下是在国赛时,我们团队所使用的相应的代码和思路,大家可以先参考参考:2022国赛成品参考论文
希望这些想法对大家的做题有一定的启发和借鉴意义。
C题
问题重述

给定一电商物流网络,该网络由物流场地和运输线路组成,各场地和线路之间的货量随时间变化。现需要预测该网络在未来每天的各物流场地和线路的货量,以便管理者能够提前安排运输和分拣等计划,降低运营成本,提高运营效率。此外,还需要设计物流网络调整方案,以应对突发事件导致场地停用的情况。假设每个物流场地的处理能力和每条线路的运输能力上限均为其历史货量最大值
注:因为C题言简意赅且比较传统,可以预计的是选择C题人数会较多问题一

建立线路货量的预测模型,对 2023-01-01 至 2023-01-31 期间每条线路每天的货量进行预测,并在提交的论文中给出线路 DC14→DC10、DC20→DC35、DC25→DC62 的预测结果。
建立线路货量的预测模型的步骤如下:

数据预处理:对于每条线路和每个物流场地,计算其历史货量的平均值、方差等统计量,并进行缺失值填充。
特征工程:根据历史货量的时间序列数据,提取相关特征,如趋势、周期性、节假日影响等。
模型选择:选择适合时间序列预测的模型,如 ARIMA、SARIMA、Prophet 等。
模型训练:使用历史数据训练模型,并根据模型的性能对模型进行调优。
模型预测:对于每条线路和每个物流场地,使用训练好的模型进行预测,并计算预测结果的置信区间。

数据进行预处理

可以看到附件1中部分数学出现缺失或为零,为了处理缺失的数据,典型的方法包括插值法和删除法, 其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值。
注:因为此题数据众多,我们强烈推荐使用Python进行数据处理(当然Matlab也可以)Python代码
 import pandas as pd
 # python的第三方库
 data = pd.read_csv(data_file)
 # 修改为文件目录
 ​
 inputs = data.iloc[:]
 # 使用平均进行插值(均是数值缺失)
 inputs = inputs.fillna(inputs.mean())
 print(inputs)
 ​
 # 也可以删除缺失行
 n, m = data.shape
 for i in range(m):
   for j in range(n):
     if pd.isnull(data.iloc[j][i]):
       data.drop(j)
       break
 ​
将数据转换为 stationary 数据

再将附件一中的货量数据按照每条线路每天的形式进行整理,并将时间序列数据转换为 stationary 数据,以便进行时间序列建模。代码如下
 import pandas as pd
 import numpy as np
 from statsmodels.tsa.stattools import adfuller
 ​
 # 读入数据
 data = pd.read_csv('附件1.csv')
 ​
 # 将数据按照每条线路每天的形式进行整理
 data = data.pivot_table(index='日期', columns=['起点', '终点'], values='货量')
 ​
 # 将数据转换为 stationary 数据
 def make_stationary(ts):
   rolmean = ts.rolling(window=7).mean() # 滑动平均
   rolstd = ts.rolling(window=7).std() # 滑动标准差
   # 计算差分序列
   ts_diff = ts - rolmean
   ts_diff.dropna(inplace=True)
   # 检查差分序列是否 stationary
   dftest = adfuller(ts_diff, autolag='AIC')
   print('ADF检验统计量: ', dftest[0])
   print('p-value: ', dftest[1])
   print('滞后阶数: ', dftest[2])
   print('观察数: ', dftest[3])
   print('拒绝原假设的最小 p-value: ', dftest[4]['1%'])
   return ts_diff
 ​
 data_diff = make_stationary(data['DC3']['DC10']) # 以 DC3→DC10 为例进行差分操作
模型训练

接下来,可以使用 ARIMA 模型对差分后的数据进行建模。根据数据的自相关函数和偏自相关函数,可以选择合适的 ARIMA 模型,其中 p 为 AR 阶数,d 为差分阶数,q 为 MA 阶数。代码如下:
 from statsmodels.tsa.stattools import acf, pacf
 from statsmodels.tsa.arima_model import ARIMA
 ​
 # 检查数据的自相关函数和偏自相关函数
 lag_acf = acf(data_diff, nlags=20)
 lag_pacf = pacf(data_diff, nlags=20, method='ols')
 ​
 # 根据自相关函数和偏自相关函数选择 ARIMA 模型
 model = ARIMA(data['DC3']['DC10'], order=(1,1,1))
 result = model.fit(disp=-1)
 ​
 # 查看模型的性能
 print(result.summary())
模型预测

最后,可以使用训练好的模型进行预测,并计算预测结果的置信区间。代码如下:
 # 对未来30天的数据进行预测
 forecast = result.forecast(steps=30)
 ​
 # 计算置信区间
 conf_int = forecast.conf_int()
 ​
 # 将预测结果和置信区间输出
 result_df = pd.DataFrame({'预测值': forecast[0], '下限': conf_int.iloc[:,0], '上限': conf_int.iloc[:,1]})
 print(result_df)

给定一电商物流网络,该网络由物流场地和运输线路组成,各场地和线路之间的货量随时间变化。现需要预测该网络在未来每天的各物流场地和线路的货量,以便管理者能够提前安排运输和分拣等计划,降低运营成本,提高运营效率。此外,还需要设计物流网络调整方案,以应对突发事件导致场地停用的情况。假设每个物流场地的处理能力和每条线路的运输能力上限均为其历史货量最大值
注:因为C题言简意赅且比较传统,可以预计的是选择C题人数会较多问题一

建立线路货量的预测模型,对 2023-01-01 至 2023-01-31 期间每条线路每天的货量进行预测,并在提交的论文中给出线路 DC14→DC10、DC20→DC35、DC25→DC62 的预测结果。
建立线路货量的预测模型的步骤如下:

数据预处理:对于每条线路和每个物流场地,计算其历史货量的平均值、方差等统计量,并进行缺失值填充。
特征工程:根据历史货量的时间序列数据,提取相关特征,如趋势、周期性、节假日影响等。
模型选择:选择适合时间序列预测的模型,如 ARIMA、SARIMA、Prophet 等。
模型训练:使用历史数据训练模型,并根据模型的性能对模型进行调优。
模型预测:对于每条线路和每个物流场地,使用训练好的模型进行预测,并计算预测结果的置信区间。

数据进行预处理

可以看到附件1中部分数学出现缺失或为零,为了处理缺失的数据,典型的方法包括插值法和删除法, 其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值。
注:因为此题数据众多,我们强烈推荐使用Python进行数据处理(当然Matlab也可以)Python代码
 import pandas as pd
 # python的第三方库
 data = pd.read_csv(data_file)
 # 修改为文件目录
 ​
 inputs = data.iloc[:]
 # 使用平均进行插值(均是数值缺失)
 inputs = inputs.fillna(inputs.mean())
 print(inputs)
 ​
 # 也可以删除缺失行
 n, m = data.shape
 for i in range(m):
   for j in range(n):
     if pd.isnull(data.iloc[j][i]):
       data.drop(j)
       break
 ​
将数据转换为 stationary 数据

再将附件一中的货量数据按照每条线路每天的形式进行整理,并将时间序列数据转换为 stationary 数据,以便进行时间序列建模。代码如下
 import pandas as pd
 import numpy as np
 from statsmodels.tsa.stattools import adfuller
 ​
 # 读入数据
 data = pd.read_csv('附件1.csv')
 ​
 # 将数据按照每条线路每天的形式进行整理
 data = data.pivot_table(index='日期', columns=['起点', '终点'], values='货量')
 ​
 # 将数据转换为 stationary 数据
 def make_stationary(ts):
   rolmean = ts.rolling(window=7).mean() # 滑动平均
   rolstd = ts.rolling(window=7).std() # 滑动标准差
   # 计算差分序列
   ts_diff = ts - rolmean
   ts_diff.dropna(inplace=True)
   # 检查差分序列是否 stationary
   dftest = adfuller(ts_diff, autolag='AIC')
   print('ADF检验统计量: ', dftest[0])
   print('p-value: ', dftest[1])
   print('滞后阶数: ', dftest[2])
   print('观察数: ', dftest[3])
   print('拒绝原假设的最小 p-value: ', dftest[4]['1%'])
   return ts_diff
 ​
 data_diff = make_stationary(data['DC3']['DC10']) # 以 DC3→DC10 为例进行差分操作
模型训练

接下来,可以使用 ARIMA 模型对差分后的数据进行建模。根据数据的自相关函数和偏自相关函数,可以选择合适的 ARIMA 模型,其中 p 为 AR 阶数,d 为差分阶数,q 为 MA 阶数。代码如下:
 from statsmodels.tsa.stattools import acf, pacf
 from statsmodels.tsa.arima_model import ARIMA
 ​
 # 检查数据的自相关函数和偏自相关函数
 lag_acf = acf(data_diff, nlags=20)
 lag_pacf = pacf(data_diff, nlags=20, method='ols')
 ​
 # 根据自相关函数和偏自相关函数选择 ARIMA 模型
 model = ARIMA(data['DC3']['DC10'], order=(1,1,1))
 result = model.fit(disp=-1)
 ​
 # 查看模型的性能
 print(result.summary())
模型预测

最后,可以使用训练好的模型进行预测,并计算预测结果的置信区间。代码如下:
 # 对未来30天的数据进行预测
 forecast = result.forecast(steps=30)
 ​
 # 计算置信区间
 conf_int = forecast.conf_int()
 ​
 # 将预测结果和置信区间输出
 result_df = pd.DataFrame({'预测值': forecast[0], '下限': conf_int.iloc[:,0], '上限': conf_int.iloc[:,1]})
 print(result_df)

同店推荐

包含文件 · 3 · 315.1 KB

  • 01_Dataprocess.py 1.4 KB
  • 02_Model.py 749.0 B
  • 03_C题.pdf 313.0 KB
支付金额 ¥10.40