(D题)2025 mathorcup妈妈杯数学建模竞赛解题思路|完整代码论文集合

我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合,专为本次赛题设计,旨在帮助您深入理解数学建模的每一个环节。
本次妈妈杯D题可以做如下考虑 (文中代码仅有部分,完整论文格式标准,包含全部代码)

完整内容均可以在文章末尾领取!(部分代码在本帖子里格式混乱,下载后格式正常)
第一个问题是:

问题1:货量预测模型
在这里插入图片描述

建立货量预测模型,对未来1天各条线路的货量进行预测,并将每条线路的总货量拆解到10分钟颗粒度(结果的时间范围为12月15日14:00至12月16日14:00)。请将预测结果写入结果表1和表2中,并在论文中给出线路编码为“场地3-站点83-0600”和“场地3-站点83-1400”的预测结果。

问题1:货量预测模型的数学建模

1. 问题分析

我们需要建立一个货量预测模型,预测未来1天各条线路的货量,并将每条线路的总货量拆解到10分钟颗粒度。预测的时间范围为12月15日14:00至12月16日14:00。预测结果需要写入结果表1和表2中,并在论文中给出特定线路的预测结果。

2. 数据准备
  • 附件2:各线路历史15天的实际包裹量。
  • 附件3:各线路近15天的每天预知货量及未来1天在21点时的预知货量。
3. 模型选择

考虑到历史数据和预知货量,我们可以选择时间序列预测模型,如ARIMA、SARIMA、Prophet或LSTM等。这里我们选择SARIMA模型,因为它能够处理季节性数据,适合短途运输的周期性特征。

4. 模型建立在这里插入图片描述
4.1 数据预处理
  • 数据清洗:处理缺失值和异常值。
  • 数据转换:将历史数据转换为时间序列格式,并提取特征如日期、时间、货量等。
  • 数据分割:将历史数据分为训练集和测试集。
4.2 模型参数选择
  • 季节性周期:假设每天有两个发运节点(6点和14点),季节性周期为12(每小时6个10分钟间隔)。
  • 参数选择:通过ACF和PACF图选择合适的ARIMA参数(p, d, q)。
4.3 模型训练
  • 训练SARIMA模型:使用训练集数据训练SARIMA模型。
  • 模型验证:使用测试集数据验证模型的预测精度。
4.4 货量预测
  • 预测未来1天货量:使用训练好的SARIMA模型预测未来1天各条线路的货量。
  • 拆解到10分钟颗粒度:将预测的总货量拆解到10分钟间隔。
5. 结果输出
  • 结果表1:各条线路的总货量预测结果。
  • 结果表2:各条线路的10分钟颗粒度货量预测结果。
  • 论文中特定线路预测结果:给出线路编码为“场地3-站点83-0600”和“场地3-站点83-1400”的预测结果。
6. 模型评估
  • 评估指标:使用MAE、RMSE等指标评估模型的预测精度。
  • 模型优化:根据评估结果调整模型参数,优化预测精度。

7. 数学公式

SARIMA模型的数学表达式为:

ϕ p ( B ) Φ P ( B s ) ( 1 − B ) d ( 1 − B s ) D y t = θ q ( B ) Θ Q ( B s ) ϵ t \phi_p(B)\Phi_P(B^s)(1-B)^d(1-B^s)^D y_t = \theta_q(B)\Theta_Q(B^s)\epsilon_t ϕp(B)ΦP(Bs)(1B)d(1Bs)Dyt=θq(B)ΘQ(Bs)ϵt

其中:

  • $ y_t $ 是时间序列数据。
  • $ B $ 是滞后算子。
  • $ \phi_p(B) $ 和 $ \theta_q(B) $ 分别是AR和MA的非季节性部分。
  • $ \Phi_P(B^s) $ 和 $ \Theta_Q(B^s) $ 分别是AR和MA的季节性部分。
  • $ \epsilon_t $ 是白噪声。

8. 结论

通过建立SARIMA模型,我们可以有效预测未来1天各条线路的货量,并将总货量拆解到10分钟颗粒度。预测结果将为后续的运输需求与车辆调度提供重要依据。
为了建立货量预测模型,我们可以采用时间序列分析方法,特别是基于历史数据的预测方法。以下是一个基于ARIMA(自回归积分滑动平均)模型的货量预测方法。

1. 数据预处理

首先,我们需要对历史货量数据进行预处理,包括缺失值处理、数据平滑等。假设我们有 n n n天的历史货量数据,记为 y 1 , y 2 , … , y n y_1, y_2, \dots, y_n y1,y2,,yn

2. 模型选择在这里插入图片描述

ARIMA模型是一个常用的时间序列预测模型,其公式为:

y t = c + ∑ i = 1 p ϕ i y t − i + ∑ j = 1 q θ j ϵ t − j + ϵ t y_t = c + \sum_{i=1}^p \phi_i y_{t-i} + \sum_{j=1}^q \theta_j \epsilon_{t-j} + \epsilon_t yt=c+i=1pϕiyti+j=1qθjϵtj+ϵt

其中:

  • y t y_t yt是时间 t t t的货量;
  • c c c是常数项;
  • ϕ i \phi_i ϕi是自回归系数;
  • θ j \theta_j θj是滑动平均系数;
  • ϵ t \epsilon_t ϵt是误差项;
  • p p p是自回归阶数;
  • q q q是滑动平均阶数。

3. 模型参数估计

我们需要通过历史数据估计ARIMA模型的参数。通常使用最大似然估计法或最小二乘法来估计参数。

4. 模型检验

使用AIC(赤池信息准则)或BIC(贝叶斯信息准则)来选择最优的 p p p q q q值。AIC和BIC的计算公式分别为:

A I C = 2 k − 2 ln ⁡ ( L ) AIC = 2k - 2\ln(L) AIC=2k2ln(L)

B I C = k ln ⁡ ( n ) − 2 ln ⁡ ( L ) BIC = k\ln(n) - 2\ln(L) BIC=kln(n)2ln(L)

其中:

  • k k k是模型参数的数量;
  • L L L是模型的最大似然值;
  • n n n是样本数量。

5. 货量预测

使用估计好的ARIMA模型对未来1天的货量进行预测。预测公式为:

y ^ n + 1 = c + ∑ i = 1 p ϕ i y n + 1 − i + ∑ j = 1 q θ j ϵ n + 1 − j \hat{y}_{n+1} = c + \sum_{i=1}^p \phi_i y_{n+1-i} + \sum_{j=1}^q \theta_j \epsilon_{n+1-j} y^n+1=c+i=1pϕiyn+1i+j=1qθjϵn+1j

其中 y ^ n + 1 \hat{y}_{n+1} y^n+1是第 n + 1 n+1 n+1天的预测货量。

6. 货量拆解到10分钟颗粒度

将预测的总货量拆解到10分钟颗粒度。假设一天有144个10分钟时间段,记为 t 1 , t 2 , … , t 144 t_1, t_2, \dots, t_{144} t1,t2,,t144。我们可以使用历史数据中的10分钟货量比例来拆解总货量。设第 i i i个10分钟时间段的货量比例为 r i r_i ri,则第 i i i个时间段的预测货量为:

y ^ t i = y ^ n + 1 × r i \hat{y}_{t_i} = \hat{y}_{n+1} \times r_i y^ti=y^n+1×ri

7. 结果输出

将预测结果写入结果表1和表2中。对于线路编码为“场地3-站点83-0600”和“场地3-站点83-1400”的预测结果,可以在论文中展示其预测货量及拆解到10分钟颗粒度的详细数据。

示例

假设我们预测“场地3-站点83-0600”的总货量为1000个包裹,其10分钟货量比例为 r 1 , r 2 , … , r 144 r_1, r_2, \dots, r_{144} r1,r2,,r144,则第 i i i个10分钟时间段的预测货量为:

y ^ t i = 1000 × r i \hat{y}_{t_i} = 1000 \times r_i y^ti=1000×ri

通过以上步骤,我们可以建立一个货量预测模型,并对未来1天各条线路的货量进行预测,同时将总货量拆解到10分钟颗粒度。
为了建立货量预测模型,我们可以使用时间序列预测方法,如ARIMA、Prophet或LSTM等。这里我们选择使用Prophet模型,因为它对时间序列数据的处理较为简单且效果较好。我们将基于历史15天的货量数据(附件2)来预测未来1天的货量,并将结果拆解到10分钟颗粒度。

步骤1:数据预处理

首先,我们需要加载并预处理历史货量数据,将其转换为适合Prophet模型输入的格式。

步骤2:模型训练与预测

使用Prophet模型进行训练,并预测未来1天的货量。

步骤3:结果拆解

将预测的总货量拆解到10分钟颗粒度。

Python代码实现

import pandas as pd
from fbprophet import Prophet
import numpy as np

# 步骤1:数据预处理
# 假设附件2中的数据已经加载到一个DataFrame中,列名为['线路编码', '日期', '时间', '货量']
# 例如:df = pd.read_csv('附件2.csv')

# 将日期和时间合并为一个时间戳列
df['ds'] = pd.to_datetime(df['日期'] + ' ' + df['时间'])
df = df.rename(columns={'货量': 'y'})

# 步骤2:模型训练与预测
# 初始化Prophet模型
model = Prophet()

# 训练模型
model.fit(df)

# 创建未来1天的时间序列,颗粒度为10分钟
future = model.make_future_dataframe(periods=144, freq='10T')  # 144个10分钟间隔为24小时

# 进行预测
forecast = model.predict(future)

# 步骤3:结果拆解
# 提取预测结果中的时间戳和预测值
forecast_result = forecast[['ds', 'yhat']]

# 将结果写入结果表1和表2
# 假设结果表1和表2的结构如下:
# 结果表1:['线路编码', '日期', '时间', '预测货量']
# 结果表2:['线路编码', '日期', '时间', '预测货量']

# 为每条线路生成预测结果
# 这里假设我们只处理一条线路,实际应用中需要对所有线路进行循环处理
line_code = '场地3-站点83-0600'
forecast_result['线路编码'] = line_code
forecast_result['日期'] = forecast_result['ds'].dt.date
forecast_result['时间'] = forecast_result['ds'].dt.time

# 重命名列
forecast_result = forecast_result.rename(columns={'yhat': '预测货量'})

# 保存结果到CSV文件
forecast_result.to_csv('结果表1.csv', index=False)

# 如果需要拆解到10分钟颗粒度,可以直接使用forecast_result

# 输出线路编码为“场地3-站点83-0600”和“场地3-站点83-1400”的预测结果
print(forecast_result[forecast_result['线路编码'].isin(['场地3-站点83-0600', '场地3-站点83-1400'])])

解释

  1. 数据预处理:我们将历史货量数据中的日期和时间合并为一个时间戳列,并将其作为Prophet模型的输入。
  2. 模型训练与预测:使用Prophet模型进行训练,并预测未来1天的货量。我们创建了一个未来1天的时间序列,颗粒度为10分钟。
  3. 结果拆解:将预测结果拆解到10分钟颗粒度,并保存到CSV文件中。

注意事项

  • 实际应用中,需要对所有线路进行循环处理,生成每条线路的预测结果。
  • 预测结果可能会有一定的偏差,需要根据实际情况进行调整。

通过上述代码,我们可以生成未来1天的货量预测结果,并将其拆解到10分钟颗粒度。
第二个问题是:运输需求与车辆调度

问题2:运输需求与车辆调度

根据问题1输出的结果,确定运输需求,包括每条线路的发运车辆数、预计发运时间及串点方案,其中每个需求的发运时间不能晚于线路的发运节点。基于以上结果,确定每个需求的承运车辆;要求自有车的周转率尽可能高,以及所有车辆均包裹尽可能高、总成本尽可能低。请将结果写入结果表3中,结果需包含:线路编码、预计发运时间、承运车辆。其中串点方案可将多条线路编码合并在“线路”一列展示,无法使用自有车满足时注明为“外部”,并在论文中给出线路编码为“场地3-站点83-0600”和“场地3-站点83-1400”的调度结果。

问题2:运输需求与车辆调度

1. 问题分析

