2024年国赛高教杯数学建模E题交通流量管控解题全过程文档及程序

发布于:2025-03-20 ⋅ 阅读:(19) ⋅ 点赞:(0)

2024年国赛高教杯数学建模

E题 交通流量管控解题

原题再现

  随着城市化进程的加快、机动车的快速普及,以及人们活动范围的不断扩大,城市道路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。
  考虑一个拥有知名景区的小镇。景区周边道路上既有本地居民出行,也有过境车辆,还有大量前来景区游览的游客车辆,后者常常会因寻找停车位而在周边道路上来回低速绕圈,影响了道路的通行效率。
  图1是小镇中两条主路的情况:纬中路,从环西路到环东路,约3.5公里;经中路,从环北路到环南路,约1.8公里。两条路上共有12个交叉口,监控设备可以记录每个交叉口四个方向的车流数据。以经中路-纬中路交叉口为例,有经中路北往南(north-south)、经中路南往北(south-north)、纬中路东往西(east-west)、纬中路西往东(west-east)四个相位通过的每辆车的信息,包括拍摄地点、行驶方向、拍摄时间和车牌号。
在这里插入图片描述
  附件2记录了2024年4月1日到5月6日这两条主路上有监控设备的地方出现过的所有车辆信息。监控设备安装在停车线后方,因此并不知道车辆通过停车线后是左转、直行还是右转。
  由于沿途有住宅小区、酒店和写字楼等建筑物,车辆可以驶入这些建筑物的停车场或者从停车场驶出,所以可能造成这两条主路上的车辆会突然出现或者突然消失。 请结合实际,探讨以下几个问题:
  问题1 对经中路-纬中路交叉口,根据车流量的差异,可将一天分成若干个时段,估计不同时段各个相位(包括四个方向直行、转弯)车流量。
  问题2 根据所给数据和上述模型,对经中路和纬中路上所有交叉口的信号灯进行优化配置,在保证车辆通行的前提下,使得两条主路上的车流平均速度最大。
  问题3 对五一黄金周期间的数据进行分析,判定寻找停车位的巡游车辆,并估算假期景区需要临时征用多少停车位才能满足需求?
  问题4 五一黄金周期间,该小镇对景区周边道路实行了临时性交通管理措施,具体管控措施见附件3。请结合数据评价临时管控措施在两条主路上的效果。
  附件1 路段行驶方向编号及交叉口之间的距离
  附件2 纬中路各交叉口车辆信息
  附件3 五一黄金周期间交通管控措施

整体求解过程概述(摘要)

  交通拥堵问题已经日益严重,特别在旅游景区周围更加严重。基于该区域交通流量数据,分析该镇主要道路的交通现状,交通优化方案已经成为相关部门的急需。
  针对问题一,通过对交通监控数据的聚合处理,统计了经中路-纬中路交叉口不同时间的总车流量。利用 K-Means 聚类算法分析总车流量变化趋势,依据肘部法得出聚类数为3,将时段划分为高峰、中峰和低峰三类。用粒子群优化(PSO)算法分配每个时段的车流方向比例,依据比例算出各方向(直行、左转、右转)的车流量,多次迭代粒子群优化算法,最终得出期每个时段内各个方向的平均车流量(辆/时),低峰时段所有数据的最高值 30.65,最低值 9.99,均值 20.34;中峰时段所有数据的最高值 46.25,最低值 14.79,均值 32.45;高峰时段所有数据的最高值 371.17,最低值 117.20,均值 269.08。
  针对问题二,为了优化经中路和纬中路交叉口的信号灯配置,使两条主路的车流速度最大化,本文构建了基于马尔可夫决策过程(MDP)的量化交通状态和信号灯的配时策略模型,采用深度Q学习(DQN)算法来优化每个时段的信号灯绿灯持续时间。模型通过奖励函数衡量交通流的通行效率,并以最大化平均车速为优化目标。在多次训练和迭代中,模型得到了最佳的信号灯配时方案,在信号灯周期固定为120秒的前提下,分别为四个方向分配相位时间,并计算了不同方向的平均等待时间。结果表明,方向1和方向4的相位时间在高峰时段内获得了更多的分配,达到了 34.38 秒,等待时间相应从 45.83 秒缩短至 42.80 秒,有效提高了高峰期的通行效率。
  针对五一黄金周景区停车位不足问题,查询文献建立以低车速、短时间重复出现为准则的寻找停车位的巡游车辆判定模型,标记出巡游的车辆。依据标记的车辆信息,结合泊松分布模型,估算巡游车辆的停车需求,查阅发改委文件显示泊位对应出行停车需求为 0.2 个,以泊松分布的 95%置信区间,算出要临时增加的停车位数量为 1287 个。车位增加后可减少道路车流 28%。
  针对问题四,需评估五一黄金周景区周边实行交通管理措施效果。分析车流量、等待时间和车速关键指标,采用对比管控前后各交叉口的交通方式。车流量管控后 5 个交叉口的车流量显著下降,在高峰时段环东路-纬中路的车流量减少了 95.91%,表明管控措施拥堵压力效果显著减小。等待时间显示 4 个交叉口的等待时间大幅缩短,以环东路-纬中路路口为例,管控前后的平均等待时间从 7 分 37 秒降至 2 分 43 秒,等待时间缩短了 64.18%,有效提高了车辆通行效率。整体来看,五一黄金周的临时管控措施在缓解主要道路交通压力、提升流动性方面取得了显著成效。

