2024年华中杯数学建模B题使用行车轨迹估计交通信号灯周期问题解题全过程文档及程序

2024年华中杯数学建模

B题 使用行车轨迹估计交通信号灯周期问题

原题再现

  某电子地图服务商希望获取城市路网中所有交通信号灯的红绿周期,以便为司机提供更好的导航服务。由于许多信号灯未接入网络,无法直接从交通管理部门获取所有信号灯的数据,也不可能在所有路口安排人工读取信号灯周期信息。所以,该公司计划使用大量客户的行车轨迹数据估计交通信号灯的周期。请帮助该公司解决这一问题,完成以下任务。已知所有信号灯只有红、绿两种状态。
  1. 若信号灯周期固定不变,且已知所有车辆的行车轨迹,建立模型,利用车辆行车轨迹数据估计信号灯的红绿周期。附件1中是5个不相关路口各自一个方向连续1小时内车辆的轨迹数据,尝试求出这些路口相应方向的信号灯周期,并按格式要求填入表1。
  2. 实际上,只有部分用户使用该公司的产品,即只能获取部分样本车辆的行车轨迹。同时,受各种因素的影响,轨迹数据存在定位误差,误差大小未知。讨论样本车辆比例、车流量、定位误差等因素对上述模型估计精度的影响。附件2中是另外5个不相关路口各自一个方向连续1小时内样本车辆的轨迹数据,尝试求出这些路口相应方向的信号灯周期,按同样的格式要求填入表2。
  3. 如果信号灯周期有可能发生变化,能否尽快检测出这种变化,以及变化后的新周期?附件3中是另外6个不相关路口各自一个方向连续2小时内样本车辆的轨迹数据,判断这些路口相应方向的信号灯周期在这段时间内是否有变化,尝试求出周期切换的时刻,以及新旧周期参数,按格式要求填入表3,并指明识别出周期变化所需的时间和条件。
  4. 附件4是某路口连续2小时内所有方向样本车辆的轨迹数据,请尝试
识别出该路口信号灯的周期。
   附件1:路口A1、A2、A3、A4、A5各自一个方向连续1小时内车辆轨迹数据
   附件2:路口B1、B2、B3、B4、B5各自一个方向连续1小时内样本车辆轨迹数据
   附件3:路口C1、C2、C3、C4、C5、C6各自一个方向连续2小时内样本车辆轨迹数据
   附件4:路口D所有方向连续2小时内样本车辆轨迹数据
   附件5:数据文件说明及结果表格
  1、轨迹数据文件格式。适用于附件1-附件4所有轨迹数据文件。纯文本文件,第一行为标题行,各列以英文逗号分隔,共5列,分别为时间点、车辆ID、当前位置X坐标、当前位置Y坐标。时间点单位为秒,第0秒开始,每1秒采样一次。坐标单位为米。车辆ID仅用于区分同一个文件中的不同车辆。车辆ID不一定是连续编号。不同文件中,相同ID的车辆没有任何联系。同一车道可能只允许一个方向前进,也可能允许两个方向前进,如直行或左转、直行或右转等。
  2、表1:路口A1-A5各自一个方向信号灯周期识别结果
在这里插入图片描述
  3、表2:路口B1-B5各自一个方向信号灯周期识别结果
在这里插入图片描述
  4、表3:路口C1-C6各自一个方向信号灯周期识别结果
