第四章 程式模擬系統之發展
4.1 程式撰寫
在程式方面,將建立一段高速公路三車道之路段,其中內線之兩車道分別用 來當作自動控制車道及其鄰近車道。主要係以主程式 main( )控制模式整體的運作 流程,在使用者輸入資料完成後,進行產生路段車輛副程式,分為產生 AC 車輛 P_laneGenerator( )跟產生 MC 車輛 Q_laneGenerator( )兩種,而兩個車輛產生的方 式做不同的產生控制,於下將有較詳細的說明。
系統模擬時間採用時階(time step)的方式,由於時間為連續的,若以一秒為單 位容易造成誤差,故以此方式將系統時間改成時階的方式,至於每一時階的長度 已經變數化,本模擬程式訂為 0.1 秒,若需要變更只需在程式最前面之 TIMESLICE 的值進行變動即可。
在模擬時間內進行多個副程式:drawRoad( ) 副函式為繪製高速公路車道以 及事故位置;drawlane( ) 為繪製在自動控制車道上移動的 AC 車輛及在一般車道 上移動的車輛,以及從自動車道變換成功之 AC 車輛都會繪製;P_laneTransition ( ) 為設定在自動控制車道上的車輛下一秒的移動,其間還會進行變換車道及搜尋 search _insert( )、check_trans( )、car_can_reach( )等等之副函式;Q_laneTransition ( ) 為設定在一般車道上車輛下一秒的移動,並且會做跟車行為副函式 cal_safe( );
在模擬時間結束後,藉由資料輸出副函式 showpq( )來輸出模擬資料。主程式 模擬流程圖如圖 4-1 所示。
程式中以建立資料結構 struct 分別代表所有的車輛資料,struct 分別包含了時 間、車輛種類、X 軸距離、Y 軸距離、速率、加速度、與前車車間距、與後車車 間距、三個門檻值,另外還建立有兩個指標變數(pointer),以鏈串列(link-list)的方 式來實作,分別針對兩個車道內之車輛進行串聯的動作,其優點為每輛車隨時以 指標變數指向其前車及後車,若要進行變換車道,則原本的車輛只要切斷其前後 指標,切換到鄰近車道之後,再建立起指標,車輛便可以重新排列。上述之 X 軸 距離為車輛前進行駛的距離,亦可稱為縱向距離;Y 軸距離表示車輛所位於之車 道,亦可稱為橫向距離。下列將說明各個主要函式之詳細內容:
圖 4-1 主程式 main( )流程圖 main( )
輸入資料
模擬時間開始 simu_time=0
車輛移動屬性 P_ laneTransition ( ) Q_ laneTransition ( )
END 否 是 模擬時間結束
資料輸出 showpq( ) 繪製道路及車輛
drawRoad( ) drawplan( ) 產生路段車輛 P_laneGenerator( ) Q_laneGenerator( )
1. Input
主要負責資料輸入,其設定主要是放入主程式 main( )中,參數修改部分包括 車隊大小設定、車隊初始速率設定、以及鄰近車道車流量。參數修改部分主要是 為了整合模擬使用者與程式可讀性之間的關係,將常用的 kph 單位轉換成 mps 單 位,以及將每小時每車道之車流量轉換成程式可讀之每分鐘車流。
本研究設定三個重要參數:車隊大小設定為欲瞭解車隊的大小對變換車道的 影響,模擬的大小範圍在每個車隊 2 至 10 輛之間;車隊初始速率設定為欲瞭解 車輛在不同的車速下對變換車道決策的影響,尤其事故影響下車行速率可能不 高,以及車輛在高速行駛下遇到事故的影響,故模擬初始速率的大小範圍在時速 40 km/hr 至 120 km/hr;鄰近車道車流量為欲瞭解鄰近車道車流狀況對變換車道決 策的影響,模擬範圍為每小時每車道 100 輛至每小時每車道 1800 輛,4.2 節將有 更詳細之說明。
2. P_laneGenerator( )
AC 車輛的產生以鏈串列(link list)來實作,鏈串列中有數個 node (車輛),每 一台車輛之間以指標連接,如果車輛需要改變車道,只要將指標指到的地方稍作 修改就可以達到變換車道的目的,而且每兩輛 MC 車輛之間可以插入多輛的 AC 台車。在 P_laneGenerator( )有個 next_car_time 變數,其功能猶如車時間距
(headway),我們藉由 AC 車輛需要保持的初始車隊車間距,除以初始設定的車隊 初速,來計算 AC 車輛產生的車時間距,其目的就是要顯示出自動公路系統乃是 以車隊的形式接近事故地點。程式中我們以車輛要保持 20 公尺的車間距(不含車 長,若計算車長,則車頭與車尾之車間距約為 16 公尺),故設定 next_car_time 為 AC 車輛產生的 headway。
另外,會有個 hittime( )的副程式,其功能為搜尋系統時間跟 next_car_time 一 樣的話,就會產生一輛 AC 車輛,而 AC 車輛的初始設定都完全一樣。接著會對 每台車作出初始設定:如初速、車輛種類、速率、加速度,並計算這台車的三個 門檻值(d, f, b)。
3. Q_laneGenerator( )
MC 車輛的產生方式與 P_laneGenerator( )的方式雷同,唯車輛產生的方式不 是為一秒產生一台 MC 車輛,而是 next_car_time 令它為 normal( )函式所回傳之 值,normal( )函式為常態分配,以鄰近車道車流產生率以每分鐘平均產生多少車,
轉換成產生車輛所需之秒數平均值,再經由常態分配來作為車間時距(headway)。
假設車輛初始流量符合卜瓦松分配 (若λ夠大,一般是以λ≥5,則分配可以用 normal 分配來近似),平均每分鐘釋放λ台車,因此將 60/λ作為 Normal 分配的平 均值(mean),變異數為 1,即以 Normal(60/λ,1)來釋放車輛。
4. drawRoad( )、drawlane( ):
此二函式為繪圖函式,以 Turbo C 內建之<graphics.h>函式庫,並建立副函 式 drawRoad( )繪製出三車道之直線,以斜線當作已知之事故地點,而繪製車輛的 部分則由 drawlane( )副程式來執行。由於螢幕只能容納 640×480 個像數,以一個 像數代表一公尺,故若要能夠在現有之電腦設備下觀看到整個模擬的效果,則模 擬之路段只能有 640 公尺。但若想要表達更長的車道長度,只要經過程式碼將比 例縮放(rescale),將現有長度 640 個像數來表示,縮放比例之後,車輛所行進的 距離等都不會變,只有在螢幕顯示成圖檔的時候會有視覺上的大小不同而已。
車輛的部分,為了區別自動車輛與手動車輛,故以顏色來區分,亮藍色為 AC 車輛,紅色則為 MC 車輛。特別一提的是,如果程式中判斷 AC 車輛可以變 換車道,則會顯示成紅色,並且執行加速或減速,在 TRANS_SECONDS 時間到 之後就會變換至鄰近車道,但還是會顯示原來 AC 車輛之亮藍色。
5. P_laneTransition ( )
此函式最主要為控制及計算在自動車道上行駛的車輛,自動車道上僅有 AC 車輛,故 AC 車輛在產生後便依照自己的三個門檻值(d,f,b)分別做其區域內該有之 行為,在車輛未進入車隊拆解區,則保持等速;進入車隊拆解區後,進行 cal_safe( ) 函式保持車距;進入跟車緩衝區之後,進行減速到與鄰近車道平均車速接近的 xxx 函式,並且進行變換車道評估 check_trans( )函式;最後,若進入了強制煞車區,
車輛以最大減速度煞車至停止。P_laneGenerator( )函式流程圖如圖 4-2 所示。
6. Q_laneTransition ( )
此函式最主要為控制及計算在一般車道上行駛的車輛,包括了原本行駛在一 般車道的 MC 車輛,以及變換車道成功的 AC 車輛。函式中主要是計算車輛在一 般車道的跟車行為,進行 cal_safe( )函式,另外車輛位置與速度則由 x_acc_car( ) 及 v_acc_car( )兩個副函式計算及設定。為了確保跟車行為及變換車道後的安全,
本研究特別加入碰撞偵測 collision( )副函式,若車輛造成碰撞的話,程式會停止 計算。
圖 4-2 P_laneTransition( )函式流程圖 P_laneTransitio( )
變換之車輛 是
判斷車輛位置
transflag=1
車輛屬性設定 x_acc_car( ) v_acc_car( )
Return 車隊
拆解 區外
否
車隊 拆解 區內
跟車 緩衝 區內
強制 煞車 區內
a = 0 cal_safe( ) 減速到與 鄰近車道 車速相等
a=-max_deacc
check_trans( )
進行變換車道 search_incert( )
7. showpq( )
以 fprintf( )將所想要之輸出資料鍵入,並於執行程式時將模擬結果輸出,輸出 方式以為建立一個 excel 檔,檔案設定為唯寫方式。建立為 excel 檔主要是輸出結 果整理方便,亦可由 Microsoft Office Excel 內建之繪圖功能,繪製所需之結果關 係圖。輸出之格式及詳細內容參照 4.4 節。
8.程式碼
程式碼如附錄 A 所示。