模型假设:

  1. 假设在一天内车流量具有一定的周期性或时间段特性。
  2. 假设可以根据某些先验信息或历史数据,对车辆转弯的比例进行估计。
  3. 假设可以忽略行人、非机动车等其他交通因素的影响。
  4. 假设某些车辆多次出现在同一地区,并以低速移动时,可以将其视为在寻找停车位。

问题分析:

  本次交通流量管控问题,围绕一个拥有知名景区的小镇交通问题展开,特别是在高峰期或假日期间,如何有效管理交通流量,优化道路通行效率和停车问题。问题设计基于对车流量的分析、信号灯优化以及假日期间临时交通管控措施的评价。
  问题一分析
  问题一要求根据车流量的差异,将一天分成若干时段,估计经中路-纬中路交叉口在不同时间段各个相位的车流量。为解决这个问题,需要对车流量进行时间分段分析。通过分析监控设备记录的数据,可以根据车流量的变化确定交通高峰和低谷的时间段。首先,使用统计学方法,如聚类分析,找出车流量随时间的变化规律,将一天划分为若干时段。为了估算每个方向的直行、左转、右转车流量,我们需要合理假设或基于历史数据得出各个方向上直行、左转、右转的比例。通过引入智能优化算法自动调整模型参数(如直行、左转、右转的比例),使得车流量估计更加准确。我们可以使用粒子群优化算法(PSO)、差分进化算法等来实现这一目标。最后,估计各个相位在每个时段的车流量,便于后续信号灯的优化调整。
  问题二分析
  问题二要求对经中路和纬中路上所有交叉口的信号灯进行优化配置,以在保证车辆通行的前提下,使得两条主路上的车流平均速度最大。该问题的核心在于通过信号灯的优化配置,减少交通拥堵,提升整体交通效率。小镇的交通情况复杂,除了本地居民出行,还有游客车辆在寻找停车位时的低速绕行,进一步加剧了拥堵。因此,需要在交通信号灯的控制策略上进行精细化管理。我们可以使用交通流量数据和强化学习方法,建立一个能够动态调整信号灯配时的模型。通过对经中路-纬中路交叉口车流量的实时监测,识别出车流高峰和低峰时段,并对信号灯进行优化配时,使车辆的平均等待时间最小化,从而提高车流速度。具体建模可以使用深度强化学习模型(如DQN),将每个交叉口的信号灯配时视为动作空间,车流速度视为奖励函数,进行迭代优化。此外,仿真验证是确保模型有效性的关键步骤,可以使用交通仿真软件(如SUMO)对不同信号灯配置策略进行测试和验证,评估其对车流平均速度的影响。通过对不同配置方案的比较和优化,最终可以找到一个最佳的信号灯配时方案,以最大化两条主路的车流速度,减少交通拥堵,提高通行效率。
  问题三分析
  问题三重点在于通过对五一黄金周期间的车俩数据进行深入分析,判定哪些车辆因寻找停车位而在景区周边巡游,并估算需要征用多少临时停车位来满足需求。首先,需通过车辆低速行驶和频繁经过同一交叉口等特征识别巡游车辆。接着,分析巡游车辆的数量和巡游时长,结合泊松分布模型估算巡游车辆的停车需求。根据发改委意见,0.1-0.3 个泊位对应出行停车需求,基于此需求量利用泊松分布的 95%置信区间估算出停车位的最大需求量。最终结果有助于为高峰期停车管理提供数据支持,合理规划临时停车位,以缓解交通压力,提高景区通行效率。
  问题四分析
  问题四要求评价五一黄金周期间对景区周边道路实行的临时性交通管理措施的效果。首先,通过对比五一黄金周期间和日常交通流量、车速等数据,可以定量分析交通管理措施的效果。例如,通过比较车辆的平均速度、车辆的通行时间等指标,可以评估管理措施是否有效缓解了交通拥堵。其次,通过对巡游车辆和停车需求的分析,可以判断措施是否有效减少了因寻找停车位而产生的低速行驶情况。此外,还可以分析拥堵区域的分布变化,判断管理措施是否达到了疏导交通的目的。结合这些定量指标,可以全面评估临时管控措施的实施效果。

