VISSIM二次开发(Python)大作业总结2
VISSIM二次開發(Python)&大作業總結2
寫在前面
前一小節已經概括了基本所有這次使用的二次開發的知識,在這一小節,我們主要介紹本文對.att文件的讀取和繪圖以及分析的工作。
在這一部分我們將展開對這一部分的介紹,由于這部分的內容專門性比較強,所以就與前面的二次開發部分分開撰寫,供有需要的同學們參考。
.att文件示例
其中表頭會介紹數據字節含義,這里需要點出第一列就是仿真運行次數。
需求1:依據仿真結果繪制contour圖
#開發環境 matplotlib 3.3.4 numpy 1.19.5 pandas 1.2.4coutour圖是指等高線圖,直接上代碼
import pandas as pd import numpy as np import matplotlib.pyplot as pltS=8 #設置需要讀取的仿真次數df1=pd.read_csv('file.att',sep=';',skiprows=21)#att中數據分隔符是“;”,然后需要跳過前面不需要轉換成df的部分。 #讀取數據需要跳過前面的不需要的行 #%% # df2=df1.sort_values(by=['DATACOLLECTIONMEASUREMENT', 'TIMEINT'])dfn1=df1[df1['$DATACOLLECTIONMEASUREMENTEVALUATION:SIMRUN'].isin([S])]#這里其實在前面更改clomun后會更加方便。選擇僅僅包含這第八次運行的結果 T=int(672*5/8)#這是其中非匝道段的線圈有效數據的行數,因為后面會有很多不需要的統計值,可能需要自己更改 #%% dfn=dfn1[dfn1['DATACOLLECTIONMEASUREMENT'].isin([1,2,4,7,9])]#這里選取了其中需要分析的截面 pre_df=dfn[['TIMEINT','DATACOLLECTIONMEASUREMENT','SPEED(ALL)']].iloc[:T,:]#這里主要是選擇需要分析的幾列 pre_df1=pre_df[['SPEED(ALL)']]#最后發現還是只需要一列 pre_df1.index = range(T)#為方便,對index重新編號#下面就是把上面的一列數據轉換 for i in range(84):if i ==0:A= pre_df1.iloc[0:5,0]C=pd.DataFrame(A)C.index = range(len(C))else:B=pd.DataFrame(pre_df1.iloc[i*5:i*5+5,0])B.index = range(len(B))C=pd.concat([C,B],axis=1,join='inner')#建立一個9*64的df作為等高線繪圖的輸入t=C.shape[1]#下面就是等高線圖的繪制 C=C.iloc[::-1,:] x=np.linspace(0,t-1,t) y=np.linspace(37,41,5) X,Y=np.meshgrid(x,y) #上面三句話就是建立等高線圖的網格 plt.figure() plt.contourf(X,Y,np.array(C),7,cmap=plt.cm.RdYlGn,levels=np.linspace(0,90,50)) #繪制等高線圖,中間需要以矩陣的形式,并且滿足x列,y行 plt.colorbar()#顯示色條 plt.xticks(range(0,84,12),['6:00','7:00','8:00','9:00','10:00','11:00','12:00'])#更改橫縱坐標 plt.yticks([37,38,39,40,41],['NHNX41','NHNX40','NHNX39','NHNX38','NHNX37']) # plt.savefig('C:\\Users\\13968\\Desktop\\0819-'+str(S)+'.jpg', dpi=1000) plt.show()其中控制繪圖效果的主要就是levels=np.linspace(0,90,50)這個代碼其中0,90是控制顯示的縱坐標色彩范圍(對應顏色),50是表述色彩過渡的趨勢,可以參考下面鏈接中的方法進行選用。以及色板的使用都可以參考,當然官方文檔寫的也很清楚~
contourf的colorbar如何設置顯示范圍_solmn的博客-CSDN博客_colorbar設置想要的范圍
【Python】繪制熱力圖seaborn.heatmap,cmap設置顏色的參數_小白兔de窩-CSDN博客_cmap
部分同學可能也有繪制真實場景的contour的需求,因為方法一致這里也不進行探討了,主要就是構建這個繪圖速度時空矩陣C,大家可以自己嘗試,這部分中間的df傳遞有些混亂目前看來能達到效果就好
最終繪制的效果如下~是不是還可以
需求2:依據結果進行分析
結果分析主要是參考這兩篇文獻來做的
Bottleneck Identification and Calibration for Corridor Management Planning
Calibration of a micro-traffic simulation model with respect to the spatial-temporal evolution of expressway on-ramp bottlenecks
| C1(Bottleneck Area Matching) | 實際與仿真在瓶頸范圍(時間和空間上)的匹配程度 | >0.75 |
| C2(Actual Speed Matching) | 反映范圍匹配以及實際速度的匹配 | >0.70 |
| GEH | 由Geoffrey E. Havers提出,旨在比較兩組流量數據的匹配程度 | <5 |
| 速度相對誤差 | <15% |
也簡單羅列一下公式,其中C1和Devs還有一些其他的形式不過差別不大,具體怎么算可以參考前面推薦的文獻~
Devs=∣Sr?SsjSr\\Devs= \frac { | S _ { r } - S _ { s } j } { S _ { r } } Devs=Sr?∣Sr??Ss?j?
GH=(E?v)2(E+v)/2\sqrt { G H } = \sqrt { \frac { ( E - v ) ^ { 2 } } { ( E + v ) / 2 } } GH?=(E+v)/2(E?v)2??
C1=∑i=1N{(∑t=1T[BSs(i,t)ABSr(i,t)])?(xi+1?xi)}∑i=1N(∑t=1T[BSs(i,t)VBSr(i,t)])?(xi+1?xi)}\\C_1=\frac{\sum _ { i = 1 } ^ { N } \{ ( \sum _ { t = 1 } ^ { T } [ B S _ { s } ( i , t ) A B S _ { r } ( i , t ) ] ) \cdot ( x _ { i } + 1 - x _ { i } ) \}}{\sum _ { i = 1 } ^ { N } ( \sum _ { t = 1 } ^ { T } [ B S _ { s } ( i , t ) V B S _ { r } ( i , t ) ] ) \cdot ( x _ { i } + 1 - x _ { i } ) \}} C1?=∑i=1N?(∑t=1T?[BSs?(i,t)VBSr?(i,t)])?(xi?+1?xi?)}∑i=1N?{(∑t=1T?[BSs?(i,t)ABSr?(i,t)])?(xi?+1?xi?)}?
C2=2∑i=1N∑i=1T{[BSs(i,t)VBSr(i,t)]?∣Ss(i,t)?Sr(i,t)∣)?(xi+1?xi)}∑i=1N∑t=1T{[BSs(i,t)VBSr(i,t)]?(Ss(i,t)+Sr(i,t)))?(xi+1?xi)}\\C_2=\frac{2 \sum _ { i = 1 } ^ { N } \sum _ { i = 1 } ^ { T } \{[ B S _ { s } ( i , t ) V B S _ { r } ( i , t ) ] \cdot| S _ { s } ( i , t ) - S _ { r } ( i , t ) | ) \cdot ( x _ { i } + 1 - x _ { i } ) \}}{\sum _ { i = 1 } ^ { N } \sum _ { t = 1 } ^ { T } \{ [ B S _ { s } ( i , t ) V B S _ { r } ( i , t ) ] \cdot ( S _ { s } ( i , t ) + S _ { r } ( i , t ) ) ) \cdot ( x _ { i } + 1 - x _ { i } ) \}} C2?=∑i=1N?∑t=1T?{[BSs?(i,t)VBSr?(i,t)]?(Ss?(i,t)+Sr?(i,t)))?(xi?+1?xi?)}2∑i=1N?∑i=1T?{[BSs?(i,t)VBSr?(i,t)]?∣Ss?(i,t)?Sr?(i,t)∣)?(xi?+1?xi?)}?
這部分代碼為好兄弟xjt今天看論文了嘛的博客_CSDN博客 提供
#文件導入部分前面有講解,在此不再贅述,主要介紹主要其功能性模塊 #計算BS矩陣(45代表閾值,可自行調節,索引自行依據矩陣調節)BS_wn[f'speed_{data}'] = BS_wn[f'speed_{data}'].apply(lambda x: 0 if x >= 45 else 1) #這里直接利用pandas讀取后的Dataframe類型來進行操作,其他類型也可以操作,只要索引對應上 #修正BS矩陣 怕出錯這里可不帶入,對結果影響不大 BS_s_1 = BS_wn.values #轉換成矩陣形式,遍歷一個線圈的歷史數據進行判斷 for spa_ii in range(1,BS_s_1.shape[1]):for tt_3 in range(BS_s_1.shape[0]):if BS_s_1[tt_3][spa_ii] == 0: #主要關注瓶頸區的設置是否合理,因此不合理的瓶頸區設置的異常值就是0,所以找到所有0(非瓶頸區位置)for tt_4 in range(tt_3-3,tt_3):data_listwn = []if tt_4 <0:passelse:for tt_5 in range(tt_4,tt_4+5):if tt_5 == tt_3 or tt_5 >=len(BS_s_1.shape[0])-1: #空間位置索引最大值passelse:data_listwn.append(BS_s_1[tt_5][spa_ii])if data_listwn == [1, 1, 1, 1]:BS_s_1[tt_3][spa_ii] = 1 #指標各參數含義可詳見公式 #計算C1 def Ca_C1(Bs_s, Bs_r):C1_up = np.sum(np.logical_and(Bs_s,Bs_r))C1_down = np.sum(Bs_s+Bs_r)C1 = 2*C1_up/C1_downreturn C1 # 計算C2指標: def Ca_C2(Bs_s1, Bs_r1, S_s, S_r):Bs_or = np.logical_or(Bs_s1,Bs_r1)S_abs = np.abs(S_r-S_s)S_add =S_r+S_sC2_up = np.sum(np.multiply(Bs_or, S_abs))C2_down = np.sum(np.multiply(Bs_or,S_add))C2 =1 - 2*C2_up/C2_downreturn C2 # 計算GEH def Ca_GEH(V_ss,V_r):Geh_up = np.multiply((V_ss-V_r), (V_ss-V_r))Geh_down = (V_ss+V_r)/2Geh = np.sqrt(Geh_up/Geh_down)return np.percentile(Geh, 0.85) #返回85分位值 #計算速度相對偏差 def Ca_DevS(S_s1, S_r1):S_abs = np.abs(S_r1-S_s1)idxnonzeros = np.where(S_r1 != 0)Devs = S_abs[idxnonzeros]/S_r1[idxnonzeros]Devs_re = Devs[np.where(Devs <= np.percentile(Devs, 0.85))] #剔除15%的較大的值后進行計算,也可以不剔除Devs_avr = np.average(Devs_re)return Devs_avr通過計算這些指標再結合這個專欄的第一篇就能進行校正參數的標定~
當然,這些工作都是建立在經過前置的細致的檢查之后的,比如軟件檢查-建模檢查-動畫檢查,經過定性分析之后再進行這里介紹的方法進行定量分析。從而得到最佳的參數組合,完成模型的標定工作,對交通現象和微觀行為有更深入的認知 。
本系列第一篇:VISSIM二次開發(Python)&大作業總結1_tu_qing的博客-CSDN博客歡迎大家關注
總結
以上是生活随笔為你收集整理的VISSIM二次开发(Python)大作业总结2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle查看登录时间黑屏,oracl
- 下一篇: python增删改查csv文件_Pyth