2025年五一数学建模竞赛A题-支路车流量推测问题详细建模与源代码编写(一)
题目背景:
在道路网络中,主路通常配备车流量监测设备,能够实时记录主路的车流量数据。当多条支路汇入主路时,由于部分支路未安装车流量监测设备,各支路的车流量需要结合主路的车流量数据和支路车流量的历史趋势信息进行推测。这将为优化交通信号灯的配时、缓解交通拥堵和规划道路资源等问题提供数据和方法支持。
本题目中假设:(1)主路上的车流量是各支路车流量的总和,且各支路的车流量具有一定的规律性(如早晚高峰、平峰时段的车流量分布不同),这种规律性可以用函数来描述;(2)道路均为单向车道,图1-图3中的蓝色箭头代表车流方向;(3)问题1-问题4中车流量的“增长/减少”趋势均指“严格单调增长/严格单调减少”趋势,“稳定”指车流量稳定为某固定非负常数,各支路流量变化的函数关系均为连续函数;(4)车流量记录数据已换算为标准车当量数,各问题中的车流量均指标准车当量数,可为任意非负实数,不考虑车流量单位。
问题1
问题1. 考虑图1所示的Y型道路,支路1和支路2的车流同时汇入主路3。假设仅在主路3上安装了车流量监测设备A1,每2分钟记录一次主路的车流量信息,车辆从支路汇入主路后行驶到A1处的时间忽略不计。附件表1中提供了某天早上[6:58,8:58]主路3上的车流量数据(7:00为第一个数据记录时刻,8:58是最后一个数据记录时刻,下同)。
由历史车流量观测记录可知,在[6:58,8:58]时间段内,支路1的车流量呈现线性增长趋势,支路2的车流量呈现先线性增长后线性减少的趋势。
请建立数学模型,根据附件表1的数据推测在[6:58,8:58]时间段内支路1和支路2上的车流量,并使用合适的函数关系来描述支路1、支路2的车流量随时间t的变化(为方便起见,函数关系中令7:00为 t=0, t∈[0,59],下同),在表1.1中填入具体的函数表达式。表1.1 问题1支路车流量函数表达式:
表1.1 问题1支路车流量函数表达式
支路1 | 支路2 |
---|---|
问题1简要分析与建模思路
问题本质:
在主路3有车流量监测点A1,每2分钟有一次主路流量数据(已换算为标准车当量数)。支路1流量是线性增长,支路2流量是先线性增长后线性减少。
要求:根据主路数据,反推支路1和支路2各自的车流量,并给出明确的函数表达式(7:00为t=0,t单位为分钟,t∈[0,59])。
问题1详解
模型假设
- 各支路车流量变化为连续函数;
- 支路1车流量呈线性增长,支路2车流量先线性增长后线性减少;
- 主路流量为两支路流量之和;
- 忽略车辆到达A1的时间延迟。
变量与模型建立
- 设 t 为时间(以7:00为t=0,t单位:分钟,t∈[0,59])
- 设主路3流量为Q_3(t),支路1流量为 Q_1(t),支路2流量为Q_2(t)
- 模型为:
其中分段点 t=31 为拐点。
参数拟合与函数表达式
用最小二乘法拟合数据,得到:
支路1 | 支路2 |
---|---|
Q1(t)=28.49t+9.03 | Q2(t)={−27.03t−1.54,−29.04t+60.56,0≤t≤31,31<t≤59} |
表1.1 问题1支路车流量函数表达式
完整Python拟合代码
- 数据读取
- 参数拟合
- 生成支路1和支路2的流量函数
- 结果表格输出
- 曲线绘图
import pandas as pd
import numpy as np
from scipy.optimize import least_squares
import matplotlib.pyplot as plt# 读取数据
df = pd.read_excel('content_1747881767308.xlsx')
t = df['时间 t (Time t)'].values
q3 = df['主路3的车流量 (Traffic flow on the Main road 3)'].values# 分段点
t0 = 31# 残差函数
def residuals(params):a1, b1, a2, b2, c2, d2 = paramsq1 = a1 * t + b1q2 = np.where(t <= t0,a2 * t + b2,c2 * t + d2)# 分段点连续约束continuity_penalty = 1000 * (a2 * t0 + b2 - c2 * t0 - d2)return np.concatenate([(q1 + q2 - q3), [continuity_penalty]])# 初始值
initial_params = [0.1, 5, 0.1, 5, -0.1, 50]# 最小二乘拟合
result = least_squares(residuals, initial_params)
a1, b1, a2, b2, c2, d2 = result.x# 输出参数
print(f"支路1: Q1(t) = {a1:.2f} t + {b1:.2f}")
print(f"支路2: Q2(t) = 分段, 前段: {a2:.2f} t + {b2:.2f},后段: {c2:.2f} t + {d2:.2f}")# 生成全时段流量
Q1 = a1 * t + b1
Q2 = np.where(t <= t0, a2 * t + b2, c2 * t + d2)# 表格输出
table = pd.DataFrame({'时间t': t, '支路1车流量Q1': Q1, '支路2车流量Q2': Q2, '主路3流量Q3': q3})
table.to_excel('result_branches.xlsx', index=False)# 画图
plt.figure(figsize=(10,6))
plt.plot(t, Q1, label='支路1 Q1(t)', color='blue', linewidth=2)
plt.plot(t, Q2, label='支路2 Q2(t)', color='green', linewidth=2)
plt.plot(t, q3, label='主路3实际Q3(t)', color='orange', linestyle='--', linewidth=2)
plt.axvline(x=t0, color='red', linestyle=':', label='支路2分段点 t=31')
plt.xlabel('时间 t (分钟)')
plt.ylabel('流量(标准车当量数)')
plt.legend()
plt.title('支路1、支路2及主路3车流量随时间变化曲线')
plt.grid(True)
plt.tight_layout()
plt.show()
拟合参数结果、分段点可直接打印出来。
生成的result_branches.xlsx
表格,可用于论文/建模附件提交。
下图即为代码运行后的曲线示意(你可用上面代码复现):
- 蓝色线:支路1流量
- 绿色线:支路2流量(分段变化)
- 橙色虚线:主路3观测流量
- 红色虚线:分段点 t=31