模型的建立与求解整体论文缩略图

在这里插入图片描述

全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码(完整论文以及代码请联系博主):

数据处理代码:
import pandas as pd
# 使用 GBK 编码加载 CSV 文件,处理中文字符
file_path = '附件 2.csv'
data = pd.read_csv(file_path, encoding='gbk')
# 将“时间”列转换为日期时间格式
data['时间'] = pd.to_datetime(data['时间'].str[:19])
# 定义“方向”列的映射,将数字代码转换为易读的方向描述。
direction_map = {1: 'north-south', 2: 'south-north', 3: 'east-west', 4: 'west-east'}
data['方向'] = data['方向'].map(direction_map)
# 提取日期,小时,分钟
data['日期'] = data['时间'].dt.date
data['小时'] = data['时间'].dt.hour
data['分钟'] = data['时间'].dt.minute

data.to_csv('整理后的附件 2.csv', index=False)
# 按“交叉口”、“方向”、“日期”和“小时”进行分组,计算每组的大小(即车流量)
hourly_flow = data.groupby(['交叉口', '方向', '日期', '小时']).size().reset_index(name='车流量')
hourly_flow.to_excel('聚合处理数据.xlsx', index=False)
import numpy as np
from pyswarm import pso
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# 设置 matplotlib 以支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 读取聚合处理后的数据
file_path = '聚合处理数据.xlsx'
df = pd.read_excel(file_path)

# 筛选出特定交叉口的数据(经中路-纬中路)
intersection_data = df[df['交叉口'] == '经中路-纬中路']
# 保存筛选出的交叉口数据到新的 Excel 文件
intersection_data.to_excel('问题一-经中路-纬中路交叉口数据.xlsx')

# 按小时汇总车流量
hourly_traffic_flow = intersection_data.groupby(['小时'])['车流量'].sum().reset_index()

# 绘制该交叉口 24 小时车流量变化趋势图
plt.figure(figsize=(10,6))
plt.plot(hourly_traffic_flow['小时'],hourly_traffic_flow['车流量'],marker='o', linestyle='-')
plt.title('经中路-纬中路交叉口 24 小时车流量变化趋势', fontsize=14)
plt.xlabel('小时', fontsize=12)
plt.ylabel('车流量', fontsize=12)
plt.xticks(range(0, 24, 1))
plt.grid(True)
plt.savefig('./picture/经中路-纬中路交叉口 24 小时车流量变化趋势.png', dpi=300)

# 再次读取数据并筛选经中路-纬中路交叉口的数据
file_path = '聚合处理数据.xlsx'
data = pd.read_excel(file_path)
data = data[data['交叉口'] == '经中路-纬中路']

# 按小时汇总车流量
flow_data_sum = data.groupby(['小时']).sum(numeric_only=True).reset_index()

# 提取车流量列并进行标准化
X = flow_data_sum[['车流量']].values
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 使用肘部法确定最佳聚类数 k,k 值范围为 1 到 10
wcss = []
k_values = range(1, 11)
for k in k_values:
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(X_scaled)
    wcss.append(kmeans.inertia_)

