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,一经查实,立即删除!

相关文章

Flink集群搭建整合Yarn运行

Flink 集群 1. 服务器规划 服务器h1、h4、h5 2. StandAlone 模式&#xff08;不推荐&#xff09; 2.1 会话模式 在h1操作 #1、解压 tar -zxvf flink-1.19.1-bin-scala_2.12.tgz -C /app/#2、修改配置文件 cd /app/flink-1.19.1/conf vim conf.yaml ##内容&#xff1a;## j…

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

一、实验目的 掌握图像的基本几何变换的方法 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…

金融数学在股市交易中的具体应用

### 1. 风险管理 - **VaR&#xff08;在险价值&#xff09;**: VaR是衡量投资组合潜在损失的指标。例如&#xff0c;如果一个投资组合的VaR为100万元&#xff0c;置信水平为95%&#xff0c;这意味着在未来的一个交易日内&#xff0c;有95%的可能性该投资组合的损失不会超过100…

c#中context.SaveChanges()方法

跟踪实体的状态&#xff1a; Entity Framework 使用 Change Tracker 来跟踪上下文中所有实体的状态。实体的状态可以是&#xff1a; Added&#xff1a;新添加的实体&#xff08;即将插入到数据库中&#xff09;。Modified&#xff1a;已修改的实体&#xff08;即将更新数据库中…

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

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

ORACLE之DBA常用数据库查询

数据库信息 数据库概要select a.name "DB Name", e.global_name "Global Name", c.host_name "Host Name", c.instance_name "Instance Name" , DECODE(c.logins,RESTRICTED,YES,NO) "Restricted Mo…

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

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

docker 架构详解

Docker架构是基于客户端-服务器&#xff08;C/S&#xff09;模式的&#xff0c;包含多个关键组件&#xff0c;以确保容器化应用的高效构建、管理和运行。以下是对Docker架构的详细解析&#xff1a; Docker 架构概述 Docker 架构采用客户端-服务器&#xff08;C/S&#xff09;…

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

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

【sqlserver】mssql 批量加载数据文件 bulk copy使用

参考文章&#xff1a; Using bulk copy with the JDBC driver SqlServer数据批量写入 SqlServer批量插入数据方法–SqlBulkCopy sqlserver buld copy需要提供&#xff0c;数据文件的对应表的元数据信息主要的字段的位置、字段的名称、字段的数据类型。 执行bulk load时候不一…

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

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

如何选择一款合适的网络变压器

选择合适的网络变压器需要考虑以下几个关键因素&#xff1a; 1. 传输速率&#xff1a;首先&#xff0c;您需要确定所需的传输速率&#xff0c;这通常取决于您的网络应用和设备。例如&#xff0c;如果您正在使用或计划使用10Mbps、100Mbps、1Gbps、10Gbps等不同速率的网络设备&…

基于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;会…

数字证书实现oauth2.0与token去中心化的解耦

鉴权服务oauth2.0的既要还要的痛点 鉴权服务手撸&#xff1f;不可能&#xff0c;上spring security&#xff01; 感觉还不够&#xff1f;再叠加oauth2.0&#xff01; 鉴权太重&#xff1f;换用分布式token&#xff01; 既然分布式了&#xff0c;是不是可以不用鉴权中心&#xf…

鸿蒙Next学习-监听指定页面显示/页面生命周期

自定义组件监听页面生命周期 使用无感监听页面路由的能力&#xff0c;能够实现在自定义组件中监听页面的生命周期。 // Index.ets import { uiObserver, router, UIObserver } from kit.ArkUI;Entry Component struct Index {listener: (info: uiObserver.RouterPageInfo) &g…