【BetterBench博士】2024年华为杯E题:高速公路应急车道紧急启用模型 Python代码实现

在这里插入图片描述

题目

【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析

【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析

【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析

1 问题一

(1) 第一小问

  1. 首先,需要将视频文件转换为帧,以便进行后续处理。
  2. 然后,使用算法对视频帧进行检测车辆。代码实现了YOLO5算法,尝试了FastRCNN算法非常耗时,不建议运行。
  3. 使用跟踪算法跟踪车辆。以下采用的SORT,或者DeepSORT等算法。
  4. 计算特征
  • 时间戳:通过视频帧的位置获取。
  • 车流密度:车流密度通常是检测到的车辆数量与区域面积的比值。
  • 车流量:在一定时间段内通过的车辆数量。
  • 平均速度:首先计算车辆的位移:通过跟踪的车辆ID在每一帧之间的位置信息,计算每辆车在相邻帧之间的位移。然后计算时间间隔:根据时间戳计算相邻帧之间的时间间隔。最后计算速度:使用位移除以时间间隔得到车辆的速度。

(2) 第二、三小问

可以使用时序预测模型(例如LSTM、ARIMA)或传统的回归模型(如线性回归、决策树)来预测交通流拥堵情况。下面是一个基于随机森林回归的实现,提取的车流参数(车流密度、车流量、速度)来预测未来是否会发生拥堵。使用从四个观测点视频中提取的车流密度、车流量和速度等数据作为模型输入,进行时序建模,并预测未来的交通拥堵状态。基于历史数据预测下一时间点的交通流参数(车流密度、车流量和速度),并结合定义的拥堵条件,发出实时预警。

定义拥堵状态:当车流密度大于0.7且速度小于40 km/h时

使用测试集验证模型预测的车流密度、车流量和速度,并结合可视化方法来评估模型的表现。计算混淆矩阵和ROC曲线,分析模型的拥堵预测能力。

import cv2
import torch
from sort.sort import Sort
import numpy as np
import pandas as pd
from datetime import datetime
from tqdm import tqdm  # 用于显示进度条
device = torch.device("cuda" if True else "cpu")
# 使用 YOLOv5 作为目标检测模型
def load_model():# 使用 Ultralytics 的 YOLOv5 模型,确保已安装 'yolov5' 包# pip install yolov5model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)model.to(device)model.eval()return model# 将检测结果格式化为 SORT 算法接受的格式
def format_detections(predictions, score_threshold=0.5):detections = []for *box, score, cls in predictions:if score > score_threshold and int(cls) == 2:  # COCO中 'car' 的类别ID通常为2x1, y1, x2, y2 = boxdetections.append([x1, y1, x2, y2, score])return detections# 计算车辆速度 (像素/秒)
def calculate_speed(track, prev_track, fps):if prev_track is None:return 0# 计算位移 (欧几里得距离)x1, y1, _, _ = track[:4]prev_x1, prev_y1, _, _ = prev_track[:4]displacement = np.sqrt((x1 - prev_x1)**2 + (y1 - prev_y1)**2)time_interval = 1 / fps  # 时间间隔(秒)return displacement / time_interval  # 像素/秒# 处理视频,提取车辆流量信息
def detect_and_track(video_path, model, tracker, device, score_threshold=0.5, resize_width=640):# 打开视频cap = cv2.VideoCapture(video_path)if not cap.isOpened():raise IOError(f"无法打开视频文件 {video_path}")fps = cap.get(cv2.CAP_PROP_FPS)frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))# 初始化数据存储timestamps = []densities = []flows = []speeds = []tracked_objects = {}  # 存储每个车辆的历史轨迹total_flow = 0  # 总车流量# 使用 tqdm 显示处理进度for _ in tqdm(range(frame_count), desc=f"Processing {video_path}"):ret, frame = cap.read()if not ret:break# 记录时间戳(可以选择只记录关键帧的时间戳以减少开销)timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")# 调整图像大小以加快处理速度if resize_width:height, width = frame.shape[:2]scale = resize_width / widthframe_resized = cv2.resize(frame, (resize_width, int(height * scale)))else:frame_resized = frame# 转换颜色格式(BGR -> RGB)img_rgb = cv2.cvtColor(frame_resized, cv2.COLOR_BGR2RGB)# 使用模型进行检测results = model(img_rgb, size=640)  # size可以根据需求调整# 获取预测结果detections = results.xyxy[0].cpu().numpy()  # [x1, y1, x2, y2, confidence, class]detections = format_detections(detections, score_threshold)if len(detections) > 0:...else:# 如果当前帧没有检测到车辆,存储默认值timestamps.append(timestamp)densities.append(0)flows.append(0)speeds.append(0)cap.release()# 返回结果 DataFramedata = pd.DataFrame({'timestamp': timestamps,'density': densities,'flow': flows,'speed': speeds})return datadef extract_vehicle_data(video_paths, score_threshold=0.5, resize_width=640):device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model = load_model()tracker = Sort()all_vehicle_data = []for video in video_paths:vehicle_data = detect_and_track(video_path=video,model=model,tracker=tracker,device=device,score_threshold=score_threshold,resize_width=resize_width)all_vehicle_data.append(vehicle_data)# 合并所有视频的数据all_vehicle_data = pd.concat(all_vehicle_data, ignore_index=True)return all_vehicle_data