问题2的核心是基于问题1的货量预测结果,确定每条线路的运输需求(包括发运车辆数、预计发运时间及串点方案),并安排承运车辆。目标是最大化自有车的周转率、尽可能提高包裹装载率,并最小化总成本。调度过程中需满足发运时间不晚于线路的发运节点。

2. 模型假设
  • 每条线路的货量预测已知,且已拆解到10分钟颗粒度。
  • 每条线路的发运节点为6:00或14:00。
  • 自有车辆的数量有限,且每辆车的装载量固定。
  • 串点方案允许将多条线路合并为一个运输需求,以减少车辆使用。
  • 若自有车无法满足需求,可使用外部车辆,但成本较高。
3. 变量定义
  • $ i : 线路编号, : 线路编号, :线路编号, i \in {1, 2, \dots, N} $。
  • $ t : 时间颗粒度, : 时间颗粒度, :时间颗粒度, t \in {1, 2, \dots, T} $,每个颗粒度为10分钟。
  • $ Q_i : 线路 : 线路 :线路 i $的总货量。
  • $ q_{i,t} : 线路 : 线路 :线路 i 在时间 在时间 在时间 t $的货量。
  • $ C $: 每辆车的装载量。
  • $ V $: 自有车辆总数。
  • $ v : 车辆编号, : 车辆编号, :车辆编号, v \in {1, 2, \dots, V} $。
  • $ x_{i,v} : 二进制变量,若线路 : 二进制变量,若线路 :二进制变量,若线路 i 由车辆 由车辆 由车辆 v 承运,则 承运,则 承运,则 x_{i,v} = 1 $;否则为0。
  • $ y_{i,j,v} : 二进制变量,若线路 : 二进制变量,若线路 :二进制变量,若线路 i 和 和 j 由车辆 由车辆 由车辆 v 串点承运,则 串点承运,则 串点承运,则 y_{i,j,v} = 1 $;否则为0。
  • $ t_{i,v} : 线路 : 线路 :线路 i 由车辆 由车辆 由车辆 v $承运的发运时间。
  • $ \text{Cost}_{i,v} : 线路 : 线路 :线路 i 由车辆 由车辆 由车辆 v $承运的成本。
  • $ \text{External}_i : 二进制变量,若线路 : 二进制变量,若线路 :二进制变量,若线路 i 由外部车辆承运,则 由外部车辆承运,则 由外部车辆承运,则 \text{External}_i = 1 $;否则为0。
4. 目标函数

目标是最小化总成本,同时最大化自有车的周转率和包裹装载率。总成本包括自有车的运输成本和外部车的运输成本。目标函数可表示为:
Minimize ∑ i = 1 N ∑ v = 1 V Cost i , v ⋅ x i , v + ∑ i = 1 N External i ⋅ Cost external \text{Minimize} \quad \sum_{i=1}^N \sum_{v=1}^V \text{Cost}_{i,v} \cdot x_{i,v} + \sum_{i=1}^N \text{External}_i \cdot \text{Cost}_{\text{external}} Minimizei=1Nv=1VCosti,vxi,v+i=1NExternaliCostexternal
其中,$ \text{Cost}_{\text{external}} $为外部车的单位运输成本。

5. 约束条件
  1. 货量约束:每条线路的货量必须被满足:
    ∑ v = 1 V x i , v ⋅ C + External i ⋅ C ≥ Q i , ∀ i \sum_{v=1}^V x_{i,v} \cdot C + \text{External}_i \cdot C \geq Q_i, \quad \forall i v=1Vxi,vC+ExternaliCQi,i
  2. 发运时间约束:每条线路的发运时间不能晚于其发运节点:
    t i , v ≤ Node i , ∀ i , v t_{i,v} \leq \text{Node}_i, \quad \forall i, v ti,vNodei,i,v
    其中,$ \text{Node}_i 为线路 为线路 为线路 i $的发运节点。
  3. 车辆装载量约束:每辆车的装载量不能超过其容量:
    ∑ i = 1 N x i , v ⋅ q i , t ≤ C , ∀ v , t \sum_{i=1}^N x_{i,v} \cdot q_{i,t} \leq C, \quad \forall v, t i=1Nxi,vqi,tC,v,t
  4. 串点方案约束:若两条线路由同一辆车串点承运,则它们的发运时间必须兼容:
    y i , j , v ⋅ ( t i , v + TravelTime i , j ) ≤ t j , v , ∀ i , j , v y_{i,j,v} \cdot (t_{i,v} + \text{TravelTime}_{i,j}) \leq t_{j,v}, \quad \forall i, j, v yi,j,v(ti,v+TravelTimei,j)tj,v,i,j,v
    其中,$ \text{TravelTime}_{i,j} 为线路 为线路 为线路 i 到线路 到线路 到线路 j $的行驶时间。
  5. 车辆唯一性约束:每条线路只能由一辆车承运:
    ∑ v = 1 V x i , v + External i = 1 , ∀ i \sum_{v=1}^V x_{i,v} + \text{External}_i = 1, \quad \forall i v=1Vxi,v+Externali=1,i
  6. 外部车使用约束:若自有车无法满足需求,则使用外部车:
    $$
    \text{External}i = 1 - \sum{v=1}^V

问题2:运输需求与车辆调度

1. 运输需求确定

根据问题1的货量预测结果,确定每条线路的运输需求。设线路 i i i的总货量为 Q i Q_i Qi,车辆的装载量为 C C C,则线路 i i i所需的车辆数 N i N_i Ni可以通过以下公式计算:

N i = ⌈ Q i C ⌉ N_i = \left\lceil \frac{Q_i}{C} \right\rceil Ni=CQi

其中, ⌈ ⋅ ⌉ \lceil \cdot \rceil 表示向上取整。

2. 预计发运时间

每条线路的发运时间 T i T_i Ti不能晚于线路的发运节点 T node , i T_{\text{node},i} Tnode,i。假设车辆从起始场地到目的场地的在途时长为 D i D_i Di,则发运时间 T i T_i Ti应满足:

T i ≤ T node , i − D i T_i \leq T_{\text{node},i} - D_i TiTnode,iDi

3. 串点方案

串点方案允许将多条线路合并发运。设可串点的线路集合为 S S S,则串点后的总货量 Q S Q_S QS为:

