2024年國賽高教杯數學建模
E題 交通流量管控解題
原題再現
??隨著城市化進程的加快、機動車的快速普及,以及人們活動范圍的不斷擴大,城市道路交通擁堵問題日漸嚴重,即使在一些非中心城市,道路交通擁堵問題也成為影響地方經濟發展和百姓幸福感的一個“痛點”,是相關部門的棘手難題之一。
??考慮一個擁有知名景區的小鎮。景區周邊道路上既有本地居民出行,也有過境車輛,還有大量前來景區游覽的游客車輛,后者常常會因尋找停車位而在周邊道路上來回低速繞圈,影響了道路的通行效率。
??圖1是小鎮中兩條主路的情況:緯中路,從環西路到環東路,約3.5公里;經中路,從環北路到環南路,約1.8公里。兩條路上共有12個交叉口,監控設備可以記錄每個交叉口四個方向的車流數據。以經中路-緯中路交叉口為例,有經中路北往南(north-south)、經中路南往北(south-north)、緯中路東往西(east-west)、緯中路西往東(west-east)四個相位通過的每輛車的信息,包括拍攝地點、行駛方向、拍攝時間和車牌號。
??附件2記錄了2024年4月1日到5月6日這兩條主路上有監控設備的地方出現過的所有車輛信息。監控設備安裝在停車線后方,因此并不知道車輛通過停車線后是左轉、直行還是右轉。
??由于沿途有住宅小區、酒店和寫字樓等建筑物,車輛可以駛入這些建筑物的停車場或者從停車場駛出,所以可能造成這兩條主路上的車輛會突然出現或者突然消失。 請結合實際,探討以下幾個問題:
??問題1 對經中路-緯中路交叉口,根據車流量的差異,可將一天分成若干個時段,估計不同時段各個相位(包括四個方向直行、轉彎)車流量。
??問題2 根據所給數據和上述模型,對經中路和緯中路上所有交叉口的信號燈進行優化配置,在保證車輛通行的前提下,使得兩條主路上的車流平均速度最大。
??問題3 對五一黃金周期間的數據進行分析,判定尋找停車位的巡游車輛,并估算假期景區需要臨時征用多少停車位才能滿足需求?
??問題4 五一黃金周期間,該小鎮對景區周邊道路實行了臨時性交通管理措施,具體管控措施見附件3。請結合數據評價臨時管控措施在兩條主路上的效果。
??附件1 路段行駛方向編號及交叉口之間的距離
??附件2 緯中路各交叉口車輛信息
??附件3 五一黃金周期間交通管控措施
整體求解過程概述(摘要)
??交通擁堵問題已經日益嚴重,特別在旅游景區周圍更加嚴重。基于該區域交通流量數據,分析該鎮主要道路的交通現狀,交通優化方案已經成為相關部門的急需。
??針對問題一,通過對交通監控數據的聚合處理,統計了經中路-緯中路交叉口不同時間的總車流量。利用 K-Means 聚類算法分析總車流量變化趨勢,依據肘部法得出聚類數為3,將時段劃分為高峰、中峰和低峰三類。用粒子群優化(PSO)算法分配每個時段的車流方向比例,依據比例算出各方向(直行、左轉、右轉)的車流量,多次迭代粒子群優化算法,最終得出期每個時段內各個方向的平均車流量(輛/時),低峰時段所有數據的最高值 30.65,最低值 9.99,均值 20.34;中峰時段所有數據的最高值 46.25,最低值 14.79,均值 32.45;高峰時段所有數據的最高值 371.17,最低值 117.20,均值 269.08。
??針對問題二,為了優化經中路和緯中路交叉口的信號燈配置,使兩條主路的車流速度最大化,本文構建了基于馬爾可夫決策過程(MDP)的量化交通狀態和信號燈的配時策略模型,采用深度Q學習(DQN)算法來優化每個時段的信號燈綠燈持續時間。模型通過獎勵函數衡量交通流的通行效率,并以最大化平均車速為優化目標。在多次訓練和迭代中,模型得到了最佳的信號燈配時方案,在信號燈周期固定為120秒的前提下,分別為四個方向分配相位時間,并計算了不同方向的平均等待時間。結果表明,方向1和方向4的相位時間在高峰時段內獲得了更多的分配,達到了 34.38 秒,等待時間相應從 45.83 秒縮短至 42.80 秒,有效提高了高峰期的通行效率。
??針對五一黃金周景區停車位不足問題,查詢文獻建立以低車速、短時間重復出現為準則的尋找停車位的巡游車輛判定模型,標記出巡游的車輛。依據標記的車輛信息,結合泊松分布模型,估算巡游車輛的停車需求,查閱發改委文件顯示泊位對應出行停車需求為 0.2 個,以泊松分布的 95%置信區間,算出要臨時增加的停車位數量為 1287 個。車位增加后可減少道路車流 28%。
??針對問題四,需評估五一黃金周景區周邊實行交通管理措施效果。分析車流量、等待時間和車速關鍵指標,采用對比管控前后各交叉口的交通方式。車流量管控后 5 個交叉口的車流量顯著下降,在高峰時段環東路-緯中路的車流量減少了 95.91%,表明管控措施擁堵壓力效果顯著減小。等待時間顯示 4 個交叉口的等待時間大幅縮短,以環東路-緯中路路口為例,管控前后的平均等待時間從 7 分 37 秒降至 2 分 43 秒,等待時間縮短了 64.18%,有效提高了車輛通行效率。整體來看,五一黃金周的臨時管控措施在緩解主要道路交通壓力、提升流動性方面取得了顯著成效。
模型假設:
??1. 假設在一天內車流量具有一定的周期性或時間段特性。
??2. 假設可以根據某些先驗信息或歷史數據,對車輛轉彎的比例進行估計。
??3. 假設可以忽略行人、非機動車等其他交通因素的影響。
??4. 假設某些車輛多次出現在同一地區,并以低速移動時,可以將其視為在尋找停車位。
問題分析:
??本次交通流量管控問題,圍繞一個擁有知名景區的小鎮交通問題展開,特別是在高峰期或假日期間,如何有效管理交通流量,優化道路通行效率和停車問題。問題設計基于對車流量的分析、信號燈優化以及假日期間臨時交通管控措施的評價。
??問題一分析
??問題一要求根據車流量的差異,將一天分成若干時段,估計經中路-緯中路交叉口在不同時間段各個相位的車流量。為解決這個問題,需要對車流量進行時間分段分析。通過分析監控設備記錄的數據,可以根據車流量的變化確定交通高峰和低谷的時間段。首先,使用統計學方法,如聚類分析,找出車流量隨時間的變化規律,將一天劃分為若干時段。為了估算每個方向的直行、左轉、右轉車流量,我們需要合理假設或基于歷史數據得出各個方向上直行、左轉、右轉的比例。通過引入智能優化算法自動調整模型參數(如直行、左轉、右轉的比例),使得車流量估計更加準確。我們可以使用粒子群優化算法(PSO)、差分進化算法等來實現這一目標。最后,估計各個相位在每個時段的車流量,便于后續信號燈的優化調整。
??問題二分析
??問題二要求對經中路和緯中路上所有交叉口的信號燈進行優化配置,以在保證車輛通行的前提下,使得兩條主路上的車流平均速度最大。該問題的核心在于通過信號燈的優化配置,減少交通擁堵,提升整體交通效率。小鎮的交通情況復雜,除了本地居民出行,還有游客車輛在尋找停車位時的低速繞行,進一步加劇了擁堵。因此,需要在交通信號燈的控制策略上進行精細化管理。我們可以使用交通流量數據和強化學習方法,建立一個能夠動態調整信號燈配時的模型。通過對經中路-緯中路交叉口車流量的實時監測,識別出車流高峰和低峰時段,并對信號燈進行優化配時,使車輛的平均等待時間最小化,從而提高車流速度。具體建模可以使用深度強化學習模型(如DQN),將每個交叉口的信號燈配時視為動作空間,車流速度視為獎勵函數,進行迭代優化。此外,仿真驗證是確保模型有效性的關鍵步驟,可以使用交通仿真軟件(如SUMO)對不同信號燈配置策略進行測試和驗證,評估其對車流平均速度的影響。通過對不同配置方案的比較和優化,最終可以找到一個最佳的信號燈配時方案,以最大化兩條主路的車流速度,減少交通擁堵,提高通行效率。
??問題三分析
??問題三重點在于通過對五一黃金周期間的車倆數據進行深入分析,判定哪些車輛因尋找停車位而在景區周邊巡游,并估算需要征用多少臨時停車位來滿足需求。首先,需通過車輛低速行駛和頻繁經過同一交叉口等特征識別巡游車輛。接著,分析巡游車輛的數量和巡游時長,結合泊松分布模型估算巡游車輛的停車需求。根據發改委意見,0.1-0.3 個泊位對應出行停車需求,基于此需求量利用泊松分布的 95%置信區間估算出停車位的最大需求量。最終結果有助于為高峰期停車管理提供數據支持,合理規劃臨時停車位,以緩解交通壓力,提高景區通行效率。
??問題四分析
??問題四要求評價五一黃金周期間對景區周邊道路實行的臨時性交通管理措施的效果。首先,通過對比五一黃金周期間和日常交通流量、車速等數據,可以定量分析交通管理措施的效果。例如,通過比較車輛的平均速度、車輛的通行時間等指標,可以評估管理措施是否有效緩解了交通擁堵。其次,通過對巡游車輛和停車需求的分析,可以判斷措施是否有效減少了因尋找停車位而產生的低速行駛情況。此外,還可以分析擁堵區域的分布變化,判斷管理措施是否達到了疏導交通的目的。結合這些定量指標,可以全面評估臨時管控措施的實施效果。
模型的建立與求解整體論文縮略圖
全部論文及程序請見下方“ 只會建模 QQ名片” 點擊QQ名片即可
部分程序代碼(完整論文以及代碼請聯系博主):
數據處理代碼:
import pandas as pd
# 使用 GBK 編碼加載 CSV 文件,處理中文字符
file_path = '附件 2.csv'
data = pd.read_csv(file_path, encoding='gbk')
# 將“時間”列轉換為日期時間格式
data['時間'] = pd.to_datetime(data['時間'].str[:19])
# 定義“方向”列的映射,將數字代碼轉換為易讀的方向描述。
direction_map = {1: 'north-south', 2: 'south-north', 3: 'east-west', 4: 'west-east'}
data['方向'] = data['方向'].map(direction_map)
# 提取日期,小時,分鐘
data['日期'] = data['時間'].dt.date
data['小時'] = data['時間'].dt.hour
data['分鐘'] = data['時間'].dt.minutedata.to_csv('整理后的附件 2.csv', index=False)
# 按“交叉口”、“方向”、“日期”和“小時”進行分組,計算每組的大小(即車流量)
hourly_flow = data.groupby(['交叉口', '方向', '日期', '小時']).size().reset_index(name='車流量')
hourly_flow.to_excel('聚合處理數據.xlsx', index=False)
import numpy as np
from pyswarm import pso
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler# 設置 matplotlib 以支持中文顯示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 讀取聚合處理后的數據
file_path = '聚合處理數據.xlsx'
df = pd.read_excel(file_path)# 篩選出特定交叉口的數據(經中路-緯中路)
intersection_data = df[df['交叉口'] == '經中路-緯中路']
# 保存篩選出的交叉口數據到新的 Excel 文件
intersection_data.to_excel('問題一-經中路-緯中路交叉口數據.xlsx')# 按小時匯總車流量
hourly_traffic_flow = intersection_data.groupby(['小時'])['車流量'].sum().reset_index()# 繪制該交叉口 24 小時車流量變化趨勢圖
plt.figure(figsize=(10,6))
plt.plot(hourly_traffic_flow['小時'],hourly_traffic_flow['車流量'],marker='o', linestyle='-')
plt.title('經中路-緯中路交叉口 24 小時車流量變化趨勢', fontsize=14)
plt.xlabel('小時', fontsize=12)
plt.ylabel('車流量', fontsize=12)
plt.xticks(range(0, 24, 1))
plt.grid(True)
plt.savefig('./picture/經中路-緯中路交叉口 24 小時車流量變化趨勢.png', dpi=300)# 再次讀取數據并篩選經中路-緯中路交叉口的數據
file_path = '聚合處理數據.xlsx'
data = pd.read_excel(file_path)
data = data[data['交叉口'] == '經中路-緯中路']# 按小時匯總車流量
flow_data_sum = data.groupby(['小時']).sum(numeric_only=True).reset_index()# 提取車流量列并進行標準化
X = flow_data_sum[['車流量']].values
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 使用肘部法確定最佳聚類數 k,k 值范圍為 1 到 10
wcss = []
k_values = range(1, 11)
for k in k_values:kmeans = KMeans(n_clusters=k, random_state=42)kmeans.fit(X_scaled)wcss.append(kmeans.inertia_)# 繪制肘部法圖,確定最佳聚類數
plt.figure(figsize=(10, 6))
plt.plot(k_values, wcss, marker='o')
plt.title('肘部法求解最佳聚類數 k', fontsize=14)
plt.xlabel('聚類數(k 值)', fontsize=12)
plt.xticks(ticks=range(0, 11), fontsize=12)
plt.ylabel('WCSS(簇內平方和)', fontsize=12)
plt.grid(True)
plt.savefig('./picture/肘部法求解最佳聚類數 k.png', dpi=300)# 根據肘部法確定 k=3 為最佳聚類數
optimal_k = 3# 對數據進行按方向和小時分組,并標準化車流量
flow_data = data.groupby(['小時', '方向'])['車流量'].sum().unstack().fillna(0)
scaled_flow_data = scaler.fit_transform(flow_data)
kmeans = KMeans(n_clusters=optimal_k, random_state=42)# 將每小時的車流量聚類,并添加聚類結果到數據中
flow_data['Cluster'] = kmeans.fit_predict(scaled_flow_data)
flow_data['Hour'] = flow_data.index
flow_data_sorted = flow_data.sort_values('Cluster')# 打印聚類后的結果
print(flow_data_sorted[['Hour', 'Cluster']])# 繪制聚類結果散點圖
plt.figure(figsize=(10, 6))
for i in range(optimal_k):cluster_data = flow_data_sorted[flow_data_sorted['Cluster'] == i]plt.scatter(cluster_data.index, cluster_data.sum(axis=1), label=f'Cluster {i}')
plt.title('聚類結果散點圖', fontsize=14)
plt.xlabel('小時', fontsize=12)
plt.ylabel('車流量', fontsize=12)
plt.legend()
plt.show()
plt.xticks(ticks=range(0, 24), fontsize=12)
plt.ylabel('車流量', fontsize=12)
plt.legend(title='簇', fontsize=12)
plt.grid(True)
plt.savefig('./picture/聚類結果散點圖.png', dpi=300)# 讀取問題一的交叉口數據
file_path = '問題一-經中路-緯中路交叉口數據.xlsx'
data = pd.read_excel(file_path)# 根據小時分類時間段
def classify_time_period(hour):if hour in [23, 0, 1, 2, 3, 4, 5]:return '低峰時段'elif hour in [6, 21, 22]:return '中峰時段'else:return '高峰時段'# 應用分類函數,將每個小時分類為低峰、中峰或高峰時段
data['Time Period'] = data['小時'].apply(classify_time_period)# 按時間段和方向匯總車流量
period_flow = data.groupby(['Time Period', '方向'])['車流量'].sum().reset_index()
actual_flows = period_flow['車流量'].values# 定義 PSO 的目標函數,用于優化直行、左轉、右轉比例
def pso_objective(params, actual_flow):straight_proportion, left_turn_proportion, right_turn_proportion = params# 如果比例和不為 1,返回無窮大if straight_proportion + left_turn_proportion + right_turn_proportion != 1:return np.inf# 估算各個方向的車流量estimated_straight_flow = actual_flow * straight_proportionestimated_left_turn_flow = actual_flow * left_turn_proportionestimated_right_turn_flow = actual_flow * right_turn_proportion# 返回估算的總流量與實際流量的差異return np.abs(estimated_straight_flow + estimated_left_turn_flow + estimated_right_turn_flow - actual_flow)# 設置 PSO 的上下限
lb = [0.4, 0.1, 0.1]
ub = [0.8, 0.3, 0.3]# 對每個實際車流量應用 PSO 優化算法
optimized_results_pso = []
for flow in actual_flows:xopt, fopt = pso(pso_objective, lb, ub, args=(flow,), swarmsize=10, maxiter=50)# 將優化結果歸一化normalized_xopt = xopt / np.sum(xopt)optimized_results_pso.append(normalized_xopt)