可视化提取出来的特征

import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = 'SimSun' # 换成自己环境下的中文字体,比如'SimHei'# 第一个观测点数据可视化# result_df = pd.read_csv('data/data_point1.csv')
# result_df = pd.read_csv('data/data_point1.csv')
# result_df = pd.read_csv('data/data_point3.csv')
result_df = pd.read_csv('data/data_point4.csv')
# 可视化车流密度、流量和平均速度
plt.figure(figsize=(10, 8))
plt.subplot(3, 1, 1)
plt.plot(range(len(result_df)), result_df['density'], label='车流密度', color='blue')
plt.title('车流密度随时间变化')
plt.xlabel('时间戳 (ms)')
plt.ylabel('车流密度')
plt.legend()plt.subplot(3, 1, 2)
plt.plot(range(len(result_df)), result_df['flow'], label='车流量', color='orange')
plt.title('车流量随时间变化')
plt.xlabel('时间戳 (ms)')
plt.ylabel('车流量')
plt.legend()plt.subplot(3, 1, 3)
plt.plot(range(len(result_df)), result_df['speed'], label='平均速度', color='green')
plt.title('平均速度随时间变化')
plt.xlabel('时间戳 (ms)')
plt.ylabel('平均速度 (像素/秒)')
plt.legend()plt.tight_layout()
plt.savefig('img/第4个观测点数据可视化.png',dpi=200)
plt.show()

在这里插入图片描述

问题二 、三

传统应急车道的启用多是静态的,且缺少区域路网联动分析,难以动态应对不同场景下的交通需求。因此,模型需要集成多情景的动态分析,包括节假日高峰、突发事故、排队消散等情景。 对不同情景的处理逻辑,如在节假日高峰期通过流量监测系统提前识别大流量,启用应急车道;对于已经拥堵的路段,采取临时开放应急车道的策略来消散车流,恢复主线运行。

虚拟应急车道能够通过主动交通管理技术提升救援效率,缩短事故响应时间。因此,模型可考虑集成虚拟应急车道的控制策略,利用车辆通信系统动态引导车辆临时进入虚拟应急车道,提升通行效率。 在紧急情况下,模型通过仿真预测未来交通流量,并决定是否虚拟启用应急车道,结合事故发生时的流量、速度等关键参数决定应急车道的开放时长与区域。

应急车道管控不仅需要考虑实时流量与交通状况,还需结合历史数据,分析拥堵易发节点,构建拥堵中断模型。对于应急车道的开放时机和时长,需基于具体的交通状况预测。 集成实时交通数据与历史拥堵数据,构建交通流概率中断模型,动态调整应急车道的开放时长和开放区域。

可以通过VISSIM仿真分析不同车道配置下虚拟应急车道的效益优化,表明在不同事故情景下,适时开启虚拟应急车道可有效减少平均延误和排队长度。模型可以根据车道封闭数量和流量密度优化启用条件。引入VISSIM仿真结果,基于流量密度、封闭车道数和v/C值优化应急车道的启用条件,进一步提升模型的精度。