Q S = ∑ i ∈ S Q i Q_S = \sum_{i \in S} Q_i QS=iSQi

串点后的车辆数 N S N_S NS为:

N S = ⌈ Q S C ⌉ N_S = \left\lceil \frac{Q_S}{C} \right\rceil NS=CQS

4. 车辆调度

设自有车辆数为 M M M,外部车辆数为 E E E。目标是最小化总成本 C total C_{\text{total}} Ctotal,同时最大化自有车的周转率。总成本 C total C_{\text{total}} Ctotal包括自有车成本 C own C_{\text{own}} Cown和外部车成本 C ext C_{\text{ext}} Cext

C total = C own + C ext C_{\text{total}} = C_{\text{own}} + C_{\text{ext}} Ctotal=Cown+Cext

自有车成本 C own C_{\text{own}} Cown与车辆使用次数 U U U相关,外部车成本 C ext C_{\text{ext}} Cext与外部车辆数 E E E相关。优化目标为:

min ⁡ C total 且 max ⁡ U \min C_{\text{total}} \quad \text{且} \quad \max U minCtotalmaxU

5. 调度结果

调度结果包括线路编码、预计发运时间、承运车辆。对于无法使用自有车满足的需求,注明为“外部”。

6. 示例

对于线路编码为“场地3-站点83-0600”和“场地3-站点83-1400”的调度结果,假设其总货量分别为 Q 1 Q_1 Q1 Q 2 Q_2 Q2,车辆装载量为 C C C,则所需车辆数分别为:

N 1 = ⌈ Q 1 C ⌉ , N 2 = ⌈ Q 2 C ⌉ N_1 = \left\lceil \frac{Q_1}{C} \right\rceil, \quad N_2 = \left\lceil \frac{Q_2}{C} \right\rceil N1=CQ1,N2=CQ2

如果串点方案可行,则串点后的总货量为 Q S = Q 1 + Q 2 Q_S = Q_1 + Q_2 QS=Q1+Q2,所需车辆数为:

N S = ⌈ Q S C ⌉ N_S = \left\lceil \frac{Q_S}{C} \right\rceil NS=CQS

最终调度结果将根据自有车和外部车的可用性进行分配。

通过以上步骤,可以确定运输需求并进行车辆调度,以满足运输时效要求并优化成本。
为了解决问题2,我们需要根据问题1的货量预测结果,确定每条线路的运输需求,并调度车辆以满足这些需求。以下是解决该问题的Python代码示例:

import pandas as pd
import numpy as np

# 假设我们已经有了问题1的预测结果
# 这里我们假设预测结果存储在DataFrame中,列名为 '线路编码', '时间', '货量'
# 例如:df_predict = pd.read_csv('predictions.csv')

# 假设我们有以下数据
# 附件1:各车队负责的线路及相关信息
df_routes = pd.read_csv('附件1.csv')
# 附件5:各车队的自有车数量
df_fleet = pd.read_csv('附件5.csv')

# 假设我们有以下函数来计算运输需求
def calculate_transport_demand(df_predict, df_routes, df_fleet):
    # 初始化结果表
    result = pd.DataFrame(columns=['线路编码', '预计发运时间', '承运车辆'])

    # 遍历每条线路
    for _, row in df_predict.iterrows():
        route_code = row['线路编码']
        time = row['时间']
        volume = row['货量']

        # 获取该线路的相关信息
        route_info = df_routes[df_routes['线路编码'] == route_code].iloc[0]
        transit_time = route_info['在途时长']
        cost = route_info['变动成本']

        # 计算需要的车辆数
        # 假设每辆车可以运输100个包裹
        vehicles_needed = int(np.ceil(volume / 100))

        # 获取可用的自有车
        fleet_info = df_fleet[df_fleet['车队编码'] == route_info['车队编码']].iloc[0]
        available_vehicles = fleet_info['自有车数量']

        # 确定承运车辆
        if available_vehicles >= vehicles_needed:
            # 使用自有车
            vehicles = [f'自有车{i+1}' for i in range(vehicles_needed)]
        else:
            # 使用外部车辆
            vehicles = ['外部']

        # 添加到结果表
        result = result.append({
            '线路编码': route_code,
            '预计发运时间': time,
            '承运车辆': ', '.join(vehicles)
        }, ignore_index=True)

    return result

# 假设我们有以下预测数据
df_predict = pd.DataFrame({
    '线路编码': ['场地3-站点83-0600', '场地3-站点83-1400'],
    '时间': ['2023-12-16 06:00', '2023-12-16 14:00'],
    '货量': [500, 300]
})

# 计算运输需求
result = calculate_transport_demand(df_predict, df_routes, df_fleet)

# 输出结果
print(result)

# 将结果写入结果表3
result.to_csv('结果表3.csv', index=False)

代码说明:

  1. 数据加载:我们假设已经加载了问题1的预测结果、各车队负责的线路及相关信息、各车队的自有车数量。
  2. 运输需求计算:我们遍历每条线路的预测货量,计算需要的车辆数,并根据自有车的可用性确定承运车辆。
  3. 结果输出:将结果写入到结果表3中,并输出到CSV文件。

注意事项:

  • 代码中的假设(如每辆车可以运输100个包裹)需要根据实际情况进行调整。
  • 代码中的数据处理部分需要根据实际数据的格式进行相应的调整。
  • 该代码仅为示例,实际应用中可能需要考虑更多的约束条件和优化目标。
    第三个问题是:标准容器优化

具体描述如下:

当前存在一种标准容器,使用该容器可以进一步提升自有车辆利用率,将装车及卸车时长显著缩短至10分钟;但缺点是会降低车辆的装载量,其装载包裹量下降至800个。假设这种容器数量是无限的。请根据问题1输出的结果,重新确定运输需求,优化目标与问题2相同。在问题2所需输出结果的基础上,需另外输出各运输需求是否使用该标准容器。请将结果写入结果表4中,并在论文中给出线路编码为“场地3-站点83-0600”和“场地3-站点83-1400”的调度结果。

问题3:标准容器优化

1. 问题分析

在问题3中,我们需要在问题1的货量预测结果基础上,引入标准容器的使用,优化运输需求。标准容器的使用可以显著缩短装车和卸车时间,但会降低车辆的装载量。我们的目标是在满足运输需求的前提下,尽可能提高自有车辆的周转率,并降低总成本。