在这里插入图片描述
  说明:“周期切换时刻”是指信号灯周期发生变化的具体时间点,以第一个变化后的时长区间的起点计。如果信号灯周期没有变化,则“周期切换时刻”填写“无”。如果信号灯周期多次切换,按照上述格式,自行延长表格依次填写。

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

  本文根据某电子地图服务商提供的行车轨迹数据,建立了基于两阶段STFT的时频分析模型和基于DBSCAN聚类分析改进的周期检测模型对不同路口的周期进行估计;然后利用贝叶斯变点检测求出周期变化时各阶段的周期参数。
  问题一中,本文首先对 A1-A5 五个互不相关路口的行车轨迹数据进行离群点检测、轨迹连续性检验,然后进行异常值处理。然后,通过指标构建得到车辆运行加速度状态的时序数据,本文建立了基于两阶段STFT的时频分析模型,对时序数据进行周期特征挖掘,得出信号灯的周期性规律。然后通过绘制功率谱密度图得到信号灯完整周期长度,再将车辆处于停车状态最长的时间作为红灯周期,进而得到绿灯周期。最终得到 A1-A5 路口的红灯周期分别为[73,59,81,69,63];绿灯周期分别为[33,28,26,19,26]。
  问题二中,由于样本车辆减少,存在定位偏差等情况,因此,本文在第一问所建立模型的基础上融入DBSCAN聚类分析,得到红绿灯完整周期时长或者完整周期时长的倍数,然后利用基于两阶段STFT的时频分析模型对红绿灯周期进行估计,得到B1-B5 路口的红灯周期分别为[78,83,54,78,95],绿灯周期分别为[27,33,34,27,21]。最后对模型设计对比实验分析探究影响因素,发现车流量减小对模型的影响较大,定位误差因素对模型基本无影响,发现模型有较高的鲁棒性。
  问题三中,每个路口信号灯周期均可能发生变化,故本文使用贝叶斯变点检测对周期的变化点进行检验;然后将时序数据沿变化点进行分段,对分段后的每段时序数据使用加Manning窗的FFT算法求解周期,得到C1-C6路口的主要完整周期长度分别为[88,88,105,105,88,105],每个路口周期变化次数分别为[6,5,3,0,4,0]。
  问题四中,附件4给出的是某路口D所有方向的车辆轨迹数据,本文首先建立多方向汽车轨迹分解模型对该路口的车辆行驶方向进行分解,得到沿一个方向的所有车辆轨迹;再使用前文模型求解各个方向的周期,最后使用滑动窗口稳态检测对周期进行检验,得到路口所以方向完整红绿灯周期时长均为142s,且对向车道信号灯周期时间相同,符合现实红绿灯规律。

模型假设:

  1、假设每个路口在正常情况下,不会发生交通事故、堵车等意外情况,道路通行仅受红绿灯信号的影响;
  2、针对附件提供的数据,假设这些数据是真实可靠的,并且车辆在行驶过程中均遵守交通规则,因此可以直接基于这些数据进行计算分析;
  3、假设题目中给出的若干路口的红绿灯信号情况是相互独立的,即上一个路口的红绿灯状态不会对下一个路口的红绿灯信号产生任何影响。

问题分析:

  针对问题一,首先需要对车辆行车轨迹数据进行清洗,剔除异常值。这可以通过确实轨迹正方向、离群点检验、轨迹连续性检验等方式来识别异常点,并用通过差值进行替换,确保数据的连贯性。接下来,构建一系列反映车辆运行状态的指标,包括车辆运行状态、车辆速度、车辆加速度等。这些指标能够共同形成车辆状态的时序数据。最后,利用基于两阶段STFT的时频分析模型,可以对这些时序数据进行周期特征挖掘,得出车辆行驶的周期性规律。

  针对问题二,只有部分用户在使用该公司的产品,因此只能获取部分样本车辆的行车轨迹数据。而且,样本车辆比例的减少、车流量的减少以及存在定位误差等因素,都会对上述STFT预测模型的预测精度产生较大的影响。因此,本文在第一问的基础上结合DBSCAN聚类分析,通过聚类可以得到这一次红灯结束的时间到下一次红灯结束的时间,即为红绿灯完整周期时长或者周期时长的倍数,进而得到红绿灯完整周期得大致范围,从而对第一问中的两阶段STFT的时频分析模型进行修正。

  针对问题三,贝叶斯变点检测是一种用于发现时序数据中周期性变化点的有效方法。它建立在概率模型的基础之上,利用贝叶斯推断来识别数据序列中的变化点。具体而言,贝叶斯变点检测假设数据序列可以由不同的概率模型描述,每个模型对应于序列的一个状态。通过计算不同模型的后验概率,可以确定序列中最可能出现变化点的位置。与其他变点检测方法相比,贝叶斯变点检测不仅能够检测出变化的时间点,还可以量化变化的概率,从而更好地反映变化的程度和确定性。 因此本文使用贝叶斯变点检测检测出周期变化点,然后将时序数据沿变化点进行分段,对每段时序数据使用加manning窗的FFT算法求解周期,通过上述方式得到周期的变化时间点,然后对时间点分割,对分割后的数据采用前文模型,得到具体周期时间。

  针对问题四,问题四涉及某路口的全方位数据,我们可以将其拆分为前述问题的子问题。具体来说,先对该路口的车辆运行模式进行分解分析,然后应用前文提及的模型对各个方向进行周期性特征提取。接下来,可以利用改进的线性互相关算法对周期预估结果进行验证。通过这种方式,们可以将问题四转化为先前提出的问题类型,并继续采用前文介绍的分析方法进行求解。这样不仅避免重复阐述,也能充分利用前期的建模和分析思路。

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

在这里插入图片描述
在这里插入图片描述

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

部分程序代码:

import pandas as pd 
import matplotlib.pyplot as plt 
from scipy import stats 
import numpy as np 
filename = 'data/2/B5.csv' 
df = pd.read_csv(filename) 
#对df.x,df.y做散点图,并做离群点检测 
plt.figure(figsize=(8, 6)) 
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False 
#设置字体大小 
plt.rcParams['font.size'] = 14 
plt.scatter(df['x'], df['y'], label='车辆轨迹数据') 
plt.xlabel('x',fontsize = 16) 
plt.ylabel('y',fontsize = 16) 
plt.title('车辆轨迹散点图') 
###只放一部分return outlier_indices outlier_indices = detect_outliers(df['x'], df['y']) 
outliers = df.iloc[outlier_indices]
print(f"Outlier indices: {outlier_indices}") 
print(f"Number of outliers: {len(outlier_indices)}") 
print(outliers) 
#在图中画出异常点 
plt.figure(figsize=(8, 6)) 
plt.scatter(df['x'], df['y'], label='车辆轨迹数据') 
plt.scatter(outliers['x'], outliers['y'], color='red', label='异常点') 
plt.xlabel('x') 
plt.ylabel('y') 
plt.title('车辆轨迹散点图') 
plt.legend() 
plt.savefig('data2/img/B5_scatterDetect.png') 
plt.show() from statsmodels.tsa.seasonal import seasonal_decompose 
# 
#读取data中1中的A1.csv文件 
import pandas as pd 
import math 
import os 
import matplotlib.pyplot as plt 
import seaborn as sns 
import numpy as np 
import pandas as pd 2 df.loc[i[1].index,'x_y'] = df.loc[i[1].index,'x_y'].fillna(2) 
#对df中x_y列中的值大于0.5的行,添加一个标签,值为1,否则为0,列名为label 
) 
ts = data['count'] 
#探究ts的周期性 
decomposition = seasonal_decompose(ts,period=72, model="add") 
trend = decomposition.trend 
seasonal = decomposition.seasonal 
residual = decomposition.resid 
plt.plot(ts, label='Original') 
plt.legend(loc='best') 
plt.plot(trend, label='Trend') 
plt.legend(loc='best') 
plt.savefig('data2/img/D_trend.png',dpi=200) 
plt.show() import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
from statsmodels.graphics.tsaplots import plot_acf plt.legend() 
plt.show() # 自相关函数(ACF)分析 
plt.figure(figsize=(12, 4)) 
plot_acf(diff_data, lags=1, title="差分序列自相关函数(ACF)") 
plt.show() array = [ 134,  246,  398,  485,  685,  948, 1028, 1213, 1653, 1828, 2004, 2092, 2245, 2621, 2796, 2886, 3148, 3325, 3390, 3500, 3589, 3677, 3764, 3940, 4028, 4292, 4380, 4469, 4646, 4820, 4997, 5172, 5436, 5612, 5704, 5964, 6140, 6228, 6381, 6581, 6828, 7108, 7196] percentage_threshold = 8  # 百分比阈值 
pe = 88 
differences = [] 
previous_difference = array[1] - array[0] 
change_points = [] for i in range(2, len(array)): current_difference = array[i] - array[i - 1] rsample_freq = fftfreq(fft_series.size) pos_mask = np.where(sample_freq > 0) freqs = sample_freq[pos_mask] powers = power[pos_mask] top_k_seasons = 3 top_k_idxs = np.argpartition(powers, -top_k_seasons)[-top_k_seasons:] top_k_power = powers[top_k_idxs] fft_periods = (1 / freqs[top_k_idxs]).astype(int) print(f"top_k_power: {top_k_power}") print(f"fft_periods: {fft_periods}") NFFT = 256 TEMP = np.abs(np.fft.fft(ts.values, n=NFFT)) PSD = (TEMP[0:NFFT//2+1])**2 / NFFT frequencies = np.linspace(0, 0.78/2, NFFT//2+1)  # 单边频率轴,从0到采样率一半 periods = 1./frequencies  # 将频率转换为周期 fig, ax = plt.subplots() ax.semilogy(periods, PSD, linewidth=1.5)  # 使用对数尺度展示功率谱密度 #标出periods范围为50~100间的对应PSD的最大值点 max_index = np.argmax((periods >= 50) & (periods <= 100) & (PSD > 0))  # 需确保 PSD 大于 
0,避免选取到噪声 ax.scatter(periods[max_index], PSD[max_index], color='red', marker='o', label=f"最大PSD点对
应周期为: {periods[max_index]:.2f}") # print(periods[np.argmax(PSD)], PSD[np.argmax(PSD)]) # ax.scatter(periods[np.argmax(PSD)], PSD[np.argmax(PSD)], color='red', s=100) ax.set_xlabel('周期(秒)') ax.set_ylabel('PSD值') ax.grid(True) ax.legend() plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.savefig('data2/img/STFT.png',dpi=200) plt.show() from statsmodels.tsa.stattools import acf for lag in fft_periods: acf_score = acf(ts.values, nlags=lag)[-1] print(f"lag: {lag} fft acf: {acf_score}") expected_lags = np.array([30, 60, 90]).astype(int) for lag in expected_lags: acf_score = acf(ts.values, nlags=lag, fft=False)[-1] print(f"lag: {lag} expected acf: {acf_score}") pl = df print(pl.groupby('vehicle_id')['state'].sum().max(),pl.groupby('vehicle_id')['state'].sum().idxmax()) print(pl.groupby('vehicle_id')['state'].sum().nlargest(2).iloc[1],pl.groupby('vehicle_id')['state'].sum().nlargest(2).index[1]) print(pl.groupby('vehicle_id')['state'].sum().nlargest(3).mean()) sns.distplot(pl.groupby('vehicle_id')['state'].sum(),bins=20) 
STFT('data/4/D.csv') 
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字图像处理 实验三 数字图像的几何运算

一、实验目的 掌握图像的基本几何变换的方法 1. 图像的平移 2. 图像的旋转 二、实验环境 1. PC计算机 2. MatLab软件/语言包括图像处理工具箱(Image Processing Toolbox) 3. 实验所需要的图片 三、实验原理 提示&#xff1a;图片平移就是实现运算 四、实验图像 图片名称&a…

11.20[JAVAEXP3]重定向细究【DEBUG】

设置了根域名访问为testServlet,让他重定向到首页为test.jsp&#xff0c;事实上也都触发了&#xff0c;但是最后显示的为什么不是test.jsp生成页面&#xff0c;依然还是index.jsp生成的页面&#xff1f;&#xff1f; 重定向是通过Dispatcher进行的&#xff0c;而不是sendRedir…

大端存储和小端存储究竟是什么

数据存储方式 数据在计算机中表现为是0101的二进制形式,cpu在读取数据的时候需要从低地址向高地址读取 注意: 永远都是从低地址开始读取数据 低地址和高地址 内存地址空间&#xff1a; 计算机的内存被划分为一个连续的地址空间&#xff0c;这个空间从0开始&#xff0c;一直…

8. Debian系统中显示屏免密码自动登录

本文介绍如何在Debian系统上&#xff0c;启动后&#xff0c;自动免密登录&#xff0c;不卡在登录界面。 1. 修改lightDM配置文件 嵌入式Debian系统采用lightDM显示管理器&#xff0c;所以&#xff0c;一般需要修改它的配置文件/etc/lightdm/lightdm.conf&#xff0c;找到[Seat…

三菱伺服JET产品线(选型说明)

伺服放大器功能提升 伺服放大器MELSERVO-JET系列为进一步优化了独家控制引擎的高性能伺服放大器。 可通过与支持CC-LinK IE TSN的运动控制器的同步通信,进行高 速、高精度的运动控制。 除了旋转型伺服电机以外,还支持线性伺服电机。MR-JET-G-N1支持EtherCAT。 旋转型伺服电机 …

关于Chrome自动同步书签的解决办法

前言 并不一定适用所有用户&#xff0c; 目前我在网上搜集了一些资料&#xff0c;也做了一些尝试。 就我个人总结的经验来讲&#xff0c;分享大家以下几种办法&#xff1a; 1.书签同步插件 点击如下&#x1f517;&#xff1a; Chrome书签同步https://bm.famend.cn/ …

基于elementui的远程搜索下拉选择分页组件

在开发一个练手项目的时候&#xff0c;需要一个远程搜索的下拉选择组件&#xff1b; elementui自带的el-select支持远程搜索&#xff1b;但如果一次性查询的数据过多&#xff1b;会导致卡顿。故自己实现一个可分页的远程下拉选择组件 效果&#xff1a; 代码&#xff1a; <…

告别充电焦虑:移动充电机器人的革命性解决方案

移动充电机器人作为新能源汽车领域的黑科技&#xff0c;正逐渐崭露头角。它的出现为电动汽车充电带来了全新的解决方案&#xff0c;解决了传统充电方式的诸多痛点。 新能源汽车具有诸多优点&#xff0c;如科技含量高、噪音小、使用成本低等&#xff0c;但 “续航焦虑”“充电焦…

Socket 编程预备

目录 理解源 IP 地址和目的 IP 地址 认识端口号 端口号范围划分 理解 "端口号" 和 "进程 ID" 理解源端口号和目的端口号 理解 socket 传输层的典型代表 认识 TCP 协议 认识 UDP 协议 网络字节序 socket 编程接口 socket 常见 API sock…

17. Threejs案例-Three.js创建多个立方体

17. Threejs案例-Three.js创建多个立方体 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 WebGL 场景的核心类。它负责将场景中的对象渲染到画布上。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选…

实例教程:BBDB为AHRS算法开发提供完善的支撑环境(下)

4. BBDB基础上为算法实现提供支撑方式二&#xff1a;算法层实现 第2节内容当中讲述在应用层实现AHRS的步骤&#xff0c;这种方法优点在于实现方法比较简单明了。但是缺点在于程序代码的组织算不上很好&#xff0c;AHRS算法代码与PH47框架代码间存在一定的耦合度&#xff0c;会…

Android开发,使用ViewPager2实现自动轮播图

文章目录 1. build.gradle添加依赖&#xff1a;2. AndroidManifest.xml中添加网络访问权限3. 编写 布局文件4. 编写Banner适配器5. 自定义Banner视图6. 定义圆点指示器的drawable资源7. 在需要使用轮播图中的Activity中使用8. 运行效果图9. 视频教程 在Android项目程序设计中&a…

企业网双核心交换机实现冗余和负载均衡(MSTP+VRRP)

MSTP&#xff08;多生成树协议&#xff09; 通过创建多个VLAN实例&#xff0c;将原有的STP、RSTP升级&#xff0c;避免单一VLAN阻塞后导致带宽的浪费&#xff0c;通过将VLAN数据与实例绑定&#xff0c;有效提升网络速率。 VRRP&#xff08;虚拟路由冗余协议&#xff09; 用…

Socket编程-tcp

1. 前言 在tcp套接字编程这里&#xff0c;我们将完成两份代码&#xff0c;一份是基于tcp实现普通的对话&#xff0c;另一份加上业务&#xff0c;client输入要执行的命令&#xff0c;server将执行结果返回给client 2. tcp_echo_server 与udp类似&#xff0c;前两步&#xff1…

15分钟训练数字人MimicTalk

只需15分钟&#xff0c;就能训练高质量&#xff0c;个性化数字人大模型。由浙江大学与字节跳动联合推出MimicTalk算法&#xff0c;目前已开源。 在外表和说话风格上和真人相似。将通用3D数字人大模型适应到单个目标人&#xff0c;采用动静结合的高效微调方案&#xff0…

【kettle】mysql数据抽取至kafka/消费kafka数据存入mysql

目录 一、mysql数据抽取至kafka1、表输入2、json output3、kafka producer4、启动转换&#xff0c;查看是否可以消费 二、消费kafka数据存入mysql1、Kafka consumer2、Get records from stream3、字段选择4、JSON input5、表输出 一、mysql数据抽取至kafka 1、表输入 点击新建…

在 MacOS 上为 LM Studio 更换镜像源

在 MacOS 之中使用 LM Studio 部署本地 LLM时&#xff0c;用户可能会遇到无法下载模型的问题。 一般的解决方法是在 huggingface.co 或者国内的镜像站 hf-mirror.com 的项目介绍卡页面下载模型后拖入 LM Studio 的模型文件夹。这样无法利用 LM Studio 本身的搜索功能。 本文将…

vue中.sync修饰符的用法

一、什么是.sync修饰符 在Vue.js中&#xff0c;.sync 修饰符用于创建一个双向绑定的 prop。它使子组件能够更新父组件的 prop 值&#xff0c;实现父子组件之间的双向数据同步。具体来说&#xff0c;.sync 修饰符主要有以下几个功能&#xff1a; 简化双向绑定&#xff1a; 使用…

【附源码】基于环信鸿蒙IM SDK实现一个聊天Demo

项目背景 本项目基于环信IM 鸿蒙SDK 打造的鸿蒙IM Demo&#xff0c;完全适配HarmonyOS NEXT系统&#xff0c;实现了发送消息&#xff0c;添加好友等基础功能。代码开源&#xff0c;功能简洁&#xff0c;如果您有类似开发需求可以参考。 源码地址&#xff1a;https://github.c…

SHELL----正则表达式

一、文本搜索工具——grep grep -参数 条件 文件名 其中参数有以下&#xff1a; -i 忽略大小写 -c 统计匹配的行数 -v 取反&#xff0c;不显示匹配的行 -w 匹配单词 -E 等价于 egrep &#xff0c;即启用扩展正则表达式 -n 显示行号 -rl 将指定目录内的文件打…