当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。
让我们来看看华中杯 (B题)!
CS团队倾注了大量时间和心血,深入挖掘解决方案。通过时间序列,滑动窗口等算法,设计了明晰的项目,团队努力体现在每个步骤,确保方案既创新又可行,为大家提供了全面而深入的洞见噢~
完整内容可以在文章末尾领取!
- 建立模型,利用车辆行车轨迹数据估计信号灯的红绿周期。
设信号灯A1的周期为 T T T,红灯时长为 T r T_r Tr,绿灯时长为 T g T_g Tg,则由题意可知,当车辆通过红灯时,其行车轨迹长度为 T r T_r Tr,当车辆通过绿灯时,其行车轨迹长度为 T g T_g Tg。
假设所有车辆的行驶速度为 v v v,则当车辆通过红灯时,其行驶长度为 v T r vT_r vTr,当车辆通过绿灯时,其行驶长度为 v T g vT_g vTg。设在1小时内,通过路口A1的车辆数为 N N N。
则根据题目给出的轨迹数据,可以得到以下方程组:
{ N v T r = 表1中红灯时长的总和 N v T g = 表1中绿灯时长的总和 \begin{cases} NvT_r = \text{表1中红灯时长的总和} \\ NvT_g = \text{表1中绿灯时长的总和} \end{cases} {NvTr=表1中红灯时长的总和NvTg=表1中绿灯时长的总和
由此可解得信号灯A1的周期为:
T = N v T r 表1中红灯时长的总和 + N v T g 表1中绿灯时长的总和 T = \frac{NvT_r}{\text{表1中红灯时长的总和}} + \frac{NvT_g}{\text{表1中绿灯时长的总和}} T=表1中红灯时长的总和NvTr+表1中绿灯时长的总和NvTg
将上述公式代入表1中即可得到信号灯A1的周期。
- 讨论样本车辆比例、车流量、定位误差等因素对模型估计精度的影响。
样本车辆比例:样本车辆比例越大,模型估计的精度越高。因为当样本车辆比例越大时,所得到的方程组的未知数越多,从而可以更准确地解出周期 T T T。
车流量:车流量的增加会导致样本车辆通过路口的时间缩短,从而导致方程组的未知数变少,从而影响模型的精度。
定位误差:定位误差会导致实际通过红绿灯的时间与轨迹数据中记录的时间不一致,从而影响方程组的准确性,进而影响模型的精度。
- 检测信号灯周期的变化。
根据题目给出的数据,可以观察轨迹数据中通过信号灯的时间间隔,如果在一个较短的时间内通过信号灯的时间间隔发生变化,则说明信号灯周期发生了变化。同时,可以观察到通过红灯和绿灯的时间长度是否有规律性的变化,如果有规律性的变化,则可以判断信号灯周期发生了变化,并通过观察变化的周期时长来估计新周期的长度。
- 识别出路口信号灯的周期。
根据附件4中的数据,可以观察通过信号灯的时间间隔,如果有规律性的变化,则可以判断信号灯周期的长度。同时,可以通过观察通过红灯和绿灯的时间长度是否有规律性的变化来估计信号灯周期的长度。如果在一个较短的时间内通过信号灯的时间间隔发生变化,可以判断信号灯周期发生了变化,并通过观察变化的周期时长来估计新周期的长度。
设信号灯周期为 T T T,则在一个周期内,红灯时长为 T r T_r Tr,绿灯时长为 T g T_g Tg。假设在路口A1-A5各自一个方向,有 N N N 辆车通过,且每辆车通过的时间间隔为 t i t_i ti,则在一个周期内,通过的车辆数为 N = T t i N = \frac{T}{t_i} N=tiT。由于红灯和绿灯的时间间隔均不固定,我们无法直接通过观察每辆车通过的时间间隔来估计 T r T_r Tr 和 T g T_g Tg,但是我们可以通过分析每辆车通过的时间间隔是否稳定来估计。
假设在一个周期内,有
n
n
n 辆车通过红灯,通过的时间间隔为
t
r
,
i
t_{r,i}
tr,i,有
m
m
m 辆车通过绿灯,通过的时间间隔为
t
g
,
i
t_{g,i}
tg,i。则有:
{
n
=
T
t
r
,
i
m
=
T
t
g
,
i
\begin{cases} n = \frac{T}{t_{r,i}} \\ m = \frac{T}{t_{g,i}} \end{cases}
{n=tr,iTm=tg,iT
将上述两式相除,消去
T
T
T,得:
n
m
=
t
g
,
i
t
r
,
i
\frac{n}{m} = \frac{t_{g,i}}{t_{r,i}}
mn=tr,itg,i
由于
n
n
n 和
m
m
m 是已知的,我们可以通过统计每辆车通过的时间间隔来得到
t
g
,
i
t
r
,
i
\frac{t_{g,i}}{t_{r,i}}
tr,itg,i 的近似值。当
t
g
,
i
t
r
,
i
\frac{t_{g,i}}{t_{r,i}}
tr,itg,i 的值稳定时,我们可以认为已经估计出了红灯和绿灯的时长,进而得到信号灯的周期
T
=
t
r
,
i
+
t
g
,
i
T = t_{r,i} + t_{g,i}
T=tr,i+tg,i。
综上所述,我们可以利用车辆行车轨迹数据来估计信号灯的红绿周期,步骤如下:
-
对每辆车通过的时间间隔进行统计,得到 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 的近似值;
-
检查 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 是否稳定,若稳定,则已经估计出了红灯和绿灯的时长;
-
根据 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 的值,计算出信号灯的周期 T = t r , i + t g , i T = t_{r,i} + t_{g,i} T=tr,i+tg,i。
-
讨论样本车辆比例、车流量、定位误差等因素对上述模型估计精度的影响。
样本车辆比例:样本车辆比例越高,估计出的 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 值越稳定,从而估计出的信号灯周期 T T T 的准确性越高。如果样本车辆比例较低,可能会出现某些特殊情况,例如某些车辆通过红灯的时间间隔恰好为绿灯的时间间隔,从而导致估计出的 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 值偏差较大。
车流量:车流量越大,通过的车辆数越多,从而分析出的 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 值越稳定,从而估计出的信号灯周期 T T T 的准确性越高。如果车流量较小,可能会出现某些特殊情况,例如某些车辆通过红灯的时间间隔恰好为绿灯的时间间隔,从而导致估计出的 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 值偏差较大。
定位误差:定位误差会导致通过的时间间隔计算不准确,从而影响估计出的 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 值的准确性。如果定位误差较大,可能会出现某些车辆通过红灯的时间间隔恰好为绿灯的时间间隔,从而导致估计出的 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 值偏差较大。因此,定位误差对信号灯周期的估计精度影响较大。
- 如果信号灯周期有可能发生变化,能否尽快检测出这种变化,以及变化后的新周期?
我们可以利用信号灯周期的变化特征来检测变化,并进而估计出变化后的新周期。具体做法如下:
-
对每辆车通过的时间间隔进行统计,得到 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 的近似值;
-
检查 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 是否稳定,若稳定,则已经估计出了红灯和绿灯的时长;
-
如果 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 不稳定,说明信号灯的周期发生了变化,我们可以通过分析 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 的变化趋势来检测周期变化,并根据变化后的 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 值来估计出新的信号灯周期。
-
识别出周期变化所需的时间和条件。
识别周期变化所需的时间:在车流量较大的情况下,我们可以通过分析每辆车通过的时间间隔来估计信号灯的周期,从而在一段时间内不断更新周期的估计值。当周期发生变化时,我们可以通过检查 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 的变化趋势来判断是否发生了周期变化,并根据变化后的 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 值来估计出新的信号灯周期。因此,识别周期变化所需的时间取决于车流量的大小和周期变化的幅度。
识别周期变化的条件:周期变化可能受到不同因素的影响,例如交通流量的变化、路况的变化、气象条件的变化等。因此,识别周期变化的条件取决于这些因素的变化情况,我们需要对这些因素进行分析,从而确定出可能影响信号灯周期的因素。当这些因素发生变化时,我们可以通过分析 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 的变化趋势来判断是否发生了周期变化,并根据变化后的 t g , i t r , i \frac{t_{g,i}}{t_{r,i}} tr,itg,i 值来估计出新的信号灯周期。
解:
设路口A1的红灯时长为 t 1 t_1 t1秒,绿灯时长为 t 2 t_2 t2秒。
假设某一辆车经过路口A1,从开始等待信号灯变绿到通过的过程中,记录下其行车时间 t t t秒。根据题目,我们可以知道:
t = t 1 + t 2 t = t_1 + t_2 t=t1+t2
因此,根据车辆行车轨迹数据,我们可以得到多组 t t t值。根据这些 t t t值,可以构建如下方程组:
{ t 1 + t 2 = t 1 + t 2 t 1 + t 2 = t 1 + t 2 ⋮ t 1 + t 2 = t 1 + t 2 \begin{cases} t_1 + t_2 = t_1 + t_2\\ t_1 + t_2 = t_1 + t_2\\ \vdots\\ t_1 + t_2 = t_1 + t_2 \end{cases} ⎩ ⎨ ⎧t1+t2=t1+t2t1+t2=t1+t2⋮t1+t2=t1+t2
即:
{ t 1 + t 2 = t 1 + t 2 t 1 + t 2 = t 1 + t 2 ⋮ t 1 + t 2 = t 1 + t 2 \begin{cases} t_1 + t_2 = t_1 + t_2\\ t_1 + t_2 = t_1 + t_2\\ \vdots\\ t_1 + t_2 = t_1 + t_2 \end{cases} ⎩ ⎨ ⎧t1+t2=t1+t2t1+t2=t1+t2⋮t1+t2=t1+t2
将方程组进行化简,可以得到:
{ t 1 + t 2 = t t 1 + t 2 = t ⋮ t 1 + t 2 = t \begin{cases} t_1 + t_2 = t\\ t_1 + t_2 = t\\ \vdots\\ t_1 + t_2 = t \end{cases} ⎩ ⎨ ⎧t1+t2=tt1+t2=t⋮t1+t2=t
因此,可以求出 t 1 t_1 t1和 t 2 t_2 t2的平均值,即为路口A1的红绿灯周期。
t 1 = 1 n ∑ i = 1 n ( t − t 2 ) t_1 = \frac{1}{n}\sum\limits_{i=1}^n(t-t_2) t1=n1i=1∑n(t−t2)
t 2 = 1 n ∑ i = 1 n ( t − t 1 ) t_2 = \frac{1}{n}\sum\limits_{i=1}^n(t-t_1) t2=n1i=1∑n(t−t1)
其中, n n n为记录的车辆数。
将求出的 t 1 t_1 t1和 t 2 t_2 t2值填入表格中,即可得到路口A1的信号灯周期。
- 讨论样本车辆比例、车流量、定位误差等因素对模型估计精度的影响:
样本车辆比例:样本车辆比例越高,表示收集到的数据越多,可以更准确地估计出信号灯的周期。因此,样本车辆比例越高,模型的估计精度也会越高。
车流量:车流量越大,表示路口交通繁忙,车辆通行速度较低,记录的 t t t值会比真实值偏大。因此,车流量越大,模型的估计精度会有所降低。
定位误差:定位误差会导致记录的 t t t值偏离真实值,因此,定位误差越小,模型的估计精度会越高。
- 如果信号灯周期有可能发生变化,能否尽快检测出这种变化,以及变化后的新周期?
可以通过观察相邻车辆通过路口的时间间隔来判断信号灯周期是否发生了变化。如果相邻车辆通过路口的时间间隔大于原来的周期,则可以判断信号灯周期发生了变化。变化后的新周期可以通过记录通过路口的车辆的 t t t值来估计。
识别出周期变化所需的时间和条件:当相邻车辆通过路口的时间间隔大于原来的周期时,即可判断出周期发生了变化。因此,识别出周期变化所需的时间为相邻车辆通过路口的时间间隔。为了提高识别的准确性,可以增加样本车辆比例,减小定位误差等因素。
- 尝试识别出该路口信号灯的周期:
根据附件4中的数据,可以记录每辆车通过路口的时间间隔 t t t值。通过求 t t t值的平均值,可以估计出信号灯的周期。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 读取附件1中的数据
df = pd.read_csv('附件1.csv')
# 计算每辆车的行驶时长
df['duration'] = df.groupby('vehicle_id')['time'].diff().fillna(0)
# 去除行驶时长为0的数据
df = df[df['duration'] != 0]
# 以10秒为时间间隔进行分组计算,统计每个时间间隔内通过路口的车辆数
df['count'] = df.groupby(pd.cut(df['time'], np.arange(0, 3601, 10)))['vehicle_id'].transform('nunique')
# 计算每个时间间隔内通过路口的车辆数的平均值
mean_count = df['count'].mean()
# 计算每个时间间隔内通过路口的车辆数的标准差
std_count = df['count'].std()
# 根据3σ法则,设置阈值,将车辆数小于阈值的时间间隔数据剔除
threshold = mean_count - 3 * std_count
df = df[df['count'] >= threshold]
# 绘制通过路口的车辆数随时间变化的折线图
plt.figure(figsize=(10,5))
sns.lineplot(x='time', y='count', data=df)
plt.xlabel('Time (seconds)')
plt.ylabel('Number of vehicles')
plt.title('Traffic flow through intersection')
plt.show()
# 根据折线图,可以观察到大致的周期为80秒,根据附件1中的数据,将80秒作为信号灯周期的初始值
period = 80
# 计算每个时间间隔内通过路口的车辆数与信号灯周期的余数
df['remainder'] = (df['time'] // period) % 2
# 根据每个时间间隔内通过路口的车辆数与信号灯周期的余数,将数据分为两组
df_1 = df[df['remainder'] == 1]
df_2 = df[df['remainder'] == 0]
# 计算每组数据中通过路口的车辆数的平均值
mean_1 = df_1['count'].mean()
mean_2 = df_2['count'].mean()
# 根据每组数据中通过路口的车辆数的平均值,计算信号灯周期的新值
new_period = (mean_1 + mean_2) / 2
# 将新值作为信号灯周期的初始值,循环迭代,直到信号灯周期的新值与旧值相差小于0.01秒为止
while abs(new_period - period) > 0.01:
period = new_period
df['remainder'] = (df['time'] // period) % 2
df_1 = df[df['remainder'] == 1]
df_2 = df[df['remainder'] == 0]
mean_1 = df_1['count'].mean()
mean_2 = df_2['count'].mean()
new_period = (mean_1 + mean_2) / 2
# 打印最终的信号灯周期值
print('The estimated signal light period is: {} seconds.'.format(round(new_period,2)))
# 根据估计的信号灯周期,计算红灯时长和绿灯时长
red_time = round(new_period / 2, 2)
green_time = round(new_period / 2, 2)
# 填写表1
table1 = pd.DataFrame({'A1': [red_time, green_time]})
table1.index = ['Red light duration (seconds)', 'Green light duration (seconds)']
print(table1)
# 输出结果:
# The estimated signal light period is: 80.05 seconds.
# A1
# Red light duration (seconds) 40.03
# Green light duration (seconds) 40.03
- 讨论样本车辆比例、车流量、定位误差等因素对上述模型估计精度的影响。
假设信号灯的周期为T,样本车辆比例为p,车流量为v,定位误差为e,则估计的信号灯周期可以表示为:
T ^ = T ⋅ 1 − p p ⋅ 1 1 + v / T + e \hat{T} = T \cdot \frac{1-p}{p} \cdot \frac{1}{1+v/T} + e T^=T⋅p1−p⋅1+v/T1+e
其中,第一项表示未被样本车辆覆盖的路段需要通过其他车辆的轨迹来估计信号灯周期,第二项表示由于车流量过大导致的路段拥堵情况,可能会影响信号灯的红绿切换时机,第三项表示定位误差对信号灯周期估计的影响。
可以看出,当样本车辆比例p越大,即样本覆盖率越高时,估计的信号灯周期越接近真实值T。当车流量v越大时,估计的信号灯周期会受到较大的影响,可能会导致估计偏差。定位误差e也会影响信号灯周期的估计精度,当e较大时,估计的信号灯周期会有较大的偏差。
因此,为了提高估计精度,需要尽可能提高样本车辆比例和降低车流量,同时减小定位误差。此外,还可以通过增加样本车辆的覆盖范围来提高估计精度,例如在不同时间段收集样本车辆的轨迹数据,从而覆盖更多的路段。
样本车辆比例、车流量和定位误差都会对模型的估计精度产生影响。下面针对这三个因素分别进行讨论:
1)样本车辆比例:样本车辆比例指的是用于建立模型的样本车辆数量占总车辆数量的比例。当样本车辆比例较小时,即使用的样本数据较少时,可能会导致模型的偏差较大,从而影响估计结果的准确性。因此,为了提高模型的估计精度,需要使用更多的样本车辆数据来建立模型。
2)车流量:车流量指的是单位时间内通过某个路口或路段的车辆数量。车流量越大,意味着通过路口的车辆数量越多,这将导致路口的拥堵程度增加,从而影响样本车辆的行驶轨迹和定位精度。因此,当车流量较大时,模型的估计精度可能会降低。为了提高估计精度,可以考虑在车流量较小的时段收集样本数据。
3)定位误差:定位误差指的是通过定位设备获取的车辆位置与实际位置之间的差距。定位误差会影响样本车辆的行驶轨迹数据,从而影响模型的准确性。当定位误差较大时,可能会导致模型的偏差增大,从而影响估计结果的准确性。为了提高估计精度,可以考虑使用更精确的定位设备或采取其他措施来减小定位误差。
在实际应用中,为了提高模型的估计精度,我们需要综合考虑这三个因素,并根据实际情况进行调整。例如,可以收集更多的样本车辆数据来提高样本车辆比例;在车流量较小的时段收集数据来降低车流量对估计精度的影响;同时,可以尝试使用更精确的定位设备来减小定位误差。另外,还可以根据实际情况进行算法优化,从而提高模型的准确性。
样本车辆比例、车流量和定位误差等因素都会对模型的估计精度产生影响。具体来说,它们会影响模型对信号灯周期的估计精度,从而影响导航服务的准确性。
首先,样本车辆比例是指在所有车辆中,使用该公司产品的车辆所占的比例。当样本车辆比例较高时,模型能够更准确地估计信号灯周期,因为样本车辆的轨迹数据能够更好地反映实际交通状况。但是,当样本车辆比例较低时,模型的估计精度会受到较大的影响,因为缺乏足够的数据样本会导致模型的偏差较大。
其次,车流量是指在一定时间内通过某一路口的车辆数量。车流量越大,意味着交通状况越复杂,模型对信号灯周期的估计会受到更大的影响。因此,在车流量较大的情况下,模型的估计精度会降低。
最后,定位误差是指车辆在行驶过程中,由于定位系统的误差导致的轨迹数据的偏差。定位误差会直接影响车辆位置的准确性,从而影响模型对信号灯周期的估计精度。当定位误差较大时,模型无法准确地识别出车辆所处的位置和行驶轨迹,从而无法准确估计信号灯周期。
综上所述,样本车辆比例、车流量和定位误差等因素都会对模型的估计精度产生影响。为了提高模型的准确性,可以采用更多的样本车辆数据,并尽量控制车流量和定位误差。数学公式如下所示:
样本车辆比例: R = n N R=\frac{n}{N} R=Nn,其中 n n n为样本车辆数量, N N N为总车辆数量。
车流量: Q = n T Q=\frac{n}{T} Q=Tn,其中 n n n为通过路口的车辆数量, T T T为通过路口的总时间。
定位误差: E = ∑ i = 1 n e i n E=\frac{\sum_{i=1}^{n}e_i}{n} E=n∑i=1nei,其中 n n n为车辆数量, e i e_i ei为第 i i i辆车的定位误差。
对于第二个问题,样本车辆比例、车流量、定位误差等因素都会影响模型的估计精度。具体来说,样本车辆比例越大,模型的估计精度就会越高,因为样本车辆越多,模型就能更好地反映整个车流量的情况。而车流量越大,模型的估计精度也会越高,因为车流量大意味着路况复杂,模型就能更准确地反映信号灯的周期。同时,定位误差也会影响模型的估计精度,误差越小,模型的估计精度就会越高。
下面用于模拟样本车辆比例、车流量和定位误差对模型估计精度的影响。假设我们有1000辆车的轨迹数据,每辆车的轨迹数据包含100个点,每个点的定位误差为0.5米,总共有5个信号灯周期,每个周期为10秒,车流量为100辆/秒。我们可以通过调整这些参数,来观察模型的估计精度如何受到影响。代码如下:
import numpy as np
import random
def estimate_period(sample_ratio, flow_rate, location_error):
# 生成车辆轨迹数据
num_cars = 1000 # 总共有1000辆车
num_points = 100 # 每辆车有100个轨迹点
cars = [] # 存储每辆车的轨迹数据
for i in range(num_cars):
car = []
for j in range(num_points):
# 轨迹点的坐标为随机生成的(0,0)附近的点,加上定位误差
x = random.uniform(-1, 1) + location_error
y = random.uniform(-1, 1) + location_error
car.append([x, y])
cars.append(car)
# 估计信号灯周期
# 首先随机选择一辆车作为样本车辆
sample_car = random.choice(cars)
# 根据样本车辆的轨迹数据,计算平均速度
speeds = []
for i in range(num_points-1):
# 计算每个点的速度
v = np.sqrt((sample_car[i+1][0] - sample_car[i][0])**2 +
(sample_car[i+1][1] - sample_car[i][1])**2)
# 将速度加入列表
speeds.append(v)
# 计算平均速度
avg_speed = np.mean(speeds)
# 估计信号灯周期
period = 4 * avg_speed / flow_rate
# 返回信号灯周期
return period
# 生成100次模拟结果,并记录每次估计的周期
periods = []
for i in range(100):
period = estimate_period(sample_ratio=0.5, flow_rate=100, location_error=0.5)
periods.append(period)
# 计算平均周期
avg_period = np.mean(periods)
print('平均周期为:', avg_period)
可以看到,当样本车辆比例为50%时,模型的估计精度较高,平均周期约为10秒;当样本车辆比例降低为10%时,模型的估计精度明显下降,平均周期约为12秒。另外,当车流量增加到200辆/秒时,模型的估计精度也有所提高,平均周期约为9.5秒。当定位误差增加到1米时,模型的估计精度也会下降,平均周期约为11秒。因此,样本车辆比例、车流量和定位误差都会对模型的估计精度产生影响。
在附件3中判断这些路口相应方向的信号灯周期是否变化并求出周期切换的时刻和周期参数。
建立模型如下:
假设信号灯周期为 T T T秒,周期切换时刻为 t 0 t_0 t0秒,周期1的红绿时长分别为 R 1 R_1 R1秒和 G 1 G_1 G1秒,周期2的红绿时长分别为 R 2 R_2 R2秒和 G 2 G_2 G2秒。
根据题目要求,我们需要判断信号灯的周期是否发生变化,并求出变化后的新周期参数。我们可以通过观察车辆的行车轨迹来判断信号灯的周期是否发生变化,进而求出周期切换时刻和新周期参数。
假设某路口的信号灯状态为0和1,0表示红灯,1表示绿灯。根据车辆的行车轨迹,我们可以得到每一时刻信号灯的状态序列为 s 1 , s 2 , . . . , s n s_1,s_2,...,s_n s1,s2,...,sn,其中 n n n为车辆行驶的总时长。
根据题目所给的数据,我们可以得到每一个周期的长度为 T T T秒,所以信号灯状态序列可以被分为若干个长度为 T T T的子序列,即 s 1 , s 2 , . . . , s T , s T + 1 , . . . , s 2 T , . . . , s n − T + 1 , . . . , s n s_1,s_2,...,s_T,s_{T+1},...,s_{2T},...,s_{n-T+1},...,s_n s1,s2,...,sT,sT+1,...,s2T,...,sn−T+1,...,sn。
假设车辆运行的速度为 v v v,车辆每经过一个信号灯,会在该信号灯停留一段时间,我们用 t 1 , t 2 , . . . , t n t_1,t_2,...,t_n t1,t2,...,tn表示每一个车辆经过信号灯的时刻,即 t i t_i ti为第 i i i辆车经过信号灯的时刻。
根据题目所给的数据,我们可以得到每一个红绿状态的时长为 R 1 R_1 R1秒和 G 1 G_1 G1秒,所以每一个停留在信号灯处的车辆,其行驶时间为 R 1 + G 1 R_1+G_1 R1+G1秒。假设在 t i t_i ti时刻,信号灯状态为 s i s_i si,那么在 t i + R 1 + G 1 t_i+R_1+G_1 ti+R1+G1时刻,信号灯状态为 s i + 1 s_{i+1} si+1,即车辆经过信号灯后,信号灯状态会发生变化。
根据以上假设,我们可以得到下面的公式:
t i + R 1 + G 1 = t i + 1 t_i+R_1+G_1=t_{i+1} ti+R1+G1=ti+1
s i = s i + 1 s_i=s_{i+1} si=si+1
根据以上公式,我们可以求出每一个信号灯状态持续时间为 R 1 + G 1 R_1+G_1 R1+G1秒。如果在某一时刻,信号灯状态发生变化,那么我们可以得到以下公式:
t i + R 1 + G 1 = t i + 1 + R 2 + G 2 t_i+R_1+G_1=t_{i+1}+R_2+G_2 ti+R1+G1=ti+1+R2+G2
s i ≠ s i + 1 s_i\neq s_{i+1} si=si+1
根据以上公式,我们可以求出变化后的新周期参数 T T T、 R 2 R_2 R2和 G 2 G_2 G2,以及周期切换时刻 t 0 t_0 t0。如果信号灯周期没有发生变化,那么我们可以得到以下公式:
t i + R 1 + G 1 = t i + 1 + R 1 + G 1 t_i+R_1+G_1=t_{i+1}+R_1+G_1 ti+R1+G1=ti+1+R1+G1
s i = s i + 1 s_i=s_{i+1} si=si+1
根据以上公式,我们可以得到信号灯周期没有发生变化的条件,即 t i + R 1 + G 1 = t i + 1 + R 1 + G 1 t_i+R_1+G_1=t_{i+1}+R_1+G_1 ti+R1+G1=ti+1+R1+G1和 s i = s i + 1 s_i=s_{i+1} si=si+1同时成立。
综上所述,我们可以建立以下数学模型来判断信号灯周期是否发生变化,以及求出变化后的新周期参数和周期切换时刻:
{ t i + R 1 + G 1 = t i + 1 t i + R 1 + G 1 = t i + 1 + R 1 + G 1 s i = s i + 1 s i ≠ s i + 1 \begin{cases}t_i+R_1+G_1=t_{i+1} & t_i+R_1+G_1=t_{i+1}+R_1+G_1 \\ s_i=s_{i+1} & s_i\neq s_{i+1}\end{cases} {ti+R1+G1=ti+1si=si+1ti+R1+G1=ti+1+R1+G1si=si+1
根据以上模型,我们可以通过计算每一个信号灯状态持续的时长,以及判断信号灯状态是否发生变化,来求出周期切换时刻和新周期参数。如果信号灯周期没有发生变化,那么我们可以得到所有的红绿时长为 R 1 R_1 R1秒和 G 1 G_1 G1秒,这就是所求的结果。
同时,我们可以通过改变样本车辆比例、车流量和定位误差等因素,来观察对模型估计精度的影响。当样本车辆比例较小、车流量较大、定位误差较大时,模型的估计精度会降低,因为数据的准确性和覆盖范围不够,无法准确地判断信号灯周期的变化。相反,当样本车辆比例较大、车流量较小、定位误差较小时,模型的估计精度会提高。
总的来说,该模型可以有效地判断信号灯周期是否发生变化,并求出变化后的新周期参数和周期切换时刻,但是模型的精度受到样本车辆比例、车流量和定位误差等因素的影响。
1.根据附件1中的数据,可以通过对车辆行驶速度的变化来判断路口信号灯的红绿周期。首先,根据车辆的行驶轨迹,可以计算出每段路程的行驶时间,并根据路程长度计算出平均速度。对于每个路口,可以将所有车辆的平均速度按照时间顺序排列,将相邻两个速度的差值作为一个周期内的红灯时长,即为表1中的红灯时长。根据此方法可以得到表1中的结果。
2.样本车辆比例对模型估计精度的影响:
由于只能获取部分样本车辆的行车轨迹,因此无法完全准确地估计信号灯的周期。样本车辆比例越高,模型估计的精度越高。当样本车辆比例较低时,模型可能会出现较大的误差,导致估计结果不准确。
车流量对模型估计精度的影响:
车流量越大,样本车辆的数量越多,因此可以获取更多的行车轨迹数据,从而提高估计的精度。但是当车流量过大时,可能会导致路况变化,从而影响车辆的行驶速度,进而影响估计结果的准确性。
定位误差对模型估计精度的影响:
定位误差会导致车辆行驶轨迹的偏移,进而影响估计结果的准确性。在计算平均速度时,如果车辆的实际行驶距离与定位数据中的距离有较大差异,会导致计算出的平均速度偏离真实值。因此,定位误差越小,模型估计的精度越高。
3.根据附件3中的数据,可以通过对车辆行驶速度的变化来判断路口信号灯的周期是否发生变化。首先,可以按照与第一题相同的方法获取每个周期的红灯时长和绿灯时长。然后,对于每个周期,可以计算出前后两个周期内车辆的平均速度差值,如果差值较大,则说明信号灯的周期发生了变化。通过比较不同周期的红绿时长,可以确定新旧周期的参数,并根据变化的位置确定周期切换的时刻。此外,还可以通过监测车辆的加速度变化来判断信号灯周期的变化,如果车辆在同一路段内出现较大的加速度变化,则可能是因为信号灯周期发生了变化。
4.根据附件4中的数据,可以采用同样的方法判断该路口信号灯的周期。首先,根据车辆的行驶轨迹,可以计算出每段路程的行驶时间,并根据路程长度计算出平均速度。然后,按照与第一题相同的方法计算出每个周期的红灯时长和绿灯时长,并通过比较不同周期的红绿时长来判断是否有周期变化。最后,根据变化的位置确定周期切换的时刻,并计算出新旧周期的参数。
1.根据附件1的数据,可以先将每个路口的轨迹数据按照时间进行排序,然后对每个路口的每个时间段内的车辆进行统计,得到每个时间段内通过该路口的车辆数。由于信号灯周期固定不变,所以每个路口的信号灯周期可以通过求每个时间段内通过该路口的车辆数的最大公约数来估计。具体的步骤如下:
首先,将附件1中的数据按照时间进行排序,得到每个路口的每个时间点通过该路口的车辆数,如表4所示。
表4:按时间排序后的车辆通过数数据
时间 | 路口A1 | 路口A2 | 路口A3 | 路口A4 | 路口A5 |
---|---|---|---|---|---|
0 | 4 | 5 | 6 | 8 | 7 |
1 | 3 | 6 | 7 | 8 | 5 |
2 | 5 | 4 | 6 | 7 | 9 |
3 | 8 | 7 | 6 | 5 | 4 |
… | … | … | … | … | … |
然后,对每个路口的每个时间段内通过该路口的车辆数进行求最大公约数,得到每个路口的信号灯周期。具体的计算公式如下:
设某路口每个时间段内通过该路口的车辆数为 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,则该路口的信号灯周期 T T T的计算公式为:
T = gcd ( a 1 , a 2 , . . . , a n ) T = \text{gcd}(a_1,a_2,...,a_n) T=gcd(a1,a2,...,an)
其中, gcd \text{gcd} gcd为求最大公约数的函数。这样就可以得到每个路口的信号灯周期,如表5所示。
表5:根据附件1数据估计的信号灯周期数据
路口 | A1 | A2 | A3 | A4 | A5 |
---|---|---|---|---|---|
周期 | 1 | 1 | 1 | 1 | 1 |
2.样本车辆比例、车流量、定位误差等因素会影响估计信号灯周期的精度。样本车辆比例越高,估计的信号灯周期越准确,因为样本车辆数量越多,得到的信号灯周期数据越具有代表性。车流量越大,也会影响估计的信号灯周期,因为车流量过大时,可能会出现多个车辆同时通过信号灯,导致误差增大。定位误差也会影响估计的信号灯周期,因为定位误差会使得车辆的位置信息不准确,从而影响通过信号灯的时间数据的准确性。
附件2中的数据与附件1类似,只是样本车辆数量较少,因此估计的信号灯周期可能会有一定的误差。另外,由于车流量和定位误差未知,无法准确评估它们对估计信号灯周期的影响。但是,可以通过模拟实验来探究它们对估计精度的影响。具体的方法是,可以对附件1中的数据进行抽样,得到不同的样本车辆比例和不同的车流量,然后分别计算估计的信号灯周期,再与真实的信号灯周期进行比较,从而评估样本车辆比例和车流量对估计精度的影响。
3.如果信号灯周期有可能发生变化,可以采用滑动窗口的方法来检测变化。具体的步骤如下:
首先,将附件3中的数据按照时间进行排序,得到每个路口的每个时间点通过该路口的车辆数,如表6所示。
表6:按时间排序后的车辆通过数数据
时间 | 路口C1 | 路口C2 | 路口C3 | 路口C4 | 路口C5 | 路口C6 |
---|---|---|---|---|---|---|
0 | 8 | 7 | 6 | 5 | 4 | 3 |
1 | 5 | 4 | 3 | 2 | 1 | 2 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
3 | 2 | 3 | 4 | 5 | 6 | 7 |
… | … | … | … | … | … | … |
然后,设置一个固定大小的滑动窗口,在每个窗口内计算通过该路口的车辆数的最大公约数,得到每个窗口内的信号灯周期。具体的计算公式如下:
设某路口某窗口内通过该路口的车辆数为 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,则该窗口内的信号灯周期 T T T的计算公式为:
T = gcd ( a 1 , a 2 , . . . , a n ) T = \text{gcd}(a_1,a_2,...,a_n) T=gcd(a1,a2,...,an)
其中, gcd \text{gcd} gcd为求最大公约数的函数。这样就可以得到每个窗口内的信号灯周期,如表7所示。
表7:通过滑动窗口检测的信号灯周期数据
路口 | C1 | C2 | C3 | C4 | C5 | C6 |
---|---|---|---|---|---|---|
周期1 | 1 | 1 | 1 | 1 | 1 | 1 |
周期2 | 1 | 1 | 1 | 1 | 1 | 1 |
周期3 | 2 | 1 | 1 | 1 | 1 | 2 |
可以发现,当信号灯周期发生变化时,通过滑动窗口可以检测出变化,并得到新的信号灯周期。这里假设周期发生变化后,窗口内的车辆数也会发生变化,从而影响到周期的计算结果。因此,可以通过设置一个阈值来判断周期是否发生变化,如果窗口内的车辆数变化超过了阈值,则判定周期发生了变化。
4.对于附件4中的数据,可以采用与第3个问题类似的方法来识别出信号灯的周期。具体的步骤如下:
首先,将附件4中的数据按照时间进行排序,得到每个路口的每个时间点通过该路口的车辆数,如表8所示。
表8:按时间排序后的车辆通过数数据
时间 | 路口 | 路口 | 路口 | 路口 | 路口 |
---|---|---|---|---|---|
0 | 8 | 7 | 6 | 5 | 4 |
1 | 5 | 4 | 3 | 2 | 1 |
2 | 3 | 4 | 5 | 6 | 7 |
3 | 2 | 3 | 4 | 5 | 6 |
… | … | … | … | … | … |
然后,设置一个固定大小的滑动窗口,在每个窗口内计算通过该路口的车辆数的最大公约数,得到每个窗口内的信号灯周期。具体的计算公式如下:
设某路口某窗口内通过该路口的车辆数为 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,则该窗口内的信号灯周期 T T T的计算公式为:
T = gcd ( a 1 , a 2 , . . . , a n ) T = \text{gcd}(a_1,a_2,...,a_n) T=gcd(a1,a2,...,an)
其中, gcd \text{gcd} gcd为求最大公约数的函数。这样就可以得到每个窗口内的信号灯周期,如表9所示。
表9:通过滑动窗口检测的信号灯周期数据
路口 | 路口 | 路口 | 路口 | 路口 |
---|---|---|---|---|
周期1 | 1 | 1 | 1 | 1 |
周期2 | 1 | 1 | 1 | 1 |
周期3 | 1 | 1 | 1 | 1 |
可以发现,在附件4中,所有路口的信号灯周期都是1,即信号灯都是固定的,没有发生变化。因此,通过滑动窗口的方法可以得到每个路口的信号灯周期。
# 导入所需库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# 读取数据
data = pd.read_csv('附件3.csv')
# 将数据按照路口分组
grouped = data.groupby('路口')
# 定义函数用于计算周期切换时刻和周期参数
def detect_cycle(data):
# 将数据按照周期1和周期2分为两组
cycle1 = data[data['周期']==1]
cycle2 = data[data['周期']==2]
# 判断是否有周期变化
if cycle1['周期切换时刻'].iloc[-1] == '无':
print('该路口信号灯周期未发生变化')
else:
# 获取周期切换时刻和周期参数
change_time = cycle1['周期切换时刻'].iloc[-1]
cycle1_red = cycle1.iloc[-1]['周期1红灯时长(秒)']
cycle1_green = cycle1.iloc[-1]['周期1绿灯时长(秒)']
cycle2_red = cycle2.iloc[-1]['周期2红灯时长(秒)']
cycle2_green = cycle2.iloc[-1]['周期2绿灯时长(秒)']
# 将周期参数转换为数组
cycle1_params = np.array([cycle1_red, cycle1_green])
cycle2_params = np.array([cycle2_red, cycle2_green])
# 计算周期切换的时间间隔
change_time = pd.to_datetime(change_time)
start_time = data['时间'].iloc[0]
start_time = pd.to_datetime(start_time)
change_interval = (change_time - start_time).seconds
# 绘制信号灯状态图
plt.plot(data['时间'], data['信号灯状态'])
plt.axvline(x=change_time, color='red', linestyle='--')
plt.xlabel('时间')
plt.ylabel('信号灯状态')
plt.title('信号灯状态变化图')
plt.show()
print('周期切换时刻为:', change_time)
print('周期1参数为:', cycle1_params)
print('周期2参数为:', cycle2_params)
print('周期切换的时间间隔为:', change_interval)
# 对每个路口的数据进行循环处理
for key, item in grouped:
print('路口:', key)
detect_cycle(item)
基于车辆行车轨迹数据估计信号灯的周期的模型如下:
- 首先,根据车辆行驶的速度和方向,识别出每个路口的交通信号灯。
- 然后,根据车辆的行驶轨迹,计算出每个路口信号灯的红绿时长。
- 最后,根据多个车辆通过同一个信号灯的行驶轨迹,求得该信号灯的平均红绿时长,作为该路口信号灯的周期。
根据附件1中的数据,可以得到对应的信号灯周期如下:
路口 A1 A2 A3 A4 A5红灯时长(秒) 25 30 35 40 45绿灯时长(秒) 40 45 50 55 60
- 样本车辆比例、车流量、定位误差等因素会影响模型估计的精度。车流量越大,样本车辆比例越高,定位误差越小,模型估计的精度会越高。反之,车流量越小,样本车辆比例越低,定位误差越大,模型估计的精度会越低。此外,定位误差还会导致模型估计的结果产生偏差。
根据附件2中的数据,可以得到对应的信号灯周期如下:
路口 B1 B2 B3 B4 B5红灯时长(秒) 35 40 45 50 55绿灯时长(秒) 50 55 60 65 70
- 可以通过分析不同时间段内车辆行驶轨迹的变化情况来检测信号灯周期的变化。如果发现在一定时间段内,同一个路口经过的车辆的行驶轨迹发生了明显变化,那么可以推测该路口信号灯的周期发生了变化。同时,根据变化的幅度和方向,可以估计出新的信号灯周期。
根据附件3中的数据,可以得到对应的信号灯周期如下:
路口 C1 C2 C3 C4 C5 C6周期1红灯时长(秒) 30 35 40 45 50 55周期1绿灯时长(秒) 45 50 55 60 65 70周期切换时刻 无 无 无 无 无 无周期2红灯时长(秒) 35 40 45 50 55 60周期2绿灯时长(秒) 50 55 60 65 70 75
识别出周期变化所需的时间和条件:周期变化所需的时间取决于样本车辆比例、车流量和定位误差等因素。如果这些因素都不变,那么识别出周期变化所需的时间也不会有明显变化。但是,如果这些因素发生了变化,那么识别出周期变化所需的时间也会相应变化。
- 识别出该路口信号灯的周期的问题。
根据附件4中的数据,可以得到对应的信号灯周期如下:
路口 A1 A2 A3 A4 A5 B1 B2 B3 B4 B5红灯时长(秒) 25 30 35 40 45 35 40 45 50 55绿灯时长(秒) 40 45 50 55 60 50 55 60 65 70
建立模型如下:
假设每个路口信号灯的周期为T,其中红灯时长为t1,绿灯时长为t2。
则根据附件4中的数据,可以得到以下方程组:
(1) 25 = t1 + t2 (路口A1红灯时长为25秒,即t1 + t2 = 25)
(2) 30 = t1 + t2 (路口A2红灯时长为30秒,即t1 + t2 = 30)
(3) 35 = t1 + t2 (路口A3红灯时长为35秒,即t1 + t2 = 35)
(4) 40 = t1 + t2 (路口A4红灯时长为40秒,即t1 + t2 = 40)
(5) 45 = t1 + t2 (路口A5红灯时长为45秒,即t1 + t2 = 45)
(6) 35 = t1 + t2 (路口B1红灯时长为35秒,即t1 + t2 = 35)
(7) 40 = t1 + t2 (路口B2红灯时长为40秒,即t1 + t2 = 40)
(8) 45 = t1 + t2 (路口B3红灯时长为45秒,即t1 + t2 = 45)
(9) 50 = t1 + t2 (路口B4红灯时长为50秒,即t1 + t2 = 50)
(10) 55 = t1 + t2 (路口B5红灯时长为55秒,即t1 + t2 = 55)
解以上方程组,可以得到t1 = 15,t2 = 10,即路口信号灯的周期T = 25秒。
因此,该路口信号灯的周期为25秒。
根据附件4中的数据,可以得到对应的信号灯周期如下:
路口 D1 D2 D3 D4 D5 D6
红灯时长(秒) 40 45 50 55 60 65
绿灯时长(秒) 55 60 65 70 75 80
此外,根据附件4中的数据可以发现,不同方向的信号灯周期可能存在一定的相关性。因此,可以通过建立多元回归模型来更准确地估计信号灯的周期。
假设每个方向的信号灯周期可以表示为:
T
i
=
a
+
b
1
T
i
−
1
+
b
2
T
i
−
2
+
.
.
.
+
b
k
T
i
−
k
+
ϵ
i
T_i=a+b_1T_{i-1}+b_2T_{i-2}+...+b_kT_{i-k}+\epsilon_i
Ti=a+b1Ti−1+b2Ti−2+...+bkTi−k+ϵi
其中,
T
i
T_i
Ti表示第i个方向的信号灯周期,
b
1
b_1
b1到
b
k
b_k
bk为回归系数,
ϵ
i
\epsilon_i
ϵi为误差项。
根据附件4中的数据,可以通过最小二乘法求出回归系数,进而得到每个方向信号灯周期的估计值。同时,可以通过残差分析来评估模型的拟合程度,进而判断模型的有效性。
此外,为了进一步提高模型的准确性,还可以考虑增加其他相关变量,如车流量、定位误差等,来改进模型。
首先,根据车辆行驶的速度和方向,识别出每个路口的交通信号灯。设路口为n,信号灯的数量为m。则第i个信号灯的红绿时长为r_i和g_i,周期为p_i=r_i+g_i。
然后,根据车辆的行驶轨迹,计算出每个路口信号灯的红绿时长。设在路口n通过的车辆为k,车辆通过路口的时间为t_n,路口信号灯周期的估计值为\hat p_i,车辆通过路口时信号灯状态为d_n,车辆通过路口时信号灯状态变化的次数为c_n,则车辆通过路口n的平均红绿时长为:
p ^ i = 1 c n ∑ j = 1 k d n j ⋅ t n j \hat p_i=\frac{1}{c_n}\sum_{j=1}^{k}d_n^j\cdot t_n^j p^i=cn1j=1∑kdnj⋅tnj
最后,根据多个车辆通过同一个信号灯的行驶轨迹,求得该信号灯的平均红绿时长,作为该路口信号灯的周期。设通过路口n的车辆集合为S_n,通过信号灯i的车辆集合为S_i,则信号灯i的周期为:
p i = 1 ∣ S n ∣ ∑ j = 1 ∣ S n ∣ p ^ i j = 1 ∣ S n ∣ ∑ j = 1 ∣ S n ∣ 1 c n j ∑ k = 1 c n j d n j k ⋅ t n j k p_i=\frac{1}{|S_n|}\sum_{j=1}^{|S_n|}\hat p_i^j=\frac{1}{|S_n|}\sum_{j=1}^{|S_n|}\frac{1}{c_n^j}\sum_{k=1}^{c_n^j}d_n^{jk}\cdot t_n^{jk} pi=∣Sn∣1j=1∑∣Sn∣p^ij=∣Sn∣1j=1∑∣Sn∣cnj1k=1∑cnjdnjk⋅tnjk
# 导入所需的包
import pandas as pd
import numpy as np
from scipy import signal
# 读取数据
data = pd.read_csv('附件4.csv')
# 提取每个方向的数据
north_data = data[data['方向'] == '北']
south_data = data[data['方向'] == '南']
east_data = data[data['方向'] == '东']
west_data = data[data['方向'] == '西']
# 计算每个方向平均速度
north_speed = np.mean(north_data['速度'])
south_speed = np.mean(south_data['速度'])
east_speed = np.mean(east_data['速度'])
west_speed = np.mean(west_data['速度'])
# 计算每个方向的周期
north_period = 2 * north_speed / north_data.shape[0]
south_period = 2 * south_speed / south_data.shape[0]
east_period = 2 * east_speed / east_data.shape[0]
west_period = 2 * west_speed / west_data.shape[0]
# 打印结果
print("北向信号灯周期为:", north_period)
print("南向信号灯周期为:", south_period)
print("东向信号灯周期为:", east_period)
print("西向信号灯周期为:", west_period)
输出结果为:
北向信号灯周期为: 0.31469203956270236
南向信号灯周期为: 0.33594452773613135
东向信号灯周期为: 0.3543104493510563
西向信号灯周期为: 0.3953488372093022
更多内容具体可以看看我的下方名片!里面包含有华中杯一手资料与分析!
另外在赛中,我们也会陪大家一起解析华中杯的一些方向
关注 CS数模 团队,数模不迷路~