# 绘制肘部法图,确定最佳聚类数
plt.figure(figsize=(10, 6))
plt.plot(k_values, wcss, marker='o')
plt.title('肘部法求解最佳聚类数 k', fontsize=14)
plt.xlabel('聚类数(k 值)', fontsize=12)
plt.xticks(ticks=range(0, 11), fontsize=12)
plt.ylabel('WCSS(簇内平方和)', fontsize=12)
plt.grid(True)
plt.savefig('./picture/肘部法求解最佳聚类数 k.png', dpi=300)

# 根据肘部法确定 k=3 为最佳聚类数
optimal_k = 3

# 对数据进行按方向和小时分组,并标准化车流量
flow_data = data.groupby(['小时', '方向'])['车流量'].sum().unstack().fillna(0)
scaled_flow_data = scaler.fit_transform(flow_data)
kmeans = KMeans(n_clusters=optimal_k, random_state=42)

# 将每小时的车流量聚类,并添加聚类结果到数据中
flow_data['Cluster'] = kmeans.fit_predict(scaled_flow_data)
flow_data['Hour'] = flow_data.index
flow_data_sorted = flow_data.sort_values('Cluster')

# 打印聚类后的结果
print(flow_data_sorted[['Hour', 'Cluster']])

# 绘制聚类结果散点图
plt.figure(figsize=(10, 6))
for i in range(optimal_k):
    cluster_data = flow_data_sorted[flow_data_sorted['Cluster'] == i]
    plt.scatter(cluster_data.index, cluster_data.sum(axis=1), label=f'Cluster {i}')
plt.title('聚类结果散点图', fontsize=14)
plt.xlabel('小时', fontsize=12)
plt.ylabel('车流量', fontsize=12)
plt.legend()
plt.show()
plt.xticks(ticks=range(0, 24), fontsize=12)
plt.ylabel('车流量', fontsize=12)
plt.legend(title='簇', fontsize=12)
plt.grid(True)
plt.savefig('./picture/聚类结果散点图.png', dpi=300)

# 读取问题一的交叉口数据
file_path = '问题一-经中路-纬中路交叉口数据.xlsx'
data = pd.read_excel(file_path)

# 根据小时分类时间段
def classify_time_period(hour):
    if hour in [23, 0, 1, 2, 3, 4, 5]:
        return '低峰时段'
    elif hour in [6, 21, 22]:
        return '中峰时段'
    else:
        return '高峰时段'

# 应用分类函数,将每个小时分类为低峰、中峰或高峰时段
data['Time Period'] = data['小时'].apply(classify_time_period)

# 按时间段和方向汇总车流量
period_flow = data.groupby(['Time Period', '方向'])['车流量'].sum().reset_index()
actual_flows = period_flow['车流量'].values

# 定义 PSO 的目标函数,用于优化直行、左转、右转比例
def pso_objective(params, actual_flow):
    straight_proportion, left_turn_proportion, right_turn_proportion = params
    # 如果比例和不为 1,返回无穷大
    if straight_proportion + left_turn_proportion + right_turn_proportion != 1:
        return np.inf

    # 估算各个方向的车流量
    estimated_straight_flow = actual_flow * straight_proportion
    estimated_left_turn_flow = actual_flow * left_turn_proportion
    estimated_right_turn_flow = actual_flow * right_turn_proportion

    # 返回估算的总流量与实际流量的差异
    return np.abs(estimated_straight_flow + estimated_left_turn_flow + estimated_right_turn_flow - actual_flow)

# 设置 PSO 的上下限
lb = [0.4, 0.1, 0.1]
ub = [0.8, 0.3, 0.3]

# 对每个实际车流量应用 PSO 优化算法
optimized_results_pso = []
for flow in actual_flows:
    xopt, fopt = pso(pso_objective, lb, ub, args=(flow,), swarmsize=10, maxiter=50)
    # 将优化结果归一化
    normalized_xopt = xopt / np.sum(xopt)
    optimized_results_pso.append(normalized_xopt)
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

网站公告

今日签到

点亮在社区的每一天
去签到