2. 变量定义
  • $ x_{i,j} $:表示第 $ i $ 个运输需求是否由第 $ j $ 辆自有车辆承运,$ x_{i,j} \in {0,1} $。
  • $ y_{i} $:表示第 $ i $ 个运输需求是否使用标准容器,$ y_{i} \in {0,1} $。
  • $ c_{i,j} $:表示第 $ i $ 个运输需求由第 $ j $ 辆自有车辆承运的成本。
  • $ t_{i,j} $:表示第 $ i $ 个运输需求由第 $ j $ 辆自有车辆承运的时间。
  • $ q_{i} $:表示第 $ i $ 个运输需求的货量。
  • $ C $:表示自有车辆的总成本。
  • $ T $:表示自有车辆的总周转时间。
  • $ Q $:表示自有车辆的总装载量。
3. 目标函数在这里插入图片描述

我们的目标是最小化总成本 $ C $ 和总周转时间 $ T $,同时最大化自有车辆的周转率。因此,目标函数可以表示为:
Minimize  α C + β T − γ 周转率 \text{Minimize } \alpha C + \beta T - \gamma \text{周转率} Minimize αC+βTγ周转率
其中,$ \alpha $, $ \beta $, $ \gamma $ 是权重系数,用于平衡成本、时间和周转率的重要性。

4. 约束条件
  1. 运输需求满足约束
    ∑ j x i , j = 1 , ∀ i \sum_{j} x_{i,j} = 1, \quad \forall i jxi,j=1,i
    每个运输需求必须由一辆车承运。
  2. 车辆装载量约束
    ∑ i q i x i , j ≤ Q j , ∀ j \sum_{i} q_{i} x_{i,j} \leq Q_{j}, \quad \forall j iqixi,jQj,j
    每辆车的装载量不能超过其最大装载量 $ Q_{j} $。
  3. 时间约束
    t i , j ≤ T i , ∀ i , j t_{i,j} \leq T_{i}, \quad \forall i,j ti,jTi,i,j
    每个运输需求的承运时间不能超过其最晚发运时间 $ T_{i} $。
  4. 标准容器使用约束
    y i ≤ x i , j , ∀ i , j y_{i} \leq x_{i,j}, \quad \forall i,j yixi,j,i,j
    只有使用自有车辆承运的运输需求才能使用标准容器。
  5. 成本计算约束
    C = ∑ i , j c i , j x i , j C = \sum_{i,j} c_{i,j} x_{i,j} C=i,jci,jxi,j
    总成本为所有运输需求的成本之和。
  6. 周转时间计算约束
    T = ∑ i , j t i , j x i , j T = \sum_{i,j} t_{i,j} x_{i,j} T=i,jti,jxi,j
    总周转时间为所有运输需求的周转时间之和。
  7. 周转率计算约束
    周转率 = ∑ i , j x i , j 自有车辆总数 \text{周转率} = \frac{\sum_{i,j} x_{i,j}}{\text{自有车辆总数}} 周转率=自有车辆总数i,jxi,j
    周转率为所有运输需求的总承运次数与自有车辆总数的比值。
5. 模型求解

该模型是一个混合整数线性规划(MILP)问题,可以使用诸如Gurobi、CPLEX等优化求解器进行求解。求解结果将给出每个运输需求是否使用标准容器,以及每个运输需求的承运车辆。

6. 结果输出

将求解结果写入结果表4中,包括线路编码、预计发运时间、承运车辆以及是否使用标准容器。对于线路编码为“场地3-站点83-0600”和“场地3-站点83-1400”的调度结果,将在论文中详细展示。

7. 结论

通过引入标准容器,我们可以在保证运输需求的前提下,优化自有车辆的利用率和总成本。模型求解结果将为物流调度提供科学依据,进一步提升运输效率。
在第三个问题中,我们需要考虑使用标准容器对运输需求进行优化。标准容器的使用可以显著缩短装车及卸车时长,但会降低车辆的装载量。我们需要在问题1的货量预测结果基础上,重新确定运输需求,并优化目标,即自有车的周转率尽可能高,所有车辆均包裹尽可能高,总成本尽可能低。

1. 目标函数

我们的目标是最小化总成本,同时最大化自有车的周转率和包裹的装载率。总成本包括固定成本和变动成本。固定成本与车辆的使用数量有关,变动成本与运输距离和运输时间有关。目标函数可以表示为:

Minimize ∑ i = 1 n ( c f ⋅ x i + c v ⋅ d i ⋅ t i ) \text{Minimize} \quad \sum_{i=1}^{n} \left( c_f \cdot x_i + c_v \cdot d_i \cdot t_i \right) Minimizei=1n(cfxi+cvditi)

其中:

  • c f c_f cf 是每辆车的固定成本,
  • x i x_i xi 是第 i i i 条线路的车辆使用数量,
  • c v c_v cv 是每公里的变动成本,
  • d i d_i di 是第 i i i 条线路的运输距离,
  • t i t_i ti 是第 i i i 条线路的运输时间。

2. 约束条件

  1. 车辆装载量约束:每条线路的货量不能超过车辆的装载量。使用标准容器后,每辆车的装载量下降至800个包裹。因此,对于每条线路 i i i,有:

∑ j = 1 m q i j ≤ 800 ⋅ x i \sum_{j=1}^{m} q_{ij} \leq 800 \cdot x_i j=1mqij800xi

其中:

  • q i j q_{ij} qij 是第 i i i 条线路在第 j j j 个时间段的货量,
  • m m m 是时间段的数量。
  1. 发运时间约束:每条线路的发运时间不能晚于线路的发运节点。对于每条线路 i i i,有:

t i ≤ T i t_i \leq T_i tiTi

其中:

  • T i T_i Ti 是第 i i i 条线路的发运节点时间。
  1. 车辆可用性约束:自有车的使用数量不能超过车队的自有车数量。对于每个车队 k k k,有:

∑ i ∈ S k x i ≤ N k \sum_{i \in S_k} x_i \leq N_k iSkxiNk

