【2024高教社杯全国大学生数学建模竞赛】E题完整解析(含论文、代码分享)

解题思路

对于问题一,题目要求对经中路-纬中路交叉口,基于划分的时段,估计不同时段各个相位(包括四个方向直行、转弯)车流量。首先对原始数据进行预处理,包括缺失值和异常值检测,这里应该是不存在这种情况。然后按照生活经验,我们将时间段划分为几个关键时间段:如早高峰(7:00-9:00)、午间高峰(12:00-14:00)、晚高峰(17:00-19:00)以及非高峰时段。然后对数据基于设定好的时段进行归纳整理,得到每个时段各个相位的车流量统计情况。由于监控设备只能记录车辆在停车线前的情况,无法判断是否转弯,可通过经验或者历史流量的比例估算各个方向的转向情况。最终得到每个时段各个相位(包括四个方向直行、转弯)车流量数据。

对于问题二,题目要求根据所给数据和上述模型,对经中路和纬中路上所有交叉口的信号灯进行优化配置,使两条主路上的车流平均速度最大。第一问我们得到了各个路口在不同时段的车流分布。定义优化目标为最大化车辆的平均通行速度,同时保证交通流的安全性和通行效率。基于交叉口车流量、各相位的转弯及直行数据,构建基于车流量的交通信号灯优化控制的数学模型。考虑约束条件:如车流量、路段长度、最大等待时间等,确保通行顺畅。最后基于优化后的信号灯时长和流量数据,进行模拟仿真,验证方案的有效性。

对于问题三,题目要求对五一黄金周期间的数据进行分析,判定寻找停车位的巡游车辆,并估算假期景区需要临时征用的停车位。从附件2的五一黄金周数据中提取在同一交叉口或道路附近多次出现的车辆。对于这些车辆,可以根据车辆在多个相邻时段重复出现的情况,推断其可能是在寻找停车位的巡游车辆。基于轨迹数据,可以构建一个分类模型,通过识别车辆的行驶模式(如频繁在同一区域往返)来判断是否为巡游车辆。根据识别出的巡游车辆数量和时间分布,估算在不同时间段的停车位需求量。使用回归分析或时间序列分析等方法预测假期期间的总停车位需求量。同时可以添加一个找到停车位的概率的情况假设,添加至预测的需求量中,进而计算出最终需要临时增加的停车位数量。

对于问题四,题目要求结合数据评价临时管控措施在两条主路上的效果,可以直观上从交通流量、通行时间、车速等关键指标评估管控措施的效果。然后,使用统计方法检测交通管控措施前后的变化是否显著。此外,可以将上述的关键指标融合为一个交通拥堵指数来量化各路段的拥堵程度,进而总体层面来评价临时管控措施的成果。最后基于数据分析结果,提出对当前管控措施的优化建议或未来改进方向。

1 数据预处理

由于附件2过大,无法使用excel进行完整的数据观察,所以在开始处理问题之前,为了方便解题,我们首先将原始的八百万条数据按照5日一个节点进行划分,首先进行大致的数据观察。

重复项与缺失项处理:
首先对数据(附件 1,附件 2)进行了检查,数据中不存在重复项与缺失值。

异常值处理:
观察粗略处理后的文件,发现附件2中存在无车牌号的情况,但本文不会将这类设定为异常数据。比如在考虑车流量时,我们只需要在乎车的数量,而并非在意其是否有属于自己的标志。在构建预测模型时,有时候包含异常值可以增加模型对未来异常情况的预测能力和加强鲁棒性。

2 问题一模型的建立与求解

问题一的分析

对于问题一,题目要求对经中路-纬中路交叉口,基于划分的时段,估计不同时段各个相位(包括四个方向直行、转弯)车流量。首先对原始数据进行预处理,包括缺失值和异常值检测,发现不存在这种情况。然后基于K-Means聚类分析将时间段划分为几个关键时间段。然后对数据基于设定好的时段进行归纳整理,得到每个时段各个相位的车流量统计情况。

2.2 数据可视化

