• 沒有找到結果。

第四章 程式模擬系統之發展

4.2 程式撰寫

程式中建立一直線三車道之高速公路路段,且三車道之車輛皆在不考慮車道變換 的情況下,以第三章所建構之跟車模式進行車輛行進模擬。

程式中主要以 main()控制模式整體的運作,在模擬時間內進行多個副程式,以 drawRoad()進行三車道高速公路的繪製、dawlane()繪製在道路上移動的車輛以及三個 laneGenerator()產生不同車道之車輛和以 laneTransistion()來進行各車道車輛的運行最 後再 show()輸出所需要之車流模擬資料。主程式的模擬流程圖如圖 4-1 所示,而對於 各個副程式後面會有較詳細之說明。

31

系統模擬時間採用時階(time step)的方式,由於時間為連續的,若以每秒為單位 容易造成誤差,因此以此方式將系統時間改成時階的方式,至於每一時階的長度已經 變數化,本模擬程式訂為 0.1 秒,若需要變更只須在程式最前面的 TIMESLICE 的值 進行變動即可。

每輛車輛以資料結構 struct *node 來代表,其中包含車輛 x 軸位置 y 軸的位置、

速度、加速度、車輛編號、駕駛視野縱深 dx、駕駛視野寬 dy、前方車輛和後方車輛,

以鏈結串列(Linked List)的方式進行,將三個車道車道內的車輛進行串聯,優點在於 可直接以指標變數指向或提取前方或後方車輛的資料,方便進行前後車輛相對距離、

相對速度等跟車模式常用之參數計算。簡要程式函式說明如表所示:

表 4-1 程式函數說明

函數名稱 函數說明

Main() 主函式

C_laneGenerator() 中央車道車輛產生函式

L_laneGenerator() 左車道車輛產生函式

R_laneGeneration() 右車道車輛產生函式

C_laneTransition() 中央車道車輛運行函式

L_laneTransition() 左車道車輛運行函式

R_laneTransition() 右車道車輛運行函式

check_car 計算中央車道車輛加速度函式

check_carl 計算左車道車輛加速度函式

check_carr 計算右車道車輛加速度函式

v_acc() 車速函式

x_acc() 位置函式

watchtime() 觀看系統時間函式

hittime() 呼叫與對照系統時間函式

checkvision() 計算駕駛視野中心和標準差函式

visionx() 計算視野邊界 x 座標函式

normal() 常態分配函式

GauProb() 二維常態機率函式

car_safe() 動態安全間距函式

32

drawroad() 繪製道路函式

drawlane() 繪製車輛函式

output() 輸出結果資料函式

以下將說明主要函式知詳細內容:

Input

主要負責資料輸入,其設定主要是放入主程式 main()中,參數修改部分包括每車 道車流量、大型車和小型車的車輛比例。輸入之每車道車流量為了配合一般使用者使 用習慣,輸入每小時每車道之車流量再由程式內部轉換成每分鐘之車流量。

本研究設定兩個重要的參數;每個車道的車流量,用以觀察了解車流量不同時,

對於車流整體運行時的影響,並且做為和其他變數改變時比較之基礎,模擬之車流量 分為:高流量 1600 輛/小時、中流量 1200 輛/小時、800 輛/小時;大小型車種比例,

為了觀察當增加大型車輛時對於車流狀況所造成的影響,模擬分為:不考慮大型車、

小型車大型車比 80:20、小型車大型車比 50:50。

C_laneGenerator()、L_laneGenerator()、R_laneGenerator()

為中央左右車道的車輛產生,車輛產生的方式是以鏈串列(link list)來進行,每個 鍊串會有數個車輛(node),每台車輛之間以指標進行連接,往後若車輛需要進行車道 的改變,只需要將指標指到的地方稍做修改即可達到變換車道的目的。

車輛產生的方式是將車間時距(headway)令其為 normal()函式所回傳之值,將車道 車流產生率以每分鐘平均產生多少車輛,轉換成產生車輛所需之秒數平均值,經由常 態分配來做為車間時距。車輛到達時間分配的形式決定首先假設是以卜瓦松分配的形 式來產生,而當平均每分鐘超過 5 台時,可以使用常態分配來近似,因此車輛的產生 是以平均每分鐘釋放λ 台車,將 60/λ 作為 Normal 分配的平均值,變異數為 1,來進 行車輛的產生。

33

C_laneTransition()、L_laneTransition()、R_laneTransition()

此副程式主要是用於控制道路上的車輛,使用第三章提到的跟車模式來計算車輛 的加減速以及進行跟車行為。其中由 checkvision()來決定目標車輛駕駛的視線範圍 dx 和 dy,並以 check_car()得到視線內的車輛併計算各車輛的心理權重值,進而求得目 標車輛的加速度。再代入 x_acc()求得車輛位置和 v_acc()求得車輛速度,laneTransistion 之流程由圖 4-2 所示。

check_car()、check_carl()、check_carr()

此副程式用於判斷車輛駕駛行為並且計算車輛的加減速,先判定車輛是否前方是 否有車輛,當確定此車為首車時,車輛會將速度調整為車輛其望速率。若不為首車則 以 dmin()計算動態安全車距,並判斷前方車輛是否小於動態安全車距,若為真,加速 度為最大減速度,若為否則判斷視線內車輛權重並計算車輛加速度。

34

圖 4-2 主程式 main()流程圖

35

圖 4-3 副程式 chek_car()之一般跟車行為流程圖

36

drawRoad()、drawlane()

此二函式為繪圖函式,利用 turbo C 內建之<graphics.h>繪圖函式庫,以 drawRoad() 來進行直線三車道之繪製,由於 dos 只能支援 640x480 像素,若想要觀看到正確比例 的模擬效果,則需要將每個像素代表一公尺,模擬之路段長度改為 640 公尺,但若想 要表達更長的車道長度時,還是可透過程式碼將比例進行縮放,來改變模擬車道的長 度。

車輛的部分則是以 darwLane()來進行繪製,配合 laneTransistion 得到車輛的位置 後,以填色的長方形方塊來表示,而大型車和小型車的表示,因為畫面像素的關係,

大型車和小型車在螢幕畫面顯示只會有車輛長度的不同,車輛的寬度看起來是相同 的。

show()

建立一個 excel 檔,並且以 fprintf()來決定想要輸出之資料,使用 excel 主要是出 於輸出結果整理方便,且可由 Excel 所內建之繪圖功能,繪製所需要的結果關係圖。

相關文件