2024“华为杯”中国研究生数学建模竞赛(E题)深度剖析_数学建模完整过程+详细思路+代码全解析
问题1详细解答过程
(1) 交通流参数统计
数据预处理
-
数据读取:
从四个视频观测点提取交通流数据,包括每个时间段内的车流量、车速和车道占用率等。
交通流参数计算
3. 计算流量 (Q):
Q ( t ) = N ( t ) Δ t Q(t) = \frac{N(t)}{\Delta t} Q(t)=ΔtN(t)
其中 N ( t ) N(t) N(t) 是在时间段 Δ t \Delta t Δt 内通过某个观测点的车辆数。
-
计算密度 (K):
K ( t ) = N ( t ) L K(t) = \frac{N(t)}{L} K(t)=LN(t)
其中 L L L 是路段的长度(例如5000m)。
-
计算速度 (V):
V ( t ) = Q ( t ) K ( t ) V(t) = \frac{Q(t)}{K(t)} V(t)=K(t)Q(t)
-
时间序列分析:
- 利用统计方法对流量、密度和速度进行时间序列分析。可以绘制流量、密度和速度随时间变化的曲线图。
- 识别趋势、季节性、周期性和异常值。
(2) 拥堵模型建立
模型假设
- 流量和密度关系:
假设车辆流量与密度之间的关系遵循某种线性或非线性模型。例如,使用基本的交通流模型:
Q = K ⋅ V Q = K \cdot V Q=K⋅V
其中 Q Q Q 是流量, K K K 是密度, V V V 是速度。
- 拥堵阈值:
- 设定一个密度阈值 K t h r e s h o l d K_{threshold} Kthreshold,当密度超过该值时,即认为可能发生拥堵。
- 可设定 K t h r e s h o l d = 0.8 ⋅ K m a x K_{threshold} = 0.8 \cdot K_{max} Kthreshold=0.8⋅Kmax,其中 K m a x K_{max} Kmax 为饱和密度。
实时预警机制
3. 滑动窗口法:
- 设定一个时窗(例如30分钟),在每个时间点 t t t 监测从第三点到第四点的交通流参数。
- 预警机制:
当监测到密度 K ( t ) K(t) K(t) 超过 K t h r e s h o l d K_{threshold} Kthreshold,且这种状态持续超过10分钟,则系统发出预警。
If K ( t ) > K t h r e s h o l d for t > t 0 + 10 minutes, then alert. \text{If } K(t) > K_{threshold} \text{ for } t > t_0 + 10 \text{ minutes, then alert.} If K(t)>Kthreshold for t>t0+10 minutes, then alert.
M/G/1 排队理论应用
5. 模型构建:
- 假设车辆到达过程遵循泊松过程,服务时间服从任意分布,建立M/G/1排队模型。
- 到达率( λ \lambda λ)和服务率($\mu\))的定义:
λ = Q ( t ) L \lambda = \frac{Q(t)}{L} λ=LQ(t)
μ = 1 E [ S ] \mu = \frac{1}{E[S]} μ=E[S]1
其中 E [ S ] E[S] E[S] 为车辆通过某路段的平均服务时间。
-
拥堵概率计算:
- 使用M/G/1排队理论,计算系统的稳态性能指标,如平均排队长度 L q L_q Lq 和平均等待时间 W q W_q Wq:
L q = λ 2 ⋅ E [ S 2 ] 2 ( 1 − ρ ) L_q = \frac{\lambda^2 \cdot E[S^2]}{2(1 - \rho)} Lq=2(1−ρ)λ2⋅E[S2]
W q = L q λ W_q = \frac{L_q}{\lambda} Wq=λLq
其中 ρ = λ μ \rho = \frac{\lambda}{\mu} ρ=μλ 为系统利用率。
(3) 模型有效性验证
-
数据对比:
- 将模型的预警时间点与实际交通数据对比,记录预警的准确性。
- 统计误报率(False Positive Rate)和漏报率(False Negative Rate)。
-
指标评估:
- 使用准确率(Precision)、召回率(Recall)和F1分数进行模型性能评估。
- 设定预警模型的有效性标准。
python代码实现
import cv2
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import poisson
# 读取视频数据并计算交通流参数
def read_video_data(video_file):
cap = cv2.VideoCapture(video_file)
vehicle_count = []
frame_count = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
frame_count += 1
# 假设每帧处理逻辑已经实现,车辆计数放入vehicle_count中
# vehicle_count.append(process_frame(frame)) # 需要实现process_frame方法
cap.release()
return vehicle_count
# 计算流量、密度和速度
def calculate_traffic_parameters(vehicle_counts, road_length, delta_t):
flow = [count / delta_t for count in vehicle_counts]
density = [count / road_length for count in vehicle_counts]
speed = [flow[i] / density[i] if density[i] > 0 else 0 for i in range(len(flow))]
return flow, density, speed
# 拥堵预警模型
def congestion_warning(density, threshold, duration):
alert_times = []
for i in range(len(density)):
if density[i] > threshold:
if all(density[j] > threshold for j in range(i, min(i + duration, len(density)))):
alert_times.append(i)
return alert_times
# M/G/1排队模型计算
def mg1_queue_model(arrival_rate, service_rate):
rho = arrival_rate / service_rate
Lq = (arrival_rate**2) / (2 * service_rate * (1 - rho))
Wq = Lq / arrival_rate
return Lq, Wq
# 主函数
def main(video_files, road_length, delta_t, congestion_threshold, warning_duration):
all_vehicle_counts = []
for video_file in video_files:
vehicle_counts = read_video_data(video_file)
all_vehicle_counts.append(vehicle_counts)
flow, density, speed = zip(*[calculate_traffic_parameters(counts, road_length, delta_t) for counts in all_vehicle_counts])
for d in density:
alerts = congestion_warning(d, congestion_threshold, warning_duration)
print(f"Alerts for density: {alerts}")
# 示例参数
arrival_rate = np.mean(flow)
service_rate = 1.0 # 假设的服务率
Lq, Wq = mg1_queue_model(arrival_rate, service_rate)
print(f"Average queue length (Lq): {Lq}, Average waiting time (Wq): {Wq}")
# 绘制流量、密度和速度变化图
plt.figure(figsize=(15, 5))
plt.subplot(1, 3, 1)
plt.plot(flow)
plt.title('Traffic Flow')
plt.subplot(1, 3, 2)
plt.plot(density)
plt.title('Traffic Density')
plt.subplot(1, 3, 3)
plt.plot(speed)
plt.title('Traffic Speed')
plt.tight_layout()
plt.show()
# 设置参数并运行主函数
if __name__ == "__main__":
video_files = ["video1.mp4", "video2.mp4", "video3.mp4", "video4.mp4"]
road_length = 5000 # 路段长度
delta_t = 1 # 时间间隔
congestion_threshold = 0.8 # 拥堵阈值
warning_duration = 10 # 持续时间
main(video_files, road_length, delta_t, congestion_threshold, warning_duration)
问题2详细解答过程
1. 模型构建
目标
- 建立一个模型,为高速公路应急车道的临时启用提供决策支持,以最小化交通拥堵的影响,优化通行效率。
决策变量
-
设定决策变量 x x x,表示是否启用应急车道:
x = { 1 启用应急车道 0 不启用应急车道 x = \begin{cases} 1 & \text{启用应急车道} \\ 0 & \text{不启用应急车道} \end{cases} x={10启用应急车道不启用应急车道
参数定义
- Q ( t ) Q(t) Q(t):在时间 t t t 的流量(单位:辆/分钟)。
- K ( t ) K(t) K(t):在时间 t t t 的密度(单位:辆/km)。
- V ( t ) V(t) V(t):在时间 t t t 的速度(单位:km/h)。
- C C C:道路的通行能力(单位:辆/分钟)。
- T a v g T_{avg} Tavg:车辆的平均通过时间(单位:分钟)。
- T d e l a y T_{delay} Tdelay:车辆因拥堵造成的平均延迟时间(单位:分钟)。
2. 目标函数
最小化延迟
- 目标是最小化总的延迟时间:
Minimize T t o t a l = ∑ i T d e l a y i ⋅ N i \text{Minimize } T_{total} = \sum_{i} T_{delay}^i \cdot N_i Minimize Ttotal=∑iTdelayi⋅Ni
其中 N i N_i Ni 为在第 i i i 个时间段内受到拥堵影响的车辆数。
3. 约束条件
流量与密度约束
- 应急车道启用的情况下,流量与密度之间的关系可以表示为:
Q ( t ) = K ( t ) ⋅ V ( t ) Q(t) = K(t) \cdot V(t) Q(t)=K(t)⋅V(t)
通行能力约束
- 道路通行能力限制:
Q ( t ) ≤ C Q(t) \leq C Q(t)≤C
当 K ( t ) K(t) K(t) 超过某个阈值(如 K t h r e s h o l d K_{threshold} Kthreshold)时,考虑启用应急车道。
延迟计算
- 在不启用应急车道的情况下,延迟时间可以通过流量和通行能力的关系得到:
T d e l a y = max ( 0 , K ( t ) C − 1 ) ⋅ T a v g T_{delay} = \max\left(0, \frac{K(t)}{C} - 1\right) \cdot T_{avg} Tdelay=max(0,CK(t)−1)⋅Tavg
应急车道启用条件
- 设定条件,当流量接近通行能力时,启用应急车道的决策变量可以表示为:
x = { 1 if Q ( t ) ≥ α C 0 otherwise x = \begin{cases} 1 & \text{if } Q(t) \geq \alpha C \\ 0 & \text{otherwise} \end{cases} x={10if Q(t)≥αCotherwise
其中 α \alpha α 为阈值系数(例如 0.8)。
4. 决策支持系统
模型实施
-
结合实时监测的数据(流量、密度、速度),使用线性规划或整数规划技术求解:
Find x ∗ = arg min T t o t a l \text{Find } x^* = \arg\min T_{total} Find x∗=argminTtotal
反馈机制
- 启用应急车道后,实时监测新流量 Q n e w ( t ) Q_{new}(t) Qnew(t) 和密度 K n e w ( t ) K_{new}(t) Knew(t),更新延迟时间 T d e l a y T_{delay} Tdelay,根据情况调整决策变量 x x x。
5. 模型有效性评估
效果评估指标
- 通过对比启用应急车道前后的平均延迟时间、交通流量变化等指标,评估模型的有效性:
Efficiency Gain = T d e l a y , b e f o r e − T d e l a y , a f t e r T d e l a y , b e f o r e \text{Efficiency Gain} = \frac{T_{delay, before} - T_{delay, after}}{T_{delay, before}} Efficiency Gain=Tdelay,beforeTdelay,before−Tdelay,after
统计分析
- 收集数据,计算各项指标的均值、方差和变化趋势,分析应急车道启用对缓解交通拥堵的作用。
python代码实现
import numpy as np
import pandas as pd
from scipy.optimize import linprog
import matplotlib.pyplot as plt
# 假设数据
def generate_traffic_data(num_time_slots):
np.random.seed(0)
flow = np.random.randint(50, 150, size=num_time_slots)
density = np.random.uniform(0.1, 0.7, size=num_time_slots)
return flow, density
# 参数设置
road_length = 5000 # 路段长度(米)
delta_t = 1 # 时间间隔(分钟)
capacity = 100 # 道路通行能力(辆/分钟)
alpha = 0.8 # 启用应急车道的阈值系数
avg_delay_time = 5 # 平均通过时间(分钟)
# 延迟计算
def calculate_delay(flow):
delay = np.maximum(0, (flow / capacity - 1) * avg_delay_time)
return delay
# 优化模型
def emergency_lane_decision(flow, density):
num_time_slots = len(flow)
total_delay = calculate_delay(flow)
c = total_delay
A_ub = np.zeros((num_time_slots, num_time_slots))
b_ub = np.zeros(num_time_slots)
for i in range(num_time_slots):
A_ub[i, i] = 1
if flow[i] >= alpha * capacity:
b_ub[i] = 1 # 启用应急车道的约束条件
bounds = [(0, 1) for _ in range(num_time_slots)]
result = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs')
return result
# 主函数
def main():
num_time_slots = 60 # 假设有60个时间段
flow, density = generate_traffic_data(num_time_slots)
result = emergency_lane_decision(flow, density)
print("Optimization Result:")
if result.success:
print("Optimal Decision Variables (x):")
print(result.x)
print("Total Delay Reduction:", sum(result.x * calculate_delay(flow)))
else:
print("Optimization failed.")
# 可视化
plt.figure(figsize=(12, 6))
plt.plot(flow, label='Traffic Flow', color='blue')
plt.plot(density * capacity, label='Density Capacity', color='orange', linestyle='--')
plt.axhline(y=alpha * capacity, color='red', linestyle='--', label='Emergency Lane Threshold')
plt.title('Traffic Flow and Density')
plt.xlabel('Time Slots')
plt.ylabel('Vehicles')
plt.legend()
plt.show()
if __name__ == "__main__":
main()
问题3详细解答过程
1. 模型构建
目标
- 设计一个实时决策模型,根据交通流监测数据自动判断是否需要启用应急车道,以最小化交通拥堵和延迟。
决策变量
-
设定决策变量 x x x,表示是否启用应急车道:
x = { 1 启用应急车道 0 不启用应急车道 x = \begin{cases} 1 & \text{启用应急车道} \\ 0 & \text{不启用应急车道} \end{cases} x={10启用应急车道不启用应急车道
输入参数
- Q ( t ) Q(t) Q(t):在时间 t t t 的流量(单位:辆/分钟)。
- K ( t ) K(t) K(t):在时间 t t t 的密度(单位:辆/km)。
- V ( t ) V(t) V(t):在时间 t t t 的速度(单位:km/h)。
- C C C:道路的通行能力(单位:辆/分钟)。
- T a v g T_{avg} Tavg:车辆的平均通过时间(单位:分钟)。
- T d e l a y T_{delay} Tdelay:车辆因拥堵造成的平均延迟时间(单位:分钟)。
- θ \theta θ:拥堵阈值,决定何时启用应急车道(例如,密度超过 K t h r e s h o l d K_{threshold} Kthreshold)。
2. 目标函数
延迟最小化
-
目标是最小化整体交通延迟:
Minimize T t o t a l = ∑ i T d e l a y i ⋅ N i \text{Minimize } T_{total} = \sum_{i} T_{delay}^i \cdot N_i Minimize Ttotal=∑iTdelayi⋅Ni
其中 N i N_i Ni 是在第 i i i 个时间段内受到拥堵影响的车辆数。
3. 约束条件
流量与密度约束
-
在启用应急车道时,流量与密度之间的关系可以表示为:
Q ( t ) = K ( t ) ⋅ V ( t ) Q(t) = K(t) \cdot V(t) Q(t)=K(t)⋅V(t)
通行能力约束
-
道路通行能力限制:
Q ( t ) ≤ C Q(t) \leq C Q(t)≤C
当 K ( t ) K(t) K(t) 超过阈值时,考虑启用应急车道。
延迟计算
-
在不启用应急车道的情况下,延迟时间可以通过流量和通行能力的关系得到:
T d e l a y = max ( 0 , K ( t ) C − 1 ) ⋅ T a v g T_{delay} = \max\left(0, \frac{K(t)}{C} - 1\right) \cdot T_{avg} Tdelay=max(0,CK(t)−1)⋅Tavg
4. 决策规则
实时决策规则
- 设定规则:
- 监测数据更新:实时获取流量 Q ( t ) Q(t) Q(t)、密度 K ( t ) K(t) K(t) 和速度 V ( t ) V(t) V(t) 的数据。
- 判断条件:若 K ( t ) > K t h r e s h o l d K(t) > K_{threshold} K(t)>Kthreshold,并且 Q ( t ) ≥ θ C Q(t) \geq \theta C Q(t)≥θC,则启用应急车道 x = 1 x = 1 x=1。
- 延迟监测:在启用应急车道后,持续监测交通流的延迟情况。
5. 模型实施与反馈
动态调整
- 在应急车道启用后,实时更新流量、密度和延迟数据,依据新数据动态调整决策变量 x x x。
模型验证
-
通过历史数据和模拟结果验证模型的有效性。对比启用应急车道前后的延迟、流量和密度,评估决策的合理性:
Efficiency Gain = T d e l a y , b e f o r e − T d e l a y , a f t e r T d e l a y , b e f o r e \text{Efficiency Gain} = \frac{T_{delay, before} - T_{delay, after}}{T_{delay, before}} Efficiency Gain=Tdelay,beforeTdelay,before−Tdelay,after
python代码实现
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 假设数据生成函数
def generate_traffic_data(num_time_slots):
np.random.seed(0)
flow = np.random.randint(50, 150, size=num_time_slots)
density = np.random.uniform(0.1, 0.7, size=num_time_slots)
return flow, density
# 参数设置
road_length = 5000
capacity = 100
avg_delay_time = 5
K_threshold = 0.5
theta = 0.8
# 延迟计算
def calculate_delay(flow):
delay = np.maximum(0, (flow / capacity - 1) * avg_delay_time)
return delay
# 决策函数
def emergency_lane_decision(flow, density):
num_time_slots = len(flow)
decisions = np.zeros(num_time_slots)
for t in range(num_time_slots):
if density[t] > K_threshold and flow[t] >= theta * capacity:
decisions[t] = 1
return decisions
# 主函数
def main():
num_time_slots = 60
flow, density = generate_traffic_data(num_time_slots)
decisions = emergency_lane_decision(flow, density)
delays = calculate_delay(flow)
print("Flow Data:", flow)
print("Density Data:", density)
print("Decisions (1:启用应急车道, 0:不启用):", decisions)
print("Delays:", delays)
plt.figure(figsize=(12, 6))
plt.plot(flow, label='Traffic Flow', color='blue')
plt.plot(density * capacity, label='Density Capacity', color='orange', linestyle='--')
plt.axhline(y=K_threshold * capacity, color='red', linestyle='--', label='Density Threshold')
plt.title('Traffic Flow and Density with Emergency Lane Decisions')
plt.xlabel('Time Slots')
plt.ylabel('Vehicles')
plt.legend()
plt.show()
if __name__ == "__main__":
main()