2024“华为杯”中国研究生数学建模竞赛(E题)深度剖析_数学建模完整过程+详细思路+代码全解析

问题1详细解答过程

(1) 交通流参数统计

数据预处理

  1. 数据读取

    从四个视频观测点提取交通流数据,包括每个时间段内的车流量、车速和车道占用率等。

交通流参数计算

  1. 计算流量 (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 内通过某个观测点的车辆数。

  1. 计算密度 (K)

    K ( t ) = N ( t ) L K(t) = \frac{N(t)}{L} K(t)=LN(t)

    其中 L L L 是路段的长度(例如5000m)。

  2. 计算速度 (V)

    V ( t ) = Q ( t ) K ( t ) V(t) = \frac{Q(t)}{K(t)} V(t)=K(t)Q(t)

  3. 时间序列分析

    • 利用统计方法对流量、密度和速度进行时间序列分析。可以绘制流量、密度和速度随时间变化的曲线图。
    • 识别趋势、季节性、周期性和异常值。
(2) 拥堵模型建立

模型假设

  1. 流量和密度关系

假设车辆流量与密度之间的关系遵循某种线性或非线性模型。例如,使用基本的交通流模型:

Q = K ⋅ V Q = K \cdot V Q=K⋅V

其中 Q Q Q 是流量, K K K 是密度, V V V 是速度。

  1. 拥堵阈值
    • 设定一个密度阈值 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 为饱和密度。

实时预警机制

  1. 滑动窗口法
  • 设定一个时窗(例如30分钟),在每个时间点 t t t 监测从第三点到第四点的交通流参数。
  1. 预警机制

当监测到密度 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 排队理论应用

  1. 模型构建
  • 假设车辆到达过程遵循泊松过程,服务时间服从任意分布,建立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] 为车辆通过某路段的平均服务时间。

  1. 拥堵概率计算

    • 使用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) 模型有效性验证
  1. 数据对比

    • 将模型的预警时间点与实际交通数据对比,记录预警的准确性。
    • 统计误报率(False Positive Rate)和漏报率(False Negative Rate)。
  2. 指标评估

    • 使用准确率(Precision)、召回率(Recall)和F1分数进行模型性能评估。
    • 设定预警模型的有效性标准。
python代码实现
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代码实现
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. 决策规则

实时决策规则

  • 设定规则:
  1. 监测数据更新 :实时获取流量 Q ( t ) Q(t) Q(t)、密度 K ( t ) K(t) K(t) 和速度 V ( t ) V(t) V(t) 的数据。
  2. 判断条件 :若 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。
  3. 延迟监测:在启用应急车道后,持续监测交通流的延迟情况。
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代码实现
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()
相关推荐
2401_8827275725 分钟前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架
Swift社区26 分钟前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman1 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
一念之坤1 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
IT 青年1 小时前
数据结构 (1)基本概念和术语
数据结构·算法
wxl7812272 小时前
如何使用本地大模型做数据分析
python·数据挖掘·数据分析·代码解释器
NoneCoder2 小时前
Python入门(12)--数据处理
开发语言·python
Dong雨2 小时前
力扣hot100-->栈/单调栈
算法·leetcode·职场和发展
SoraLuna2 小时前
「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解
开发语言·算法·macos·cangjie
liujjjiyun2 小时前
小R的随机播放顺序
数据结构·c++·算法