本文首先按照题目要求从附件2中提取出仅包含经中路-纬中路交叉路口的信息至新文件中,然后在不删除原始数据的条件下,对该数据进行分析,得到车流量随着以小时为单位变化的折线图,如下所示:
在这里插入图片描述
可以看到车流量在凌晨0:00到5:00之间维持在较低水平,接近谷底。这个时间段通常是深夜时段,车流量较少,这符合现实中的情况,因为大部分车辆在夜间停驶。从5:00开始,车流量迅速上升,在7:00左右达到一个明显的高峰。这表明在早晨的通勤时段,很多车辆经过该交叉口。车流量在9:00之后进入相对平稳的高位水平,直到17:00左右。这表明在日间时段,该交叉口的车流量保持相对稳定,主要是由于工作时段和常规交通活动。车流量在17:00左右再次上升,达到一天中的另一个高峰,这是典型的晚高峰时段。车流量在晚高峰之后逐渐下降,在21:00至23:00期间显著减少,表明该时段车辆数量逐渐减少,接近夜间的低流量水平。

2.2 问题一模型的建立

根据车流量的差异,将一天分成若干个时段,这里我们可以使用机器学习中的聚类算法来根据车流量的变化自动划分时间段。通过对每个时间段的车流量进行聚类,系统会自动找出相似车流量的时间段,从而形成不同的时段。然后我们再基于划分好的不同时段的进行各个相位的车流量的计算。

  • 模型结构设计

K-means聚类算法的目的是将数据点划分为k个聚类,使得同一聚类中的数据点彼此尽可能接近,同时不同聚类中的数据点尽可能远离。通过最小化簇内平方误差,我们可以得到每个数据点到其聚类中心的距离之和的最小值。

  • 模型构建
    在这里插入图片描述

代码

第一问

import pandas as pd

# 读取 CSV 文件
file_path = '附件2.csv'  # 替换为您的文件路径
data = pd.read_csv(file_path, encoding='gbk')

# 提取交叉口为 "经中路-纬中路" 的所有行
filtered_data = data[data['交叉口'] == '经中路-纬中路']

# 将结果保存为新的 CSV 文件
output_file_path = 'filtered_jingzhong_weizhong.csv'
filtered_data.to_csv(output_file_path, index=False)

print(f"过滤后的数据已保存至 {output_file_path}")


import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 读取筛选后的 CSV 文件
data = pd.read_csv('filtered_jingzhong_weizhong.csv')

# 将时间列转换为 datetime 格式
data['时间'] = pd.to_datetime(data['时间'])

# 创建小时列,提取时间中的小时信息
data['小时'] = data['时间'].dt.hour

# 按小时统计车流量
flow_per_hour = data.groupby('小时').size().reset_index(name='车流量')

# 数据归一化处理,确保聚类不受量纲影响
scaler = StandardScaler()
flow_scaled = scaler.fit_transform(flow_per_hour[['车流量']])

# 寻找最佳的聚类数量:使用肘部法则
inertia_list = []
silhouette_scores = []
cluster_range = range(2, 10)

for n_clusters in cluster_range:
    kmeans = KMeans(n_clusters=n_clusters)
    kmeans.fit(flow_scaled)
    inertia_list.append(kmeans.inertia_)
    silhouette_scores.append(silhouette_score(flow_scaled, kmeans.labels_))

# 使用肘部法则绘制图表
plt.figure(figsize=(10, 6))
plt.plot(cluster_range, inertia_list, marker='o', label='肘部法则')
plt.title('肘部法则选择最佳聚类数量')
plt.xlabel('聚类数量')
plt.ylabel('Inertia(惯性)')
plt.grid(True)
plt.show()

# 使用轮廓系数绘制图表
plt.figure(figsize=(10, 6))
plt.plot(cluster_range, silhouette_scores, marker='o', label='轮廓系数')
plt.title('轮廓系数选择最佳聚类数量')
plt.xlabel('聚类数量')
plt.ylabel('轮廓系数')
plt.grid(True)
plt.show()

optimal_clusters = 4
kmeans_optimal = KMeans(n_clusters=optimal_clusters)
flow_per_hour['聚类标签'] = kmeans_optimal.fit_predict(flow_scaled)

# 绘制聚类后的车流量随时间变化图
plt.figure(figsize=(10, 6))
plt.scatter(flow_per_hour['小时'], flow_per_hour['车流量'], c=flow_per_hour['聚类标签'], cmap='viridis')
plt.title('基于车流量的时间段划分')
plt.xlabel('小时')
plt.ylabel('车流量')
plt.grid(True)
plt.show()

# 查看聚类结果
print(flow_per_hour)

完整论文

在这里插入图片描述

完整论文与代码请看下方!

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值