import pandas as pd
import numpy as np
import warningswarnings.filterwarnings('ignore')
# 设置阈值
density_threshold = 0.7  # 车流密度阈值
speed_threshold = 40  # 速度阈值,单位:km/h# 拥堵风险计算函数
def compute_congestion_risk(density, speed, density_threshold, speed_threshold):...return congestion_risk# 添加高峰期和事故判断函数
def is_peak_hour(timestamp):"""假设高峰时段为每天的7-9点和17-19点"""hour = pd.to_datetime(timestamp).hourreturn (7 <= hour <= 9) or (17 <= hour <= 19)def is_accident_scene(density, speed):"""假设当速度为0且密度很高时为事故"""return (speed == 0) and (density > density_threshold)# 动态管控模型:应急车道启用判断
def dynamic_control(data, density_threshold, speed_threshold, time_window=10):# 计算每个时刻的拥堵风险data['congestion_risk'] = data.apply(lambda row: compute_congestion_risk(row['density'], row['speed'], density_threshold, speed_threshold), axis=1)# 判断是否为高峰时段data['peak_hours'] = data['timestamp'].apply(is_peak_hour)# 判断是否为事故现场data['accident_scene'] = data.apply(lambda row: is_accident_scene(row['density'], row['speed']), axis=1)# 滑动窗口计算未来time_window分钟内的平均拥堵风险data['avg_risk'] = data['congestion_risk'].rolling(window=time_window).mean()# 如果未来的平均风险超过1,且为高峰期或事故现场,启用虚拟应急车道data['virtual_lane'] = np.where((data['avg_risk'] > 1) & (data['peak_hours'] | data['accident_scene']), True, False)return data# 读取数据并应用模型
data_point = pd.read_csv('data/data_point1.csv')
data = data_point[(data_point['speed'] > 0) & (data_point['density'] > 0)]# 应用动态控制模型
result = dynamic_control(data, density_threshold, speed_threshold)
# 输出结果
print(result[['timestamp', 'virtual_lane']])

在这里插入图片描述

问题四

  1. 问题分析

原有四个采集点的布置方案中,前三个采集点之间相隔 1000m,最后一个点与第三个点之间相隔 3000m。但是这样的布置在前1000m 的路段可以较好地捕捉交通状态变化,但在距离较长的第三点和第四点之间,可能会丢失大量交通流变化的信息。

优化数据采集点的布置,确保在第三点和第四点之间的 3000m 路段上能够精确采集数据,以便做出更科学的应急车道启用决策。优化模型的核心目标是:

  • 精度:确保关键路段(第三点到第四点)的交通状态能够被准确地监控。
  • 成本控制:在精度要求下,尽量减少新采集点的数量,降低安装与维护的成本。
  1. 建模算法步骤

(1)初始化参数:

  • 设定采集点的最小间隔 D min = 1000 m D_{\text{min}} = 1000 \, m Dmin=1000m
  • 设定应急响应时间 T response = 10 分钟 T_{\text{response}} = 10 \, \text{分钟} Tresponse=10分钟
  • 获取现有四个采集点的交通流量、速度和密度数据。

(2)计算每个路段的交通状态变异性:
根据变异性公式,计算各个路段的变异性 V i V_i Vi

(3)判断是否需要增加采集点:
如果某个路段的变异性 V i V_i Vi 超过预定阈值 V threshold V_{\text{threshold}} Vthreshold,则需要在该路段新增数据采集点。

(4)优化布点方案:

  • 在第三点到第四点之间,若变异性较大( V 2 > V threshold V_2 > V_{\text{threshold}} V2>Vthreshold),则在1500m处增加新的采集点。
  • 保证数据采集点的间隔 D new ≥ D min D_{\text{new}} \geq D_{\text{min}} DnewDmin

(5)输出新的采集点布置方案。

import pandas as pd
import numpy as np# 初始化参数
D_min = 1000  # 最小采集点间隔,单位:米
T_response = 10  # 应急响应时间,单位:分钟
V_threshold = 0.2  # 变异性阈值# 读取数据
data_point1 = pd.read_csv('data/data_point1.csv')
data_point2 = pd.read_csv('data/data_point2.csv')
data_point3 = pd.read_csv('data/data_point3.csv')
data_point4 = pd.read_csv('data/data_point4.csv')# 计算交通状态变异性
def compute_variability(data):...# 计算每个路段的变异性
V1 = compute_variability(data_point1)
V2 = compute_variability(data_point2)
V3 = compute_variability(data_point3)
V4 = compute_variability(data_point4)# 判断是否需要增加采集点
def check_new_point(V, V_threshold, D_current, D_min):if V > V_threshold and D_current > D_min:return Truereturn False# 路段间隔(第三点到第四点为3000m,其他为1000m)
D1, D2, D3 = 1000, 1000, 3000# 判断第三点和第四点之间是否需要新增采集点
new_point_needed = check_new_point(V3, V_threshold, D3, D_min)# 输出优化的布置方案
if new_point_needed:print("建议在第三点到第四点之间新增采集点")
else:print("现有采集点布置合理,无需新增采集点")