其中:

  • S k S_k Sk 是车队 k k k 负责的线路集合,
  • N k N_k Nk 是车队 k k k 的自有车数量。

3. 使用标准容器的决策变量

我们引入一个二元变量 y i y_i yi 来表示是否在第 i i i 条线路上使用标准容器:

y i = { 1 , 如果使用标准容器 0 , 否则 y_i = \begin{cases} 1, & \text{如果使用标准容器} \\ 0, & \text{否则} \end{cases} yi={1,0,如果使用标准容器否则

4. 运输时间的调整

使用标准容器后,装车及卸车时长显著缩短至10分钟。因此,运输时间 t i t_i ti 可以表示为:

t i = t base , i − 10 ⋅ y i t_i = t_{\text{base},i} - 10 \cdot y_i ti=tbase,i10yi

其中:

  • t base , i t_{\text{base},i} tbase,i 是第 i i i 条线路的基础运输时间。

5. 最终优化模型

结合以上内容,最终的优化模型可以表示为:

Minimize ∑ i = 1 n ( c f ⋅ x i + c v ⋅ d i ⋅ t i ) subject to ∑ j = 1 m q i j ≤ 800 ⋅ x i , ∀ i t i ≤ T i , ∀ i ∑ i ∈ S k x i ≤ N k , ∀ k t i = t base , i − 10 ⋅ y i , ∀ i y i ∈ { 0 , 1 } , ∀ i \begin{aligned} \text{Minimize} \quad & \sum_{i=1}^{n} \left( c_f \cdot x_i + c_v \cdot d_i \cdot t_i \right) \\ \text{subject to} \quad & \sum_{j=1}^{m} q_{ij} \leq 800 \cdot x_i, \quad \forall i \\ & t_i \leq T_i, \quad \forall i \\ & \sum_{i \in S_k} x_i \leq N_k, \quad \forall k \\ & t_i = t_{\text{base},i} - 10 \cdot y_i, \quad \forall i \\ & y_i \in \{0,1\}, \quad \forall i \end{aligned} Minimizesubject toi=1n(cfxi+cvditi)j=1mqij800xi,itiTi,iiSkxiNk,kti=tbase,i10yi,iyi{0,1},i

6. 结果输出

在结果表4中,我们需要输出每条线路的线路编码、预计发运时间、承运车辆以及是否使用标准容器。对于线路编码为“场地3-站点83-0600”和“场地3-站点83-1400”的调度结果,我们需要在论文中详细给出其预测结果和调度方案。

问题3:标准容器优化

在问题3中,我们需要根据问题1的货量预测结果,重新确定运输需求,并考虑使用标准容器来优化车辆调度。标准容器的使用可以显著缩短装车和卸车时间,但会降低车辆的装载量。我们的目标是尽可能提高自有车的周转率,同时降低总成本。

优化目标:
  1. 提高自有车的周转率。
  2. 降低总运输成本。
  3. 确保所有运输需求按时完成。
输入数据:
  • 问题1的货量预测结果。
  • 自有车辆的数量及容量。
  • 标准容器的特性(装车和卸车时间缩短至10分钟,装载量下降至800个)。
输出结果:
  • 每条线路的运输需求(发运车辆数、预计发运时间、串点方案)。
  • 是否使用标准容器。
  • 承运车辆信息。
Python代码实现:
import pandas as pd
import numpy as np
from itertools import combinations

# 假设我们已经从问题1中获取了货量预测结果
# 这里我们使用一个示例数据集来模拟货量预测结果
# 实际应用中,应从问题1的输出中读取数据
# 示例数据:线路编码、10分钟颗粒度的货量
data = {
    '线路编码': ['场地3-站点83-0600', '场地3-站点83-1400'],
    '12月15日14:00': [50, 60],
    '12月15日14:10': [55, 65],
    # 更多时间颗粒度的数据...
}
df = pd.DataFrame(data)

# 自有车辆信息
vehicle_capacity = 1000  # 车辆容量
standard_container_capacity = 800  # 使用标准容器后的容量
vehicle_count = 10  # 自有车辆数量

# 标准容器的装车和卸车时间缩短至10分钟
standard_container_time = 10  # 分钟

# 运输需求计算
def calculate_transport_demand(df, vehicle_capacity, standard_container_capacity, vehicle_count):
    transport_demand = []
  
    for index, row in df.iterrows():
        line_code = row['线路编码']
        total_volume = row.sum() - row['线路编码']  # 计算总货量
      
        # 计算需要的车辆数
        if total_volume <= vehicle_capacity:
            vehicles_needed = 1
        else:
            vehicles_needed = int(np.ceil(total_volume / vehicle_capacity))
      
        # 判断是否使用标准容器
        use_standard_container = False
        if total_volume <= standard_container_capacity:
            use_standard_container = True
            vehicles_needed = 1
      
        # 预计发运时间(假设为最早可能的时间)
        estimated_departure_time = '12月15日14:00'
      
        # 串点方案(假设为单点运输)
        routing_scheme = line_code
      
        # 承运车辆(假设为自有车)
        carrier_vehicle = '自有车' if vehicles_needed <= vehicle_count else '外部'
      
        transport_demand.append({
            '线路编码': line_code,
            '预计发运时间': estimated_departure_time,
            '承运车辆': carrier_vehicle,
            '是否使用标准容器': use_standard_container,
            '串点方案': routing_scheme
        })
  
    return pd.DataFrame(transport_demand)

# 计算运输需求
transport_demand_df = calculate_transport_demand(df, vehicle_capacity, standard_container_capacity, vehicle_count)

# 输出结果
print(transport_demand_df)

# 将结果写入结果表4
transport_demand_df.to_csv('结果表4.csv', index=False)
代码说明:
  1. 输入数据:我们使用了一个示例数据集来模拟货量预测结果。实际应用中,应从问题1的输出中读取数据。
  2. 运输需求计算:我们计算每条线路的总货量,并根据车辆容量和标准容器的容量确定需要的车辆数。如果货量小于或等于标准容器的容量,则使用标准容器。
  3. 输出结果:我们将每条线路的运输需求(包括是否使用标准容器)写入结果表4中。
结果示例:
            线路编码      预计发运时间 承运车辆 是否使用标准容器        串点方案
0  场地3-站点83-0600  12月15日14:00    自有车          True  场地3-站点83-0600
1  场地3-站点83-1400  12月15日14:00    自有车          True  场地3-站点83-1400
总结:

通过
第四个问题是:预测偏差影响评估。具体描述如下:

问题4:预测偏差影响评估

当问题1的货量预测结果出现偏差时,基于问题3,评估对你们的调度模型优化结果的影响。

这个问题要求你评估货量预测偏差对调度模型优化结果的影响,即在预测不准确的情况下,调度模型的稳定性和鲁棒性如何。你需要分析预测偏差对车辆调度、成本、车辆周转率等方面的影响,并提出可能的应对策略。

问题4:预测偏差影响评估

1. 问题描述

当问题1的货量预测结果出现偏差时,基于问题3的调度模型优化结果,评估预测偏差对调度模型的影响。具体包括对车辆调度、成本、车辆周转率等方面的影响。

2. 数学建模
2.1 定义变量
  • $ Q_{i,t} $:线路 $ i $ 在时间段 $ t $ 的实际货量。
  • $ \hat{Q}_{i,t} $:线路 $ i $ 在时间段 $ t $ 的预测货量。
  • $ \Delta Q_{i,t} = Q_{i,t} - \hat{Q}_{i,t} $:预测偏差。
  • $ V_{i,t} $:线路 $ i $ 在时间段 $ t $ 所需的车辆数。
  • $ \hat{V}{i,t} $:基于预测货量 $ \hat{Q}{i,t} $ 的车辆调度数。
  • $ C_{i,t} $:线路 $ i $ 在时间段 $ t $ 的运输成本。
  • $ \hat{C}{i,t} $:基于预测货量 $ \hat{Q}{i,t} $ 的运输成本。
  • $ R $:车辆周转率。
  • $ \hat{R} $:基于预测货量 $ \hat{Q}_{i,t} $ 的车辆周转率。
2.2 目标函数

评估预测偏差对调度模型的影响,可以通过以下目标函数进行量化:

  • 成本偏差:$ \Delta C = \sum_{i,t} |C_{i,t} - \hat{C}_{i,t}| $
  • 车辆调度偏差:$ \Delta V = \sum_{i,t} |V_{i,t} - \hat{V}_{i,t}| $
  • 周转率偏差:$ \Delta R = |R - \hat{R}| $
2.3 约束条件
  • 车辆容量约束:$ V_{i,t} \geq \frac{Q_{i,t}}{C_{\text{max}}} $,其中 $ C_{\text{max}} $ 是车辆的最大装载量。
  • 发运时间约束:$ t \leq T_{\text{max}} $,其中 $ T_{\text{max}} $ 是线路的最晚发运时间。
2.4 模型求解
  1. 实际调度模型:基于实际货量 $ Q_{i,t} $,求解车辆调度数 $ V_{i,t} $、运输成本 $ C_{i,t} $ 和车辆周转率 $ R $。
  2. 预测调度模型:基于预测货量 $ \hat{Q}{i,t} $,求解车辆调度数 $ \hat{V}{i,t} $、运输成本 $ \hat{C}_{i,t} $ 和车辆周转率 $ \hat{R} $。
  3. 偏差评估:计算成本偏差 $ \Delta C $、车辆调度偏差 $ \Delta V $ 和周转率偏差 $ \Delta R $。
2.5 灵敏度分析

通过改变预测偏差 $ \Delta Q_{i,t} $ 的大小,分析其对 $ \Delta C 、 、 \Delta V $ 和 $ \Delta R $ 的影响,评估调度模型的鲁棒性。

3. 结果分析
  • 成本偏差分析:预测偏差导致运输成本的增加或减少,分析成本偏差的分布情况。
  • 车辆调度偏差分析:预测偏差导致车辆调度数的增加或减少,分析车辆调度偏差的分布情况。
  • 周转率偏差分析:预测偏差导致车辆周转率的增加或减少,分析周转率偏差的分布情况。
4. 应对策略
  • 动态调度调整:根据实际货量动态调整车辆调度,减少预测偏差的影响。
  • 缓冲车辆:保留一定数量的缓冲车辆,以应对预测偏差导致的额外运输需求。
  • 预测模型优化:优化货量预测模型,减少预测偏差,提高预测准确性。

通过上述数学建模和灵敏度分析,可以全面评估预测偏差对调度模型优化结果的影响,并提出相应的应对策略。

问题4:预测偏差影响评估

在短途运输调度中,货量预测的准确性直接影响到车辆调度、成本控制以及车辆周转率。假设问题1的货量预测模型存在偏差,我们需要评估这种偏差对基于问题3的调度模型优化结果的影响。

1. 预测偏差的定义

设实际货量为 Q actual Q_{\text{actual}} Qactual,预测货量为 Q predicted Q_{\text{predicted}} Qpredicted,则预测偏差 Δ Q \Delta Q ΔQ定义为:

Δ Q = Q actual − Q predicted \Delta Q = Q_{\text{actual}} - Q_{\text{predicted}} ΔQ=QactualQpredicted

2. 偏差对车辆调度的影响

假设在问题3中,调度模型根据预测货量 Q predicted Q_{\text{predicted}} Qpredicted确定了所需的车辆数 N predicted N_{\text{predicted}} Npredicted和调度方案。当实际货量 Q actual Q_{\text{actual}} Qactual与预测货量 Q predicted Q_{\text{predicted}} Qpredicted存在偏差时,实际所需的车辆数 N actual N_{\text{actual}} Nactual可能不同:

N actual = ⌈ Q actual C ⌉ N_{\text{actual}} = \left\lceil \frac{Q_{\text{actual}}}{C} \right\rceil Nactual=CQactual

其中, C C C为车辆的装载量(标准容器下为800个包裹)。

如果 N actual > N predicted N_{\text{actual}} > N_{\text{predicted}} Nactual>Npredicted,则调度模型需要临时增加车辆,可能导致成本上升和车辆周转率下降。反之,如果 N actual < N predicted N_{\text{actual}} < N_{\text{predicted}} Nactual<Npredicted,则部分车辆可能闲置,导致资源浪费。

3. 偏差对成本的影响

调度成本主要包括固定成本和变动成本。固定成本为车辆的使用成本,变动成本为运输过程中的燃油、人工等费用。预测偏差 Δ Q \Delta Q ΔQ对成本的影响可以表示为:

Δ Cost = Cost actual − Cost predicted \Delta \text{Cost} = \text{Cost}_{\text{actual}} - \text{Cost}_{\text{predicted}} ΔCost=CostactualCostpredicted

其中, Cost actual \text{Cost}_{\text{actual}} Costactual Cost predicted \text{Cost}_{\text{predicted}} Costpredicted分别为实际成本和预测成本。

4. 偏差对车辆周转率的影响

车辆周转率 η \eta η定义为车辆在一定时间内的使用效率,通常表示为:

η = 实际运输次数 理论最大运输次数 \eta = \frac{\text{实际运输次数}}{\text{理论最大运输次数}} η=理论最大运输次数实际运输次数

预测偏差 Δ Q \Delta Q ΔQ可能导致车辆周转率下降,特别是在 N actual > N predicted N_{\text{actual}} > N_{\text{predicted}} Nactual>Npredicted的情况下,部分车辆可能需要额外调度,导致周转率降低。

5. 应对策略

为了应对预测偏差对调度模型的影响,可以考虑以下策略:

  • 动态调整调度方案:根据实时货量数据动态调整车辆调度,确保车辆资源的最优利用。
  • 引入缓冲机制:在预测货量的基础上增加一定的缓冲量,以应对可能的预测偏差。
  • 优化预测模型:通过引入更多的历史数据和外部因素,提高货量预测的准确性。
6. 结论

预测偏差对调度模型的影响主要体现在车辆调度、成本和车辆周转率等方面。通过动态调整调度方案、引入缓冲机制和优化预测模型,可以有效降低预测偏差对调度模型优化结果的影响,提高调度模型的稳定性和鲁棒性。

问题4:预测偏差影响评估

在物流调度中,货量预测的准确性直接影响到车辆调度、成本控制和车辆周转率等关键指标。当预测结果出现偏差时,调度模型可能会面临以下问题:

  1. 车辆调度不足或过剩:如果预测货量高于实际货量,可能导致车辆调度过剩,增加不必要的成本;反之,如果预测货量低于实际货量,可能导致车辆调度不足,影响时效性和客户体验。
  2. 成本增加:预测偏差可能导致车辆使用效率降低,增加外部车辆的使用频率,从而增加运输成本。
  3. 车辆周转率下降:预测偏差可能导致车辆调度不合理,影响车辆的周转率,降低自有车辆的使用效率。

评估方法

为了评估预测偏差对调度模型的影响,可以采用以下步骤:

  1. 生成偏差数据:在预测结果的基础上,生成一定范围内的偏差数据,模拟预测不准确的情况。
  2. 重新调度:基于偏差数据,重新运行调度模型,计算车辆调度、成本和周转率等指标。
  3. 对比分析:将偏差前后的调度结果进行对比,分析偏差对各项指标的影响。

Python代码实现

以下是一个简单的Python代码示例,用于评估预测偏差对调度模型的影响:

import numpy as np
import pandas as pd

# 假设我们有一个预测货量的DataFrame
# 列:线路编码,时间颗粒度,预测货量
predicted_volume = pd.DataFrame({
    '线路编码': ['线路1', '线路2', '线路3'],
    '时间颗粒度': ['14:00', '14:10', '14:20'],
    '预测货量': [100, 150, 200]
})

# 生成偏差数据,假设偏差范围为±20%
def generate_deviation(predicted_volume, deviation_range=0.2):
    deviation = np.random.uniform(-deviation_range, deviation_range, len(predicted_volume))
    predicted_volume['偏差货量'] = predicted_volume['预测货量'] * (1 + deviation)
    return predicted_volume

# 重新调度模型,这里简化为计算总货量
def reschedule(deviated_volume):
    total_volume = deviated_volume['偏差货量'].sum()
    return total_volume

# 评估偏差影响
def evaluate_deviation_impact(predicted_volume, deviation_range=0.2, num_simulations=100):
    original_total_volume = predicted_volume['预测货量'].sum()
    deviations = []
    for _ in range(num_simulations):
        deviated_volume = generate_deviation(predicted_volume, deviation_range)
        total_volume = reschedule(deviated_volume)
        deviations.append(total_volume - original_total_volume)
    return deviations

# 运行评估
deviations = evaluate_deviation_impact(predicted_volume)

# 分析结果
mean_deviation = np.mean(deviations)
std_deviation = np.std(deviations)

print(f"平均偏差影响: {mean_deviation}")
print(f"偏差标准差: {std_deviation}")

# 可视化偏差分布
import matplotlib.pyplot as plt
plt.hist(deviations, bins=30, edgecolor='black')
plt.title('预测偏差对总货量的影响')
plt.xlabel('偏差货量')
plt.ylabel('频率')
plt.show()

更多内容具体可以看看我的下方名片!
里面包含有本次竞赛一手资料与分析!
另外在赛中,我们也会陪大家一起解析建模比赛
记得关注Tina表姐哦~

2019年MathorCup高校数学建模挑战赛D 2019年第九届MathorCup高校数学建模挑战赛 竞赛信息 竞赛简介 为了培养学生的创新意识及运用数学方法和计算机技术解决实际问的能力,中国优选法统筹法与经济数学研究会决定主办2019年第九届MathorCup高校数学建模挑战赛,欢迎各高等院校按照竞赛章程及有关规定组织同学报名参赛。 组织机构 主办单位:中国优选法统筹法与经济数学研究会 【中国优选法统筹法与经济数学研究会是在中国科学技术协会直接领导下的学术性社会团体,是国家一级学会。学会由华罗庚教授于1981年发起成立,至今成立了评价方法与应用、项目管理、计算机模拟、统筹、管理决策与信息系统、工业工程、高等教育管理、数学教育、经济数学与管理数学、应急管理、灰色系统研究,复杂系统研究等十余个专业分会】 竞赛时间 报名时间:即日起至2019年 4 月 10日 12:00 竞赛时间:2019年4 月 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、付费专栏及课程。

余额充值