完整资料

转到B站视频介绍
bilibili.com/video/BV16AskeMEPN/?share_source=copy_web&vd_source=d2dd5fcbeeeec396792650b25c110a13
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148799.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Transformers基础入门篇4】基础组件之Model

文章目录 一、Model简介1.1 Transformer1.2 注意力机制1.3 模型类型 二、Model Head2.1 什么是 Model Head2.2 Transformers中的Model Head 三、Model基本使用方法3.0 模型下载-浏览器下载3.1 模型加载与保存3.2 配置加载参数3.3 加载config文件3.2 模型调用3.2.1 带ModelHead的…

*C++:string

一.STL简介 1.STL STL(standard template libaray- 标准模板库 ) &#xff1a; 是 C 标准库的重要组成部分 &#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架 。 2.STL六大组件 二.标准库里的string类 标准string库网址&#xff1…

朴世龙团队《Global Change Biology 》研究成果!揭示生物累积效应对秋季叶片衰老的重要调节作用!

本文首发于“生态学者”微信公众号&#xff01; 在全球气候变化的背景下&#xff0c;生态系统的季节性变化&#xff0c;尤其是植物的春季叶片展开和秋季叶片衰老&#xff08;EOS&#xff09;&#xff0c;对碳循环和区域气候调节起着至关重要的作用。然而&#xff0c;关于秋季叶…

腾讯云点播及声音上传

文章目录 1、开通腾讯云点播2、获取腾讯云API密钥3、完成声音上传3.1、引入依赖3.2、参考&#xff1a;接入点地域3.3、参考&#xff1a;任务流设置3.4、首先修改配置&#xff1a;3.4.1、 3.5、TrackInfoApiController --》 uploadTrack()3.6、VodServiceImpl --》 uploadTrack(…

计算存款利息-C语言

1.问题&#xff1a; 假设有本金1000元&#xff0c;想存一年&#xff0c;有三种方法可选择&#xff1a; A活期&#xff0c;年利率为0.0036&#xff1b; B一年期定期&#xff0c;年利率为0.0225&#xff1b; C存两次半年定期&#xff0c;年利率为0.0198。 请分别计算出一年后…

帮13岁小孩哥2分钟完成开发,这位AI程序员究竟是何方神圣?

通义灵码再升级&#xff0c;真AI程序员来了 随着通义系列基础模型能力的全面提升&#xff0c;各个具体领域的应用模型也随之飞升。这次在云栖大会上迎来重磅升级的&#xff0c;就包括用于代码生成的通义灵码。 一年前的通义灵码还只能完成基础的辅助编程任务&#xff0c;很难…

加快软件项目开发进度的6大技巧

加快软件项目的开发进度对于项目的成功与市场竞争力的提升至关重要。此举能够迅速响应市场变化&#xff0c;抢占市场先机&#xff0c;增强竞争力&#xff0c;同时降低开发成本&#xff0c;提升用户满意度。因此&#xff0c;加速开发是确保项目成功与市场竞争力的核心要素。若未…

捷途旅行者8月燃油SUV销量夺冠,遥遥领先!

2023年9月&#xff0c;捷途旅行者这款国内首款旅行越野SUV&#xff0c;如同一匹黑马般闯入国内汽车市场&#xff0c;凭借其方正硬朗的造型与13.99万元的亲民起售价&#xff0c;迅速点燃了消费者的购车热情。时隔一年&#xff0c;这款车的魅力依旧不减&#xff0c;2024年8月的销…

利用Leaflet.js集成强大的船舶管理页面:集成标记/路线/区域绘制和动态显隐功能

引言 在船舶管理领域&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术的应用日益广泛。通过GIS技术&#xff0c;管理人员可以实时监控船舶的位置、航线以及与其他重要地理位置的关系。Leaflet.js作为一个轻量级但功能强大的前端地图框架&#xff0c;使得在Web页面上集…

如何用AI论文生成工具撰写一篇高质量的成人教育毕业论文

撰写一篇高质量的成人教育毕业论文并不简单&#xff0c;它有一定的步骤和策略。锐智AI今天就总结了一些关键的步骤&#xff0c;希望对即将毕业的你顺利完成论文写作&#xff1a; 介绍之前简单说下锐智AI&#xff0c;它是一款集论文大纲生成、内容填充、文献引用、查重修改于一…

Microsoft Edge WebView2运行时安装包获取

目前越来越多的软件将WebView2当做运行时&#xff0c;发现一些精简版的系统精简掉了WebView2或者人为误删除&#xff0c;一些软件无法正常运行&#xff0c;我们可以重新安装即可 浏览器访问WebView2官方页面 https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/ …

头戴式耳机百元以内都有哪些推荐?头戴式耳机百元测评推荐

今天跟大家聊一聊头戴式耳机&#xff0c;无论是沉浸在游戏的世界中&#xff0c;还是专注于观看视频课程汲取知识&#xff0c;它都能为我们带来清晰、震撼的音质体验。对程序员来说&#xff0c;在嘈杂的工作环境中&#xff08;比如机房里&#xff09;&#xff0c;它的降噪功能显…

CVE-2024-44902 Thinkphp反序列化漏洞

Thinkphp v6.1.3至v8.0.4版本中存在反序列化漏洞&#xff0c;攻击者可利用此漏洞执行任意代码。 影响版本 v6.1.3 < thinkphp < v8.0.4 环境搭建 环境&#xff1a;php8.0.2thinkphp8.0.4memcached3.2.0 首先搭建 thinkphp 环境&#xff1a;thinkPHP 8.0.4 安装_thin…

02 BlockChain-- ETH

以太坊与比特币有什么不同&#xff1f; 以太坊立足比特币创新之上&#xff0c;于 2015 年启动&#xff0c;两者之间有一些显著不同。 从宏观的方面&#xff1a; 比特币就仅仅是比特币&#xff1b;以太坊&#xff08;Ethereum&#xff09;包括以太币&#xff08;Ether&#x…

Python可迭代对象(2)

目录 3。字典 字典的构造 字典的添加和修改 字典推导式的使用 以上全部代码编译结果展示 字典复习 4。集合(set) 集合的创建 集合的运算 集合的添加和删除元素 以上全部代码的编译结果 序列解包&#xff08;Sequence unpacking&#xff09; 3。字典 字典的构造 #字…

【第十六章:Sentosa_DSML社区版-机器学习之生存分析】

【第十六章&#xff1a;Sentosa_DSML社区版-机器学习之生存分析】 16.1 加速失效时间回归 1.算子介绍 加速失效时间回归模型Accelerated failure time (AFT)是一个监督型参数化的回归模型&#xff0c;它可以处理删失数据。它描述了一个生存时间的对数模型&#xff0c;所以它通…

Pygame中Sprite实现逃亡游戏1

在《Pygame中Sprite类实现多帧动画》系列中&#xff0c;通过pygame中的sprite类&#xff08;精灵类&#xff09;实现了多帧动画。在该动画的基础上&#xff0c;可以来实现一个逃亡游戏&#xff0c;如图1所示。 图1 逃亡游戏效果 从图1中可以看出&#xff0c;玩家被飞龙追赶&am…

【树莓派】python3程序获取CPU和GPU温度

前言代码以及展示总结 前言 来来来&#xff0c;先放参考文献 如何检查树莓派的温度⇨这个是通过两种指令获取温度&#xff0c;和我之前设置的状态栏显示有点大同小异。 读取树莓派4B处理器(CPU)的实时温度⇨这个也是指令 下面两个是代码了 树莓派实现温度监控并控制风扇散热 获…

powerBi -L4-分组求和

有如下的表格&#xff1a;我们想统计 不同商品的销售次数&#xff0c;根据商品ID进行分类&#xff0c;统计不同ID出现的次数 1.新建列&#xff1a; 2.输入如下的公式 分组统计序列 COUNTROWS(FILTER(数据源,[商品类别]EARLIER(数据源[商品类别])&&[索引]<EARLIE…

3.2 USART 通用同步/异步收发器

文章目录 什么是USARTUSART框图 stm32的Usart串口收发配置初始化发送接收 重定向的几种方法串口发送数据包 什么是USART USART&#xff08;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff09;通用同步/异步收发器USART是STM32内部集成的硬件外设&#xff0…