第二章 文獻回顧
2.1 車流理論方面
2.1.1 跟車理論
跟車理論﹝Car-Following Thoery﹞為描述道路上行駛車輛間的相互關係,研究後車 如何跟隨前車的行為,主要經由跟車行為發生時,後車與前車間的速度、距離等的互動 關係,找出駕駛者在跟車時具有的共同反應,並將這些變數以方程式來加以描述。微觀 動態車流模式以 1950 年 Reuschel 與 1953 年 Pipes 提出之跟車理論(Car-Following)為主,
Gazis,Herman,Potts 則完整的說明跟車模式的基本理論和觀點。其基本假設為道路上 的車輛均相同且隨著一直線前進,跟隨的後車在行進中與前車保持一適當距離,以便突 發事件發生時可從容應變,為了保持適當距離,後車的行車速率必須隨著前方引導車調 整。
跟車理論模式之構建大都基於穩定狀態的假設下進行,但並非所有條件下跟車行為 都會達到穩定狀態,Gazis,Herman,Potts 等人則在發展模式同時亦探討引導車與跟隨 車互動之穩定性與達到穩定狀態之條件。Edie 將跟車理論與巨觀模式之連續方程式配合 一固定值。並依其模式導出一兩階段的車流模式以描述擁擠車流與非擁擠車流。
以往的微觀跟車模式主要可分成四類,如由前後車速差決定後車加減速的、考慮跟 車限制條件的、利用所建立的規則決定後車加減速的、或是認為在不同的速差及間隔下 其決策應不同應予以分區的。以下將針對這幾類跟車模式的代表性模式做一簡介:
1.刺激反應方程式[1][2]
此方程式乃假設車輛在未超車或變換車道之狀況下,由駕駛動力模式 (Driving Dynamic Model)推導而來,並引入下列觀念:車輛在 (t +T) 時之「反 應」 ,為 t 時之「刺激」與「敏銳度」之乘積,其中「反應」是以本車之加減速 來表示, 「刺激」是以與前車之相對速度表示, 「敏銳度」則視模式應用特性不同 而有所差異。
&& ( ) & ( )
( ) ( ) & ( ) & ( )
'
x t t x t t
x t x t x t x t
n
n
m
n n
n n
+ +
+
+ = +
+− −
1
1 1
Δ α Δ
1(1) 其中,x 為距離、t, t Δ :為時間及時間差、n 為車輛順序、α 敏為敏銳度、
m,l 為乘冪在不同 GM 模式下其值不同。在穩定狀態下,不同之 m、l、值可得到 不同的巨觀車流模式。
2.模糊推論模式[3]
由於真實的駕駛行為並非如刺激反應方程式所描述的為確定性行為,且原來 的刺激反應方程式隱藏著初始狀況即為穩定狀況的模式缺陷,再加上其只有單一 刺激源無法解釋某些車流現象(如:shying-away、closing-in) ,故 Chakroborty 等 人提出一模糊推論模式,將車間距、相對速度、前車加速度等三項數值模糊化,
並建立 396 條模糊規則,利用模糊推論引擎(Fuzzy Inference Engine)得到後車 的加減速。此模式的特點為利用模糊邏輯描述駕駛的感受及反應,在某一狀況下 可能對應一種以上的反應結果,對駕駛行為的描述也更貼近自然。
3.四大跟車限制式[4]
此模式係假設車流在推進過程中,前後車之間必須保持一最小安全間距,以
使後車能夠在前車車尾後方安全地跟隨行進或煞停,而不致於追撞前車,通常用
以模擬路段之車流行為。在車輛之推進方式上,主要考慮四種限制:間隔限制
(Spacing Restriction)、加速限制 (Acceleration Restriction)、停止限制 (Stopping
Restriction)、轉彎限制 (Turning Restriction)。在考慮前述四項限制條件後之最小
行駛距離,即為車輛在單位時間內所能前進之距離,據此更新輛座標位置與車
速,此即為該模式跟車處理之方式。
4.行為門檻模式[5]
此模式係認為當跟車駕駛者感知到前車與自身之間距及相對速度差異過大 時,會加速接近前車以縮短間距,逐漸由不受影響駕駛範圍進入受影響駕駛範 圍;當跟車駕駛者感知到過於接近前車不安全時,則減速以加大間距;減速後之 間距若不合跟車駕駛者之期望則再加速,而若本車與前車距離太大時,後車則完 全不受前車之影響。整個系統就在本車不斷加減速的自我調整過程中達到穩定跟 車狀態。此種駕駛行為會表現出兩種的特有的跟車現象:(1) 跟車過程處於一微 幅振盪調整之間距與速差系統中;(2) 在各反應狀態下,具有如拋物線形之感知 門檻界限,如圖 2-1 所示。
間隔
反應門檻
反應門檻
受影響駕駛 不受影響駕駛 (自由) dx
-dv +dv
速度差異 間隔變大
速度差異 間隔變小
圖 2-1 同一車道前後車之相對運動過程示意圖
Wiedemann(1974)將此「心理—物理間距模式」 (Psycho-Physical Spacing Model)之觀念引進微觀車流模擬裡,構建數學化模式(INTAC Model) ,即為
「行為門檻模式」(Behavioural Threshold Model) ,亦可說是一種跟車決策模式
(Car-Following Decision Model)。模式基本假設仍為單一車道,不考慮變換車道情
形,將車流狀況分成三個反應區:感知反應區(Perceived Reaction)、無意識反應
區(Unconscious Reaction)、無反應區(No Reaction)。經過各感知門檻界限之區隔
後,可再細分為各決策行為分區,如圖 2-2 所示。
變大 變小 2.1.2 中觀車流模式-Boltzmann-like 模式
波茲曼輸運方程(Boltzmann Transport Equation)原本是用來描述氣體分子運動的
狀況,Prigogine等人[6]則將其應用在車流中用以描述車輛隨著時間改變的位置及速度分
f
scattering
為外,並能將道路環境納入模式中考慮,使其更能反應出真實車流受彼此干擾影 響的推進行為。在車輛的推進上,其係利用模糊理論來模仿駕駛人於真實世界中 之思考、決策過程。
4.類神經網路法[18]
其係將機車推進模式區分為縱向推進與橫向推進兩部分,並以類神經網路模 型構建機車推進的邏輯,其中縱向推進模式有相當不錯的績效,但在橫向推進的 部分,由於機車的變動性過高,而可隨意變換進行方向,雖經過不斷的嘗試與訓 練,但類神經網路卻始終無法達到收斂。
2.2 演算法方面
1.基因演算法(Genetic Algorithm)
解決最佳化問題(optimization problem)的方法可分兩種。一種是針對某些 系統特性所發展出來的,因此目標系統必須滿足這些特性,例如線性或可微分 等。而另一類則是一般通用型的法則,可以不用隨著系統特性而修改設計。這類 方法雖然效率沒有前者高,但卻有較廣泛的應用範圍與彈性,基因演算法便是屬 於此類。基因演算法的概念是由Holland教授於 1975 年提出[13],大概是目前演 化式計算當中最為人所熟悉的項目。它模擬自然界中物競天擇、適者生存的演化 法則,將參數視成大自然中的個體,經由演化的機制:交配(crossover)、自我 複製(reproduction)與突變(mutation) ,讓這些參數彼此競爭,使表現不好的個 體遭到淘汰,好的個體則有機會交配或複製以產生新的個體,嘗試演化出更好的 參數,以試圖搜尋出問題的最佳解答。
2.分類元法(Classifier System)[19][20][21][22]
「分類元系統」是一種以規則為基礎單元、規則間有訊息傳遞、可以大量平
行處理的學習機制。在系統架構上,為了強化相互傳遞訊息的規則間之聯結,它
以筒隊接力法(bucket brigade algorithm)解決系統中報酬分配(credit assignment)的
難題。為了使系統能自發創造新規則,它將專家系統中原有的符號規則修改為,
可用遺傳演算法演化的基因規則,稱為分類元。整個系統的運作機制就建立在,
大量的分類元互相傳遞訊息與交換報酬以進行演化上。一個分類元必須提供報酬
才能獲得所需的訊息,然後藉由本身的反應提供轉化後的新訊息以獲得報酬。分
類元所累積的報酬,就是它在系統演化中的生存適應度。只有在訊息傳遞過程中
賺得報酬的分類元才有機會生存。在系統組成上,系統輸入界面提供由感測外界
環境而來的原始訊息,系統輸出界面提供由調控環境而得的原始報酬,系統佈告
欄提供類似一公開拍賣市場的功能,讓分類元間可以透過系統佈告欄買賣交換訊
息。因此整個系統機制很類似一個自由經濟市場的運作,所有在演化中獲利的分
類元群共同自我組織一個訊息貿易網絡,而使系統能自發適應環境,達成機器學
習的目的。
第三章 研究方法與理論基礎
本研究旨在應用分類元法以建立高速公路微觀動態車流模型。研究方法上主要採用 文獻評析法、攝影調查法、統計分析法、分類元法及模式參數校估法等。
至於理論基礎方面,則有微觀動態車流理念、刺激-反應原理、跟車理論、行為門 檻、駕駛行為理論(變換車道)等。由於高速公路微觀動態車流模式之開發與驗證之研 究,國內研究尚待積極開發該方面研究少,因此本研究所採用之研究方法與理論基礎,
經過文獻評析與初步討論,計劃以上列之研究方法與理論做為研究基礎。
3.1 研究方法
3.1.1 文獻評析法
藉由暨有相關研究文獻蒐集,針對所欲了解之研究主題、研究方法與理論基礎、研 究流程與架構及其結論與建議作回顧與評析,了解其中的差異性與各研究之優、缺點及 焦點特長所在,以作為本研究進行的參考方向。
3.1.2 攝影調查法
藉由高速公路現場攝影資料蒐集,取得確實的現場車流相關資訊,再經由事後的影 像調查及資訊轉換以得到所需的實際車流相關資料,並經過統計分析後與暨有資料作比 對以了解資料的正確性,最後將所得車流資料用於系統模式之架構與驗證。
3.1.3 統計分析法
利用數學上的統計分析法,針對攝影調查後所得到的車流資料作初步的統計分析與 檢定,藉以確定所得車流資料能符合高速公路的實際狀況,避免使用錯誤的資料建立出 不合實況的系統模式。
3.1.4 分類元法 3.1.4.1 基本原理
Classifier system 是一種 adaptive rule-based system,具有 machine learning 的能力,
甚至可以在以下的環境中運作良好:
1.外界資訊不斷產生並改變,甚至伴隨著雜訊(noise) 。
2.系統須一直對變動的環境作出正確甚至是即時(real-time)的反應,例如機器人。
3.目標是隱含的或未明確地定義。
4.外界的回饋(payoff)較少,甚至要等到一連串的步驟後才能得到,例如下棋。
圖 3-1 Classifier system 之架構
Classifier system 可從變動的外界環境中學習到複雜的規則,並逐步調整增強自己 的內在知識。與 genetic algorithm 相比較,classifier system 要複雜許多。Genetic algorithm 中每條染色體就代表問題的一個解,互相競爭,classifier system 中的每條 rule 在競爭 之餘也能互相合作,協力推論出一個有用的解答。因此它具有優異的計算能力,能夠 模擬許多難解的非線性複雜系統(complex system) 。Classifier system 的架構如圖 3 所 示,接下來我們探討其組成單元與運作模式。
Classifier system 大致上由下列單元所組成:
1.message:
是一個固定長度的二進位字串,可以用下式表示:
2.bulletin board:
也可稱 message list,為系統內專門放置 message 的地方。
3.rule:
也可稱為 classifier,其型式為:
而其中的 condition,型式則為: condition 中出現 的#符號代表 don't care,也就是到時與 0 和 1 都能吻合。另外,condition 可以 是單個,也能有多個。action 則與 message 具有相同的型式。
4.rule list:
放置系統內的所有 rule。
5.detector:
detector 將外界資訊轉換成 message 傳入系統的 bulletin board 中。就如同眼 睛接收到外界光線刺激後,將光線轉換成電流脈衝的型式送到大腦。
6.effector:
effector 會從 bulletin board 中擷取本身需要的訊息,根據其內容指揮系統產 生相對應的動作以影響外在環境。這種情況就類似大腦作出決定後,發出訊號控 制手部肌肉完成想作的動作。
3.1.4.2 分類元運作流程
Classifier system 運作的流程如下:
1.detector 偵測外界的環境變化與狀況,轉換成相對應的 message 張貼到 bulletin board 中。
2.所有 bulletin board 中的 message 都會被每條 rule 以其 condition 部分來相比對,
若有吻合,則該條 rule 就會被觸發(activate)。
3.每條被觸發的 rule,都會以叫價競標的方式,與吻合同一 message 的其它 rule 競 爭。力量越強或具體性越高的 rule,就越有機會出較高的價錢而得標。
4.清除 bulletin board 上舊的訊息,並由競標勝利的 rule 張貼他們的 action 部分到
bulletin board 上,成為新的訊息。如果被標回的 message 當初是由別的 rule 所張 貼的,則這些 rule 會付款給之前提供這些 message 的 rule。由 detector 張貼的 message 稱為 external message,由 rule 張貼的則稱為 internal message。
5.此時 effector 檢查 bulletin board 上是否有符合自己所需的 message。若有則將其 取下,並根據其中訊息產生相對應的動作。
6.重覆以上步驟。
3.1.4.3 分類元的功勞分配(Credit Assignment)
不同於其他眾多競爭式的演算法系統往往一次只能採用一種條件,在 classifier system 中各 rule 會互相合作並一起影響最後的執行結果。由於在 classifier system 中各 rule 會互相合作,因此決定如何分配彼此間的功勞是很重要的。最簡單的方法,就是當 某條 rule 產生了能使 effector 作出正確動作的 message,effector 便給予這條 rule 正的回 饋。然而單只採用這種方法雖然簡便卻不公平,因為尚需考慮到這個決策的完成是靠先 前許多條 rule 前後以 message 溝通而完成的,只獎賞最後一條 rule 並不合理。以下棋為 例,下棋到最後獲得勝利時,並非只只為最後一個”將軍”棋的功勞就能取得,尚需靠先 前一連串正確的下棋步驟來決定,故從一開始的每一步都會對最終棋局有所貢獻,而不 只是最後將軍的那一著棋就能帶來勝利。因此 classifier system 採用桶隊接力演算法 (bucket brigade algorithm)來進行功勞分配。首先每條 rule 都有力量(strength)與具體性
(specificity)這兩個數值,具體性代表 rule 中非#字元的個數。當 rule C 發現 bulletin board 中有所需的 message 時,會依下列的公式出價:B(C,t)=c'S(C,t)'R(C)(2.1)其中 c 為一 個介於 0 與 1 之間的常數,S(C,t)代表 rule C 在 t 時刻的力量,R(C)代表 rule C 的
specificity。c 存在的理由,是控制 rule 每次叫價只出手中籌碼的一部分,而非孤注一擲。
當 rule C 競標成功後,其力量強度變化為:S(C,t+1)=S(C,t)-B(C,t)而當初提供該 message
的 rule C'力量強度變化則為:S(C',t+1)=S(C',t)+B(C,t)因此,當一個 rule 在競標過
程中若出了最高價贏得張貼訊息的權力,雖然它失去了些許力量,但若它所張貼的
message 被其它 rule 所用到,則可以得到下一條 rule 的標金以作為回饋。但若張貼的
message 不好,沒有其它 rule 想用,則這條 rule 無法得到回饋,力量便會被削減。另外,
若張貼的 message 被 effector 所需,則 effector 會根據產生的動作在當時環境下是否適 當,來獎賞或懲罰該 rule。這種情況可以舉個現實生活中的例子來說明。各 rule 就像各 工廠的生產者,當 detector 將外界訊息轉換成原料輸入系統後,各家工廠便開始喊價。
得標的工廠就能取得原料,經過加工處理後再放出來。這時若有其它工廠需要這材料,
便會付費跟它購買,並加工製成更進一步的產品;反之,若生產出來的產品不受歡迎而 銷不出去,這間工廠便會因無法回收成本而資本逐漸減少。這種過程一直持續下去,直 到當初的原料被某工廠製造成最後的完成品,此時 effector 就像是消費大眾,會根據產 品的好壞,來決定是否購買。這樣一來,上下游廠商會形成一條環環相扣的生產線,有 點像古早時代人們救火時排成一列傳遞水桶的隊伍,這就是 bucket brigade algorithm 此 名稱的由來。除了這套功勞分配的法則之外,classifier system 還有套稅收機制來調整各 rule 的力量強度。首先,系統會在固定的時間間隔對每條 rule 收取生命稅(life tax) ,這 是為防止有些 rule 在族群中佔了一個位置,卻一直不參加競標,沒有對系統整體的決策 作出貢獻,因此用這種方法對其施加生存壓力,使沒表現的 rule 慢慢變弱,終至被淘汰。
除此之外,每條 rule 在競標時都會被收取叫價稅(bid tax) ,這是為了避免有些 specificity 較低的 rule 因為其 condition 能符合較多的 message,便盲目地參加許多 message 的競標。
3.1.4.4 發掘新規則(Rule Discovery)
當 classifier system 運轉一段時間之後,各 rule 的力量會被削減或增加,但還需要 一套機制,來引入新的 rule,及淘汰表現不好的 rule。本研究擬將所有可能作用之 rule 依其發生之可能性大小給予其一權重值,並隨時間經過從已淘汰的 rule 中依其權重比例 隨機取回,以符合交通事故發生可能之現實狀況。
3.2 理論基礎
3.2.1 微觀動態車流理念
車流為交通運輸領域中發展長久的理論基礎之一,早期主要的研究可分為巨觀及微
觀等兩個不同部份探討,而發展至近期則開始有學者提出中觀車流的概念,使車流理論 在發展上更臻完善。本研究主要是應用分類元法針對高速公路上之單一小客車駕駛作行 為上的模擬,因此主要的理念依據為微觀動態車流理念。微觀動態車流理念是將每一部 車皆視為獨立而進行探討,其主要在探討行駛車輛間的相互影響與車流特性間的關係。
車輛間距(Headway)為微觀車流理論中主要探討之車流特性,車輛間距會影響交通 安全、服務水準、駕駛行為與交通系統容量。因此車間距為本研究的重要因素之一。
3.2.2 跟車理論
跟車理論中發展較久且廣為採用的主要有四大限制方程式、刺激-反應原理、行為 門檻模式等理論,其詳細內容如前章文獻所提述。其中所探討的主要影因素有車輛間 距、加速限制、停止限制、轉彎限制等。理論上應用分類元法應可涵蓋所有的考慮變數,
唯礙於進行現場攝影調查時某些變數無法實際取得其確定值,故需加以省略。本研究預 可應用的因素為車輛間距、加速限制、停止限制等三項。
3.2.3 駕駛行為理論
駕駛人本身的習慣及認知向來是最難研究但卻又影響整體車流行為至深的一環,然
而礙於其調查偶驗證上的困難,故其結果可信度仍有待保留。本研究預計採用駕駛行為
影響因素中的「風險愛好程度」一項,配合行為門檻模式理論以實際可能產生危險的程
度嘗試對駕駛者行為作出分類。
第四章 高速公路行為現況分析
4.1 車流攝影資料分析
現場車流資料的蒐集與轉換為可用資料時,兩者間的正確性將直接影響整個研究的 可靠度,故本節將詳述所用來進行模式構建與驗證的相關資料取得方式,說明本研究所 得到的車流相關資料可代表現況。
4.1.1 攝影地點與調查範圍
本研究所分析資料來源為「國道高速公路行車控制中心」所架設之攝影機,所選定 之路段為中山高速公路 99k 南下路段,調查時段為非假日 15:30~16:30 時段。調查路段 及時段之選定主要是考量到該路段需為平順無坡度的直線路段,具有一定的車流量,且 其攝影範圍所含蓋的路段長度需大於 150 公尺以上。調查時段則是選擇於調查時段內車 流量會發生由未飽和至飽和甚至過飽和的時段。另外,考量到影像的清析度及避免車流
圖 4-1 攝影調查範圍示意圖 6 公尺
4 公尺
受到交流道的影響,觀察的範圍如圖所示,觀察範圍長度 110 公尺。包含有三個車道。
調查對象為所有車種,但僅將其區分為小汽車(包含休旅車)及其他(包含小貨車及其他更 重型車種)。
4.1.2 調查方式
在還原攝影資料為真實資料方面,本研究主要是利用交通部與內政部合訂公佈的
「道路交通標誌標線號誌設置規則」第一百八十二條中所規範之「…線段長四公尺,間 距六公尺,線寬一0公分…」為尺度轉換的依據,將攝影資料中的各車道線作出網格狀 座標,再找出每一區間與實際距離間的轉換公式,並在完成座標距離轉換後進行測試,
以每一相臨車道線之中點為準,進行距離推估,得到之誤差皆在 10 公尺之正負 1 公尺 以內(10%以內),且誤差之絕對值不隨著攝影畫面上的距離而有所改變,故證明在座標 轉換上具有一定之可信度。其座標轉換測試結果如表 4-1、4-2。
表 4-1 推估轉換與實際距離比較表
實際距離 10 10 10 10 10 10 10
轉換推估所得距離 10.42 9.67 10.46 10.16 10.16 9.89 10.12
表 4-2 推估轉換與實際距離比較表 2
實際距離 20 20 20 20
轉換推估所得距離 20.084 20.625 20.040 19.811
4.1.3 調查結果
本次調查結果為 14 分鐘內之連續車流狀況,共計有 1520 筆資料,400 輛車,其詳 細資料如附錄一。由於速度的取得需要同一車輛相臨兩筆距離資料,而加速度則需三 筆,再輔以考量於高速道路上,一般車輛通過 110 公尺不超過 5 秒(以時速 80km/h 計),
故於所觀察範圍內的同一車輛其資料筆數約為 5 筆。且經過初步分析後,同一車的資料
於進入觀察範圍內至離開,其跟車距離差異大都小於 5 公尺,速度差異大都小於 5km/h(約
1.39m/s),故本研究將同一車輛於觀察範圍內之運動視為均一個體之等量運動,將同一
車輛的所有資料予以平均後得到結果如附表三。
4.2 資料統計與特性分析
經由現場攝影調查法所得車流資料相關統計結果如表 4-3~表 4-6。綜合車流資料中,最 高車速為 128.84(公里/小時),發生在外車道,車種為小客車。最低車速為 61.14(公里/
小時),發生在外車道,車種為其它。最大跟車間距為 77.46(公尺),發生在中車道,車 種為小客車。最小跟車間距為 11.32(公尺),發生在內車道,車種為小客車。最高加速度 為 8.67(公里/小時平方),發生在外車道,車種為其它。最高減速度為 32.83(公里/小時平 方),發生在中車道,車種為小客車。在各車道上,小客車平均車速皆高於其它車種,
最高及最低跟車間距也都發生在小客車上。於平均車速上,不論車種,內車道平均車速
>中車道平均車速>外車道平均車速。於平均跟車間距上,不論車種,外車道平均跟車間 距>中車道平均跟車間距>內車道平均跟車間距。於車種與車道關系方面,內車道以小客 車為主佔大多數,中車道小客車與其它車種數輛比約為 3 比 1,外車道則以其它車種為 主,小客車與其它車種數輛比約為 1 比 3。由前述統計相關資料對照實際上法律規定相 關行車限制可知,本研究經由調查所得到的前述車流資料符合實際狀況,故可供後續模 式構建及驗證之用。
表 4-3 跟車間距統計資料表(公尺)
車道 車種 平均跟車間距 最大跟車間距 最小跟車間距 全部 全部 37.86 77.46 11.32
全部 34.37 56.09 11.32 小客車 35.62 56.09 11.32 內車道
其他 17.69 18.74 16.48 全部 38.49 77.46 12.86 小客車 41.18 77.46 12.86 中車道
其他 32.99 52.07 19.09
外車道 全部 56.05 72.42 44.21
小客車 61.15 64.70 57.59 其他 53.50 72.42 44.21
表 4-4 車速統計資料表(公里/小時)
車道 車種 平均車速 最大車速 最小車速
全部 全部 87.98 128.84 61.14 全部 90.28 128.84 76.96 小客車 90.31 128.84 76.96 內車道
其他 88.25 88.29 88.21 全部 89.13 108.77 75.04 小客車 89.42 108.77 75.04 中車道
其他 88.29 96.46 76.75 全部 82.25 128.56 61.14 小客車 86.21 128.56 69.51 外車道
其他 81.13 101.54 61.14
表 4-5 加速度統計資料表(公里/小時平方)
車道 車種 平均加速度 最大加速度 平均減速度 最大減速度 全部 全部 1.73 8.67 -3.13 -32.83
全部 1.80 6.47 -2.21 -8.37 小客車 1.80 6.47 -2.24 -8.37 內車道
其他 無資料 無資料 無資料 無資料
全部 1.47 4.54 -3.66 -32.83 小客車 1.26 4.54 -3.55 -32.83 中車道
其他 3.44 4.23 -3.92 -8.49
全部 2.00 8.67 -3.57 -14.34 小客車 1.49 1.77 -2.46 -4.96 外車道
其他 2.07 8.67 -3.88 -14.34
表 4-6 車種及車道分佈狀況表 車道別
車種 內車道 中車道 外車道 小計
小客車 230 196 33 459
其他 3 69 110 182
小計 233 265 143 641
第五章 分類元微觀動態車流系統架構
5.1 系統運作流程
微觀車流所發生的各種變化其最主要的變因來自於駕駛人的駕駛行為不同所致,故 要架構出符合實際車流情況的系統可依循駕駛者的駕駛思考流程與行為來建構系統,以 冀望能得到接近實際情況之模式。本研究初步擬定採用之駕駛者思考流程假設如下:
1. 決定本車期望速率(依不同駕駛者習慣、目的、行駛路段限速、路型等因素有 關)。
2. 本車所在車道狀況。
甲、前車狀況(相對車速、車距、車種等因素)。
乙、後車狀況(相對車速、車距、車種等因素)。
丙、決定採取等速、加速、減速或變換車道等行為。
3. 若決定採取變換車道。
甲、若兩側皆有車道,則以左車道優先觀察,再觀察右車道。
乙、若只有左側車道(右側車道)則觀察左側車道(右側車道) 。 4. 所觀察車道之行車狀況。
甲、觀察左車道行車狀況是否比現車道佳(若否,則直接觀察另一車道) 。 乙、前後車間距離變化。
丙、觀察前車與本車距離變化。
丁、觀察後車與本車距離變化(先觀察前車還是後車僅作假設) 。 戊、決定是否變換車道。
己、若不變換則觀察另一車道(僅有左(右)車道能變換者無此步驟) 。 庚、若兩旁車道皆不能變換則維持原車道。
根據所擬定之思考流程可得出系統概念流程圖如圖 5-1。
圖 5-1 系統運作流程圖 5.2 系統運作範例
考量到國內尚未有運用分類元法於車流方面的相關研究,本研究先根據前節所提架 構擬定一簡單系統模式運作流程範例,以了解分類元法運用在高速公路微觀車流模式之 可能性。而考量到現場攝影所能蒐集到的資訊完整性,各階段所執行步驟將隨研究發展
環境資訊的提供
前後車距離,前後車相對速度,左右 車道狀況(前後車距、相對速度),車
種,路況、天氣狀況等
駕駛資訊的提供
風險愛好程度、對車輛的認知程度 (是否為自用車)、駕駛年資、車輛廠
牌(性能因素)等
跟車行為決策
變換車道行為決策 前車相對速度、距離
後車相對速度、距離 本車速度、道路速限、
駕駛個性、車況
決定加、減速行為(或是 決定變換車道)
左車道之狀況(前後車 距、相對速度)
右車道之狀況(前後車 距、相對速度)
決定所要變換的車道 本車速度、道路速限、
駕駛個性、車況
決定所採取的變換車道 策略(角度、速度、加減
速)
循環
依決策結果作出反應,
並和實際結果進行比對
後進行獎懲
進行調整。
1.分類元初始值設定
步驟一:決定 Rule 群 1 的格式。
格式:本車車速|期望車速/是否採取變換車道流程
步驟二:系統隨機產生期望速率之母體群 100 組(介於 60~110 之間) ,每組給予 同樣之 ST。假設初始 ST=10。
步驟三:每次出價比例(佔總持有產財率) :0.5 生命稅:1(每次競價後收取)
獎勵值:5+該次出價值 懲罰值:5
2.第一階段(變化車道動機)
步驟一:第一次假設有四組 Rule 符合環境條件規則,且因為 Rule 強度均相同,
故四個 Rule 出價皆相同(5),此時隨機取出一個 Rule 作得標者。
步驟二:進行所有 Rule 之 ST 調整。
步驟三:所有參與出價者收取叫價稅 5。
步驟四:所有 Rule 收取生命稅 1。
步驟五:針對得標者反應行為輸出與實際環境狀況作比較,並依其結果優劣作相 對應之獎懲。
步驟六:進行下一環境目標之比對。
本階段 Rule 假設判斷邏輯如圖 5-2,各 Rule 之力量值(ST)變化狀況範例如 下表 5-1~表 5-3。
1011010|1100100/0 (90|100/不變換車道)
1010101|1101001/1 (90|105/變換車道) 1100100|1010000/1
(90|80/變換車道)
1101001|1011010/1 (90|90/不變換車道)
依常理,假設此兩者為錯誤的 Rule
1. 其經由 effector 驗證後發現不符合實際情況 給予懲罰 5,故其最終 ST 為-1 而力量變弱。
2. 經由 GA 產生一個新的 Rule 補充,其 ST 設 為初始值。 (也可設定不足 90 組時再補充)
依常理,假設此兩者為正確的 Rule
1. 經由 effector 驗證後發現符合實際情況(雖 然預期車速為虛擬值,但假設其符合邏 輯),故給予獎勵。
2. 其 ST 變為加上所出價格再加 5=14
圖 5-2 系統範例 – 系統分類元運作概念流程圖 1
表 5-1 第一階段各參數初始值
Rule 編號(A 群) Rule 內容 ST SP Iteration 1 90|100/不變換車道 10 14 0
2 90|80/變換車道 10 14 0
3 90|105/變換車道 10 14 0
4 90|90/不變換車道 10 14 0
5~100 XXXXXXXXXX 10 14 0
表 5-2 第一階段完成後之獎勵(以”90|105/變換車道”得標為例) Rule 編號(A 群) Rule 內容 ST SP Iteration 1 90|100/不變換車道 4 14 1
2 90|80/變換車道 4 14 1
3 90|105/變換車道 14 14 1
4 90|90/不變換車道 4 14 1
5~100 XXXXXXXXXX 9 14 1
表 5-3 第一階段完成後之懲罰(以”90|80/變換車道”得標為例) Rule 編號(A 群) Rule 內容 ST SP Iteration 1 90|100/不變換車道 4 14 1 2 90|80/變換車道 -1 14 1
3 90|105/變換車道 4 14 1
4 90|90/不變換車道 4 14 1
5~100 XXXXXXXXXX 9 14 1
3.第二階段(決定變換之目標車道)
假設上列情況中,由(85|105/變換車道)此一情況延續下來,下一步驟是進行
鄰近車道狀況評估。
步驟一:決定 Rule 2 格式。
85|0|100|5/是 85|0|100/50/是 85|0|90|5/否 85|0|80|50/否
Rule 編號(B 群) Rule 內容 ST SP Iteration
1 85|0|100|5/是 10 x 0
2 85|0|100/50/是 10 x 0
3 85|0|90|5/否 10 x 0
4 85|0|80|50/否 10 x 0
9~100 XXXXXXXXXX 10 x 0
表 5-5 第二階段完成後(以 85|0|100/50/是變換車道得標為例)
Rule 編號(B 群) Rule 內容 ST SP Iteration
1 85|0|100|5/是 4 x 1
2 85|0|100/50/是 14 x 1
7 85|0|90|5/否 4 x 1
8 85|0|80|50/否 4 x 1
9~100 XXXXXXXXXX 9 x 1
表 5-6 第二階段完成後 Rule 1 參數變化
Rule 編號(A 群) Rule 內容 ST SP Iteration
1 85|100/不變換車道 4 14 1
2 85|80/變換車道 4 14 1
3 85|105/變換車道 15(原為 14) 14 1
4 85|90/不變換車道 4 14 1
5~100 XXXXXXXXXX 9 14 1
5.第三階段
此階段可依據變換車道後的情況來進行前兩階段的 Rule 之連鎖獎懲。在此
假設於第二階段完成變換車道後並未再進行下一階段的變換車道行為,且前車速
度假設保持 100km/h 不變,代表實際上駕駛所能接受的速度為 100km/h 左右,但
無法準確的得知其變換車道前的預期速度(亦即原本可能希望要變到 105km/h,但
在實際上不論怎麼變都無法達到-環境因素),故可對其連鎖獎勵方式採用如
「ST’=ST+5/|(實際車速-期望速率)|」的方式,依第一階段所產生的期望速率與最
Rule1 格式:本車道代碼|本車車種|本車車速|前車車種|前車車速|前車車距|
後車車種|後車車速|後車車距 Action1:加速、減速、等速
可能解空間:3*2*16*2*16*16*2*16*16*3 = 75,497,472
2.模式二:同模式一,考量本車、前車及後車環境條件,但於前車車速及後車車速部份 改採用相對車速的概念,冀望藉此減少可能解的空間,縮短尋解的時間。其 中「本車車速-前車車速」及「本車車速-後車車速」分成大於 0(本車車速大於 前後車)、小於 0(本車車速小於前後車)及等於 0(本車與前後車車速相等)三種 情況。
Rule1 格式:本車道代碼|本車車種|本車車速|前車車種|本車車速-前車車速|前 車車距|後車車種|本車車速-後車車速|後車車距
Action1:加速、減速、等速
可能解空間:3*2*16*2*3*16*2*3*16*3 = 2,654,208
3.模式三:考量到駕駛者本身如果是受到前後車的影響而進行被動的加、減速影響,則 本車的條件對於決策反應的影響不大,故本模式省略本車環境條件。其中「本 車車速-前車車速」及「本車車速-後車車速」分成大於 0(本車車速大於前後 車)、小於 0(本車車速小於前後車)及等於 0(本車與前後車車速相等)三種情況。
Rule1 格式:前車車種|本車車速-前車車速|前車車距|後車車種|本車車速-後車車 速|後車車距
Action1:加速、減速、等速
可能解空間:2*3*16*2*3*16*3 = 27,648
4.模式四:同模式三的考量,大多數情況下,駕駛本身於跟車行為中受到前車的影響最 為直接,故將本車、後車環境條件同時省略而建構出本模式以同模式三作比 較。其中「本車車速-前車車速」分成大於 0(本車車速大於前車)、小於 0(本 車車速小於前車)及等於 0(本車與前車車速相等)三種情況。
Rule1 格式:前車車種|本車車速-前車車速|前車車距
Action1:加速、減速、等速 可能解空間:2*3*16*3 = 288
上述各模式一、二、三及四間雖有不同的 Rule 規則,然而其在演算法方面皆採取 相同的訓練、驗證與預測流程,相關流程步驟主要如下圖 5-5~圖 5-8,其主要步驟為:
1.應用基因演算法產生初始的 Rule 群共 x 群,每一群 Rule 可指定其擁有 y 個 Rules。
2.目標車輛與前後車輛相關參數輸入及參數編碼。
3.將編碼後車流樣本參數依序取出。
4.針對所取出的車流資料,從相對應的 Rule 群中依序取出 Rule 中的條件部份和其作比 對是否符合。
5.將所有合格的 Rule 放入競標群中,並依其 ST 進行出價,同時從 ST 中扣除其出價金 額。
6.對所有 Rule 索取生命稅。
7.由合格 Rule 群中取出標價最高的一個,若有數個同樣標價者,隨機取出一個最得標 者。並將得標者其 Rule 中所指示的”動作”部份和實際結果作比較是否符合以進行適當的 獎勵與懲罰。
8.重覆執行到滿足收歛條件後結束此次訓練過程。
圖 5-5 用於驗證之訓練流程 應用基因演算法產生
初始的 Rule 群共 x 群,
每一群 Rule 可指定其 擁有 y 個 Rules。
目標車與前後車輛相關參數輸入 相關參數編碼
將編碼後參數取出第 n 筆資料,從 n=1 開始。
針對第 n 筆資料,從相對應的 Rule 群中,由第 1 個 Rule 開始 取出,並和第 n 筆資料作比對其 條件部份是否符合?
符合 不符合
將此 Rule 放入競標群中,並依其 ST 進 行出價,同時從 ST 中扣除其出價金額。
對此 Rule 索取生命稅。
本次取出之 Rule 是否為 Rule 群中的最後一個?
是
否,取出下一 個 Rule 取出標價最高的一個,若有數個同樣標價者,隨機
取出一個最得標者。並將得標者其 Rule 中所指示 的”動作”部份和實際結果作比較是否符合?
是
將本 Rule 之 ST 予以適 當的獎勵
否
將本 Rule 之 ST 予以適 當的懲罰
否,取出下一個環 境條件
本環境條件不是最後一個?
結束此次訓練過程 是
本 Rule 群中 ST>0 的 Rules 數目是否不足?
是,運用基因演算 否
法產生新 Rules
補足。
圖 5-6 驗證流程 讀取各 Rule 群中完成
訓練後 ST>0 的 Rules。
目標車與前後車輛相關參數輸入 相關參數編碼
將編碼後參數取出第 n 筆資料,從 n=1 開始。
針對第 n 筆資料,從相對應的 Rule 群中,由第 1 個 Rule 開始 取出,並和第 n 筆資料作比對其 條件部份是否符合?
符合 不符合
將此 Rule 放入競標群中,並依其 ST 進 行出價。
本次取出之 Rule 是否為 Rule 群中的最後一個?
是
否,取出下一 個 Rule 取出標價最高的一個,若有數個同樣標價者,隨機
取出一個最得標者。並將得標者其 Rule 中所指示 的”動作”部份和實際結果作比較是否符合?
是 準確率+1。
否
否,取出下一個環 境條件
本環境條件不是最後一個?
結束此次驗證過程 是
否
準確率維持不變。
圖 5-7 用於預測之訓練流程 應用基因演算法產生
初始的 Rule 群共 x 群,
每一群 Rule 可指定其 擁有 y 個 Rules。
目標車與前後車輛相關參數輸入
相關參數編碼
將編碼後參數取出第 n 筆資料,從 n=1 開 始,但跳過其中準備作為預測用的部份。
針對第 n 筆資料,從相對應的 Rule 群中,由第 1 個 Rule 開始 取出,並和第 n 筆資料作比對其 條件部份是否符合?
符合 不符合
將此 Rule 放入競標群中,並依其 ST 進 行出價,同時從 ST 中扣除其出價金額。
對此 Rule 索取生命稅。
本次取出之 Rule 是否為 Rule 群中的最後一個?
是
否,取出下一 個 Rule 取出標價最高的一個,若有數個同樣標價者,隨機
取出一個最得標者。並將得標者其 Rule 中所指示 的”動作”部份和實際結果作比較是否符合?
是
將本 Rule 之 ST 予以適 當的獎勵
否
將本 Rule 之 ST 予以適 當的懲罰
否,取出下一個環 境條件
本環境條件不是最後一個?
結束此次訓練過程 是
本 Rule 群中 ST>0 的 Rules 數目是否不足?
是,運用基因演算 否
法產生新 Rules
補足。
圖 5-8 預測流程 讀取各 Rule 群中完成
訓練後 ST>0 的 Rules。
目標車與前後車輛相關參數輸入 相關參數編碼
針對第 n 筆資料,從相對應的 Rule 群中,由第 1 個 Rule 開始 取出,並和第 n 筆資料作比對其 條件部份是否符合?
符合 不符合
將此 Rule 放入競標群中,並依其 ST 進 行出價。
本次取出之 Rule 是否為 Rule 群中的最後一個?
是
否,取出下一 個 Rule 取出標價最高的一個,若有數個同樣標價者,隨機
取出一個最得標者。並將得標者其 Rule 中所指示 的”動作”部份和實際結果作比較是否符合?
是 準確率+1。
否
否,取出下一個環 境條件
本環境條件不是最後一個?
結束此次驗證過程 是
否
準確率維持不變。
將編碼後的參數依續取出未用於訓練過程
中的資料,從 n 最小者開始。
第六章 程式實作與驗證
6.1 系統實作
本研究於模式系統實作為程式時,所採取之編碼方式、運作流程、車流資料分群,
基因演算法中的複製、交配、突變及親代選擇,分類元法中的獎罰規則、Rule 作用方式、
起始解的引用等不同,皆會影響所得解的品質或尋求解的時間等,故於本節將相關細節 詳述之。
1.資料輸入兼編碼部份
考量到原始調查資料在最初的標準座標轉換上即有約±0.8 公尺的誤差,故在 有無加減速的判斷上,當其加速度絕對值大於 5(公里/小時平方)者才判斷其有發 生加、減速的行為。
於編碼部份,車速範圍 51~130(km/h),每 5km/h 為一區隔,故有 16 個區段,
可用 5 個位元代表。距離範圍 11~90(m),每 5 公尺作一區隔,共 16 個間隔,可 用 7 個位元代表。車種代碼:0 為小客車(含休旅車)、1 為其它車輛。車道代碼:
3 車道,以 2 個位元代表,0 為內車道(最左側),2 為最外側車道(最右側)。反應 動作代碼:0 為維持等速、1 為加速、2 為減速、3 為採取變換車道。
2.獎勵與懲罰方式
分類元在作出反應並經由 Effectors 驗證後如果證明其反應是正確的,那麼
給予獎勵是很合常理的。然而若是作出了錯誤的反應就給予懲罰這點則有進一步
考量的空間。舉例來說就類似工廠付錢喊價得標後買了原料回來,然而其製成品
並不為市場所接受,無人購買時,又要再給予懲罰收稅,這樣似乎又有點太過嚴
苛。這種作法在實作上來說是可以迅速的對每一個分類元作出評價,提升系統收
斂的速度,然而卻也有可能會使得分類元間的差異性降低,因為分類元只要不小
心出個錯,其強度就會大幅下降,使得最終留下來的只剩下完全不會出錯且一直
符合環境條件的分類元(也可稱其是具有通用性的分類元,因為不具通用性者在
收取生命稅後強度也會逐漸下降)。本研究考量所欲得到的微觀車流系統為一能
快速反應現實情況的系統,故需要在短時間內得到有用的結果,決定在系統中應 用懲罰的概念以加速求解的過程。
3.取代線觀念[19]:
取代線的概念主要在保護特定的分類元不會在系統尋解時因為其出現的頻 率不夠而發生被淘汰的現象。取代線在分類元數目少時好處較明顯,但在分類元 數目多時,取代線就不一定有好處。本研究由於在攝影車流資料上,是採取連續 擷取車流相關資訊的方式,故其中的變換車道出現頻率相較於一般加減速出現頻 率小,所以有必要採取取代線的關念來確保變換車道的相關 Rule 不致於因為出 現頻率小而被淘汰。
4.Rule 數的決定方面
分類元法運用於本研究上時,當分類元的數目少時,表示每一個分類元所要 涵蓋的目標集合範圍也相對變大,故不容易預測正確。而當分類元的數目過多 時,雖然每一個分類元所負責處理的目標範圍變小了,但也代表每一個分類元所 能預測出的範圍變小,因此若是多層結構的分類元系統,眾多分類元間的連鎖規 沒抓到則其準確率反而會下降。本研究因為採用單一階段為主,故 Rule 間沒有 連鎖的問題,所以分類元的數目越多其預測能力會越佳。然而假使隨著系統樣本 的增加,所需的分類元數也隨之增加,固然可以維持一定的準確率,但就失去了 分類元法的效益,因此本研究的模式設計上將以損失部份準確率的前提下,大幅 度的少所需要的分類元數為主。
5.訓練、驗證與預測
本研究中將訓練定義為利用攝影調查法所得到的各項車流資料,依其時間先
後順序對所建立微觀車流模式中的分類元參數進行調整。驗證則是利用和訓練時
相同的樣本及樣本數作測試,將所得到的車流資料同樣依時間先後順序輸入微觀
車流系統後,將系統所作加、減、等速及變換車道等反應與實際資料作比對,藉
以了解系統的準確率。預測與驗證基本上採用相同的流程,其不同之處在於,用
於預測時的系統訓練只用車流資料中的前 75%,而用另外的 25%則作為模式預測
的準確率評估。訓練與測試的準確率相近時,代表系統學習到的是好的規則,而 不是記憶資料。
6.親代的選擇
在執行交配、複製、突變等動作之前,要先從親代群中選取兩個親代,而選 取的方式通常有輪盤式選擇與競爭式選擇。在分類元系統中,力量值代表了該 Rule 的競力大小,若採用競爭式選擇法,在應用基因演算法在產生新的 Rules 時 會發生陷入同一個區域而無法擴大搜尋解的範圍(因為所採用的都是同樣的親 代,使子代間的差異性變小),將可能使所有的 Rule 趨近於最早出現的可行解上 (因為其力量值會越來越大),使 Rule 間的差異性變小,影響解的品質,故本研究 在親代的選取上採用輪盤式選擇法,依各 Rule 間力量值的比例作為其獲選的機 率,因此只要是力量值高於條件者皆有機會被選取。
7.交配、複製與突變
交配方面考慮到程式運作效能,本研究採用單點交配法,又為了避免限入重 覆解的困境中(如下例),在交配時採交叉交配法,且一次可產生兩個新的子代。
例:兩個同樣的親代「110|0、110|0」採對稱交配,將會產生兩個同樣的子代 1100,
而這兩個同樣的子代,又將會因為其和親代相同而具有較高的適應力,故系統執 行時間一久,將使此一型態的 Rule 過多,造成系統尋解能力的低落。而「110|0、
1|100」採用交叉交配法則可以避免這個問題,其結果為 1101 和 0100(如下圖)。
因此不論其兩個親代是否型態相同,皆有機會產生和親代不一樣的兩個子代,藉 以增加搜尋解的範圍。
圖 6-1 交配範例圖
複製時直接延用被選到的親代作為新的子代。突變的部份,採用遮罩法,遮 1100
1100
交配 1100
1100 1100
交配
0100 1101
對稱交配 夜叉交配
罩隨機產生,例如 1100 的親代,配合 1010 的遮罩,其子代為 0110。
8.起始解
經由實測結果所得,起始解的好壞對本研究演算法收歛的時間有很大的影 響,但其最終所得到的系統於準確率上差異不大。本研究初期於起始解的部份採 用兩種方式,分別為完全採用基演算法產生及直接從車流資料樣本中取出。經初 步實測比對後證實兩者間僅在系統收歛時間上有很大差異外,於最終準確率上差 異不大,加以考量本研究所架構之模式主要目的並非在尋找未知的可行解,而在 於尋找樣本空間中的行為特性,故於後期的模式訓練上為節省時間皆採第二種方 式。
9.程式碼
本研究所架構系統詳細完整程式碼如附錄三,然而考慮到篇幅問題,僅放上 所有模式中評比最佳者作為代表。
10.系統運作流程概念
本研究所架構之系統運作流程概念及分類元法獎懲範例示意如圖 6-2~6-4。
圖 6-2 系統運作流程示意圖
車道別條件 車種條件 車速條件 車距條件
分類元系統
維持等速 採取加速 採取減速 預測反應行為
(Rule 中的動作部份)
實際反應結果
維持等速 採取加速 採取減速 環境條件部份(Rule 中的條件部份)
比較結果以對分類元系統進行獎懲
環境條件部份輸入 環境條件部份輸入
圖 6-3 分類元運作範例圖
圖 6-4 分類元運作範例圖(續)
驗證預測準確率時所用樣本為後 25%(後 100 筆)。
1.模式一(考量本車、前車及後車影響)驗證與預測結果 表 6-1 分類元數與驗證準確率相關表
分類元數 40 80 120 160 200 240 280 320 360 400 佔樣本比(%) 10 20 30 40 50 60 70 80 90 100 準確率(%) 90.98 92.73 94.24 95.24 95.74 96.24 97.24 97.24 97.24 97.24
表 6-2 分類元數與預測準確率相關表
分類元數 40 80 120 160 200 240 280 320 360 400 佔樣本比(%) 10 20 30 40 50 60 70 80 90 100 準確率(%) 91.14 93.67 94.94 94.94 94.94 94.94 94.94 94.94 94.94 94.94
86 88 90 92 94 96 98
佔樣
本比(%) 10 20 30 40 50 60 70 80 90
驗證準確率(%) 預測準確率(%)
圖 6-2 模式一驗證及預測準確率與分類元規則數量關系圖 2.模式二(同模式一,但前後車束改採用相對車速)驗證與預測
表 6-3 分類元數與驗證準確率相關表
分類元數 40 80 120 160 200 240 280 320 360 400
準確率(%) 91.23 92.98 93.98 94.74 95.99 96.24 97.24 97.24 97.24 97.24
表 6-4 分類元數與預測準確率相關表
分類元數 40 80 120 160 200 240 280 320 360 400 準確率(%) 91.14 92.4 93.67 93.67 93.67 93.67 93.67 93.67 93.67 93.67
88 90 92 94 96 98
佔樣本
比(%) 10 20 30 40 50 60 70 80 90
驗證準確率(%) 預測準確率(%)
圖 6-3 模式二驗證及預測準確率與分類元規則數量關系圖 3.模式三(僅考量前車及後車影響)驗證與預測
表 6-5 分類元數與驗證準確率相關表
分類元數 40 80 120 160 200 240 280 320 360 400 準確率(%) 73.93 78.95 86.72 94.24 95.24 95.24 95.24 95.24 95.24 95.24
表 6-6 分類元數與預測準確率相關表
分類元數 40 80 120 160 200 240 280 320 360 400
準確率(%) 59.49 63.3 64.55 69.62 74.68 74.68 74.68 74.68 74.68 74.68
50 60 70 80 90 100
佔樣本
比(%) 10 20 30 40 50 60 70 80 90
驗證準確率(%) 預測準確率(%)
圖 6-4 模式三驗證及預測準確率與分類元規則數量關系圖 4.模式四(僅考量前車影響)驗證與預測
表 6-5 分類元數與驗證準確率相關表
分類元數 40 80 120 160 200 240 280 320 360 400 準確率(%) 89.47 90.73 91.48 91.48 91.48 91.48 91.48 91.48 91.48 91.48
表 6-6 分類元數與預測準確率相關表
分類元數 40 80 120 160 200 240 280 320 360 400 準確率(%) 88.6 92.4 92.4 92.4 92.4 92.4 92.4 92.4 92.4 92.4
86 88 90 92 94 96
佔樣本比
(%) 10 20 30 40 50 60 70 80 90
驗證準確率(%) 預測準確率(%)
圖 6-5 模式四驗證及預測準確率與分類元規則數量關系圖
本研究也嘗試將分群條件放寬,於車輛有無加減速行為的判斷方面將誤差假設值依 序縮小成 4、3、2、1 及 0(原本在加速度正負 5km/h^2 以下皆視為等速),發現此時模式 四的預測效果變得相當低,而模式一、二及三的準確率同樣有下降的區勢,但下降的程 度為模式一<模式二<模式三。
當誤差假設值縮小為 0 時,則模式一最高驗證準確率可達 93.45%,然而其相對所 需的分類元規則數為 285(佔樣本的 71.43%),故可看出此時車流資料樣本中的離散程度 較大,故需要較多的分類元規則才能達到相同的準確率。下表為此條件下訓練後力量值 最大的前八個規則,其力量值皆比其它的規則有大幅度的領先,故可知為適用性較高的 規則,也可當作是車流資料樣本中最常發生的駕駛行為。由表中的各分類元規則可歸納 出,不論本車所在車道、車種、車速為何,當前後無車時,所採取的行動為維持等速,
相當符合一般正常駕駛行為,故可說明其力量值為何會大幅領先其他分類元規則。
表 6-7 訓練後所得之 Rule 範例(依力量值由大至小取七個)
本車車道代碼c 本車車
種代碼c 前車車種c 後車車種c 本車車速c 前車車距c 前車車速c 後車車距c 後車車速c 採取行動c ST
0 0 0 0 7 0 0 0 0 0 1316778
1 0 0 0 7 0 0 0 0 0 914867.6
1 0 0 0 9 0 0 0 0 0 713907.9
2 1 0 0 7 0 0 0 0 0 512958.2
0 0 0 0 5 0 0 0 0 0 412476.9
2 1 0 0 5 0 0 0 0 0 312000
1 1 0 0 6 0 0 0 0 0 311999
模式二、三與四各有其相對優缺點與適用性,所應用的車流資料樣本特性不同時,
最合適的模式也隨之不同,越是不規則離散而不具有集中行為特性的資料,需要越多的 環境條件資訊與分類元規則數來提高準確率,而當樣本資料具有明顯的行為趨勢時就可 用較少的環境條件資訊與分類元規則數來提高準確率,故各模式間無絕對的優劣之分,
需看所要求的應用目的為何來作取捨應用。
第七章 結論與建議
7.1 結論
於本研究中證實分類元法在尋求可行解及分配各可行解的比重上具有相當不錯的 能力,且適用性高,唯與其他演算法間的優劣比較(如尋解時間、所得解的品質等)礙於 所需資料的取得不易,無法輕易下定論(可能因樣本性質不同、程式寫法不同、執行電 腦不同等而得到不同的結果)。分類元法中各 Rule 群格式的定義、Rule 間的互動關系、
初始狀態、獎懲規則及目標解的樣本空間大小等因數,彼此間的關聯密切,且對解的品 質影響相當大,需依應用目標對象的不同特性而研析設計,無一種固定的組合方式保證 適用於所有的問題。關於系統分類元數與準確率關系方面,於各模式組合的分析中發 現,當要求分類元數目少時,其最大的驗證準確率就會降低,當要求最大驗證準確率高 時,所需要的分類元數就無法降低,然而視研究需要可採取一折衷點,犧牲部份準確率 以大幅降低所需分類元數。
較佳模式為應用分類元法的規則力量分配原理,配合車流資料樣本特性與考量實務 上所需將分類元法間的運算規則予以調整,以使模式可以依樣本特性的不同、所應用目 的不同(需高準確率、低分類元規則數或一平衡點)進行調整。綜合以上所述,由本研究 應用分類元法所得到的結果可證實,分類元法應用在構建高速公路微觀車流模式上確實 具有可行性。
7.2 建議
本研究由於為國內首度應用分類元方法於微觀車流方面之研究,故在許多細節部份 未能完全發揮分類元的特性,尚有待後進之士予以改善本研究不足之處。
本研究已知不足之處如後:
1.編碼方式
本研究採用單純的十進位轉二進位方式進行編碼,其應用於基因演算法時可
能會產生親代與子代在編碼前的巨大差異。例如 120/1111000 及 127/1111111
於交配後可能產生 15/0001111,與實際編碼前的親代相差甚遠。
2.Rule 間的權重(力量值 ST)分配規則
本研究於 Rule 間的權重分配採用最簡單的固定值獎罰分配法,且因為 Rule 僅有一層,未能定立出 Rule 群間的關聯性,故未應用到桶隊接力法進行功勞分 配。
3.基因演算法中的演算規則
基因演算法的規則影響目標解尋解及收歛的速度,在交配方式上本研究僅採 用單點交配法,或許可再考量加入其他交配法之應用。
4.程式執行邏輯上的最佳化
本研究所有的理論方法不論是基因演算法或是分類元法,在將其實際編寫為 程式語言時皆有許多不同的方式可達成相同的結果,然而其所需的時間確可能因 所採用的程式語言、邏輯運作上的不同而不一樣,故會影響程式在尋找相同品質 的解時所需要的執行時間。
5.模式組合
本研究參考暨有文獻中對駕駛人行為、車流特性等研究將參數分成不同的組 合關聯,擬定出五個模式,雖然已有一定的成效,但相信仍然尚有改善的空間。
6.車流資料的蒐集
本研究中由於變換車道部份礙於樣本數不足將導致該 Rule 競爭力不足,被 分類元系統認為是不好的 Rule 而淘汰,故有賴更進一步的車流資料蒐集來完善 變換車道部份研究。
分類元法專長於解決複雜問題,如單一駕駛人從上高速公路至離開期間所有
狀況下反應行為的模擬。然而經由單一攝影機所取得之攝影資訊其涵蓋範圍過於
狹短,故無法針對單一駕駛進行完整的追縱調查與研究。
參考文獻
1. Gazis, D. C., R. Herman, and R. B. Potts, “Car-Following Theory of Steady-State Traffic Flow”, Operations Research, Vol. 7, pp.499-505, 1959.
2. Herman, R., E. W. Montroll, R. B. Potts, and R. W. Rothery, “Traffic Dynamics: Analysis of Stability in Car Following”, Operations Research, Vol. 7, pp.499-505, 1959.
3. Chakroborty, P., S. Kikuchi, “Evaluation of the General Motors Based Car-following Models and A Proposed Fuzzy Inference Model”, Transportation Research Part C 7, pp.209-235, 1999
4. Lewis, R.M., H.L. Michael, “Simulation of Traffic Flow to Obtain Volume Warrants for Intersection Control”, HRR 15, pp.1-43, 1963
5. Leutzbach, W., “Introduction to the Theory of Traffic Flow”, Springer-Verlag, 1988.
6. Prigogine, I., and F. C. Andrews, “A Boltzmann-Like Approach for Traffic Flows”, Operations Research, Vol. 8, pp.789-797, 1960.
7. May, A. D., Traffic Flow Fundamentals, New Jersey, Prentice-Hall Inc., 1990.
8. Paveri-Fontana, S.L., “On Boltzmann-like Treatments for Traffic Flow: A Critical Review of the Basic Model and An Alternative Proposal for Dilute Traffic Analysis”, Transportation Research Vol.9, pp.225-235, 1975.
9. Reuschel, A., “Vehicle Moves in a Platoon”, Oesterreichisches Ingenieur-Archir 4, pp.193-215, 1950.
10. Pipes, L. A. ,”An Operational Analysis of Traffic Dynamics”, Journal of Applied Physics 24(3), pp.274-287,1953.
11. Gazis, D. C. , R. Herman, and R. B. Potts, “Car-Following Theory Of Steady-State Traffic Flow”, Operations Research 7,pp499-505,1959.
12. Greenshield, B. ,”A Study of Traffic Capacity”, Highway Research Board Proceedings
14,pp468-477,1933.
13. J. H. Holland, Adaptation in Natural and Artificial Systems, University of Michigan Press, 1975.
14. 羅仕京, 「車流氣體動力模式之構建與模擬-以波茲曼輸運方程為基礎」 ,國立交通 大學運輸科技與管理學系博士論文,民國九十一年。
15. 林貴億, 「平行模擬車流波茲曼方程式之研究」 ,國立交通大學運輸科技與管理學系 碩士論文,民國九十一年。
16. 黃國平, 「混合車流二維座標模擬模式之建立及驗證」 ,國立台灣大學土木工程學研 究所碩士論文,民國七十二年。
17. 陳世泉, 「混合車流中機車駕駛行為之分析」 ,國立台灣大學土木工程學研究所碩士 論文,民國八十二年。
18. 林育瑞, 「利用類神經網路構建機車車流模式之研究」 ,國立成功大學交通管理科學 研究所碩士論文,民國九十一年。
19. 黃榮助, 「模糊分類元系統及其應用」 ,國立交通大學資訊科學研究所碩士論文,民 國八十六年。
20. 陳兆芳, 「一個以分類元系統建構之動態適應式網路路徑決定方法」 ,國立交通大學 資訊科學研究所碩士論文,民國八十九年。
21. 黃崇源, 「分類元系統構成中之長期記憶形成與類推式認知學習研究」 ,國立交通大 學資訊科學研究所碩士論文,民國八十九年。
22. 李志哲, 「應用模糊分類元系統於股票技術分析」 ,國立交通大學資訊管理學程碩士
論文,民國九十二年。
附錄一 車流原始資料
75 1 1 23 t00044.png 0.00 0.00 97.39 0.00 34.08 0.00 0 0
154 1 1 49 t00116.png 76.75 0.00 0.00 0.00 0.00 -2.90 0 0
233 1 0 77 t00152.png 83.93 0.00 0.00 58.90 0.00 0.00 0 0
312 1 0 102 t00198.png 0.00 0.00 0.00 0.00 0.00 0.00 0 0
391 2 1 125 t00262.png 61.14 0.00 0.00 0.00 0.00 -2.76 0 0
470 1 0 150 t00294.png 102.42 0.00 0.00 0.00 0.00 0.17 0 0
549 0 0 173 t00335.png 85.28 0.00 0.00 0.00 0.00 -0.96 0 0
628 1 0 197 t00381.png 92.90 0.00 0.00 0.00 0.00 -0.90 0 0
707 1 0 218 t00424.png 89.94 88.08 0.00 21.19 0.00 4.42 1 0
786 0 1 235 t00468.png 0.00 0.00 0.00 0.00 0.00 0.00 0 0
865 1 0 254 t00503.png 100.12 0.00 0.00 0.00 0.00 -4.80 0 0
944 1 0 273 t00532.png 96.67 99.84 0.00 54.93 0.00 0.00 0 0
1023 0 0 289 t00587.png 91.72 0.00 82.98 0.00 20.52 -3.29 0 0
1102 0 1 306 t00621.png 87.41 0.00 0.00 0.00 0.00 -3.41 0 0
1181 0 0 325 t00659.png 93.72 0.00 0.00 0.00 0.00 1.40 0 0
1260 1 0 343 t00693.png 89.67 0.00 0.00 0.00 0.00 2.51 0 0
1339 0 0 360 t00737.png 0.00 0.00 0.00 0.00 0.00 0.00 0 0
1418 0 0 377 t00777.png 91.96 0.00 0.00 35.26 0.00 -5.52 0 0
1497 0 0 395 t00819.png 92.75 0.00 0.00 0.00 0.00 2.69 0 0
1498 1 0 396 t00819.png 97.67 0.00 0.00 0.00 0.00 -3.24 0 0
1499 0 0 395 t00820.png 87.35 0.00 0.00 0.00 0.00 -5.40 0 0
1500 1 0 396 t00820.png 96.51 0.00 0.00 0.00 0.00 -1.17 0 0
1501 0 0 395 t00821.png 0.00 0.00 0.00 0.00 0.00 0.00 0 0
1502 1 0 396 t00821.png 0.00 0.00 0.00 0.00 0.00 0.00 0 0
1503 1 0 397 t00822.png 106.11 0.00 76.61 0.00 21.61 0.00 0 0
1504 1 0 398 t00822.png 76.61 106.11 0.00 21.61 0.00 0.00 0 0
1505 1 0 397 t00823.png 108.20 0.00 0.00 0.00 0.00 2.09 0 0
1506 0 0 398 t00823.png 125.76 0.00 0.00 0.00 0.00 49.16 0 0
1507 1 0 397 t00824.png 104.57 0.00 0.00 0.00 0.00 -3.64 0 0
1508 0 0 398 t00824.png 121.03 0.00 88.39 0.00 23.64 -4.73 0 1
1509 2 0 399 t00824.png 91.17 0.00 0.00 0.00 0.00 0.00 0 0
1510 0 1 400 t00824.png 88.39 121.03 0.00 23.64 0.00 0.00 0 0
1511 1 0 397 t00825.png 101.58 0.00 0.00 0.00 0.00 -2.99 0 0
1512 0 0 398 t00825.png 118.85 0.00 92.51 0.00 32.50 -2.18 0 1
1513 2 0 399 t00825.png 88.47 0.00 0.00 0.00 0.00 -2.70 0 0
1514 0 1 400 t00825.png 92.51 118.85 0.00 32.50 0.00 4.12 0 0
1515 1 0 397 t00826.png 0.00 0.00 0.00 0.00 0.00 0.00 0 0
1516 0 0 398 t00826.png 0.00 0.00 0.00 0.00 39.74 0.00 0 1
1517 0 1 400 t00826.png 0.00 0.00 0.00 39.74 0.00 0.00 0 0
1518 2 0 399 t00826.png 90.53 0.00 0.00 0.00 0.00 2.06 0 0
1519 0 1 400 t00827.png 0.00 0.00 0.00 0.00 0.00 0.00 0 0
1520 2 0 399 t00827.png 0.00 0.00 0.00 0.00 0.00 0.00 0 0
附錄二 車流平均資料
75 0 0 75 94.11 0.00 83.93 53.94 58.90 -2.28 0 0
154 0 0 154 90.94 0.00 0.00 55.63 0.00 -1.36 0 0
233 2 1 233 82.77 0.00 0.00 0.00 0.00 -0.98 0 0
312 1 0 312 111.80 93.42 90.21 32.40 21.47 -15.47 0 0
391 1 0 391 91.53 0.00 92.34 0.00 98.05 -1.03 1 0
392 2 1 392 93.23 0.00 0.00 98.05 0.00 -0.11 0 0
393 1 0 393 78.96 0.00 0.00 0.00 0.00 1.36 0 0
394 0 0 394 98.10 0.00 100.92 0.00 84.91 -2.66 0 0
395 1 0 395 90.05 0.00 0.00 0.00 0.00 -1.35 0 0
396 1 0 396 98.37 0.00 0.00 84.91 0.00 -2.20 0 0
397 0 0 397 105.12 0.00 76.61 0.00 21.61 -1.51 0 1
398 2 0 398 110.56 106.11 90.45 21.61 31.96 14.08 0 0
399 0 1 399 90.06 0.00 0.00 0.00 0.00 -0.32 0 0
附錄三 原始碼範例
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace Classifier_System {
public class Form1 : System.Windows.Forms.Form {
private int length1 = 4, length2 = 2, length3 = 1, sample, sample1, tempx, tempx1, tempx2, tempx3, tempx4;//sample 記錄樣 本數
private Random random1 = new Random(unchecked((int)DateTime.Now.Ticks)), random2;
private Random[] randomArray = new Random[z1];
private System.Data.OleDb.OleDbConnection oleDbConnection1;
private System.Data.OleDb.OleDbCommand oleDbSelect1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Data.OleDb.OleDbDataReader oleReader;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TextBox textBox3;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox textBox4;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox textBox5;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.TextBox textBox6;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.TextBox textBox7;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.TextBox textBox8;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.TextBox textBox9;
private System.Windows.Forms.TextBox textBox10;
private System.Windows.Forms.Label label10;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.TextBox textBox11;
private System.Data.OleDb.OleDbCommand oleDbInsert1;
private System.Data.OleDb.OleDbCommand oleDbDelete1;
private System.Data.OleDb.OleDbConnection oleDbConnection2;
private System.Data.OleDb.OleDbCommand oleDbSelect2;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;
private System.Windows.Forms.TextBox textBox12;
private System.Windows.Forms.Label label12;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.TextBox textBox13;
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
RunFirst();
}
protected override void Dispose( bool disposing )
{
base.Dispose( disposing );
}
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.oleDbConnection1 = new System.Data.OleDb.OleDbConnection();
this.oleDbSelect1 = new System.Data.OleDb.OleDbCommand();
this.textBox1 = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.textBox2 = new System.Windows.Forms.TextBox();
this.textBox3 = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.textBox4 = new System.Windows.Forms.TextBox();
this.textBox5 = new System.Windows.Forms.TextBox();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.textBox6 = new System.Windows.Forms.TextBox();
this.label7 = new System.Windows.Forms.Label();
this.textBox7 = new System.Windows.Forms.TextBox();
this.label8 = new System.Windows.Forms.Label();
this.textBox8 = new System.Windows.Forms.TextBox();
this.label9 = new System.Windows.Forms.Label();
this.textBox9 = new System.Windows.Forms.TextBox();
this.textBox10 = new System.Windows.Forms.TextBox();
this.label10 = new System.Windows.Forms.Label();
this.label11 = new System.Windows.Forms.Label();
this.textBox11 = new System.Windows.Forms.TextBox();
this.oleDbInsert1 = new System.Data.OleDb.OleDbCommand();
this.oleDbDelete1 = new System.Data.OleDb.OleDbCommand();
this.oleDbConnection2 = new System.Data.OleDb.OleDbConnection();
this.oleDbSelect2 = new System.Data.OleDb.OleDbCommand();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.textBox12 = new System.Windows.Forms.TextBox();
this.label12 = new System.Windows.Forms.Label();
this.label13 = new System.Windows.Forms.Label();
this.textBox13 = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(224, 228);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 24);
this.button1.TabIndex = 0;
this.button1.Text = "訓練";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// oleDbConnection1
//
this.oleDbConnection1.ConnectionString = @"Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Registry Path=;Jet OLEDB:Database Locking Mode=1;Data Source=""F:\OLD Backup\【作業區】\【_我的論文資料__應用分類元方法於微觀車流系統之 模擬-以高快速公路多車道為例】\接下來以這個為主繼續,但不要忘了其他的版本中有的在這被刪了。\【應用程式】\車流資 料.mdb"";Mode=Share Deny None;Jet OLEDB:Engine Type=5;Provider=""Microsoft.Jet.OLEDB.4.0"";Jet OLEDB:System database=;Jet OLEDB:SFP=False;persist security info=False;Extended Properties=;Jet OLEDB:Compact Without Replica Repair=False;Jet
OLEDB:Encrypt Database=False;Jet OLEDB:Create System Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;User ID=Admin;Jet OLEDB:Global Bulk Transactions=1";
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(138, 14);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(42, 22);
this.textBox1.TabIndex = 5;
this.textBox1.Text = "300";
//
// label2
//
this.label2.Location = new System.Drawing.Point(50, 43);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(94, 14);
this.label2.TabIndex = 4;
this.label2.Text = "分類元維持數:";
//
// label1
//
this.label1.Font = new System.Drawing.Font("新細明體", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(136)));
this.label1.Location = new System.Drawing.Point(50, 18);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(80, 14);
this.label1.TabIndex = 3;
this.label1.Text = "分類元數目:";
//
// textBox2 //
this.textBox2.Location = new System.Drawing.Point(150, 38);
this.textBox2.Name = "textBox2";
this.textBox2.Size = new System.Drawing.Size(42, 22);
this.textBox2.TabIndex = 5;
this.textBox2.Text = "100";
//
// textBox3
//
this.textBox3.Location = new System.Drawing.Point(150, 66);
this.textBox3.Name = "textBox3";
this.textBox3.Size = new System.Drawing.Size(42, 22);
this.textBox3.TabIndex = 5;
this.textBox3.Text = "10";
//
// label3
//
this.label3.Location = new System.Drawing.Point(48, 68);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(80, 14);
this.label3.TabIndex = 4;
this.label3.Text = "初始力量值:";
//
// label4
//
this.label4.Location = new System.Drawing.Point(48, 93);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(80, 14);
this.label4.TabIndex = 4;
this.label4.Text = "訓練次數:";
//
// textBox4
//
this.textBox4.Location = new System.Drawing.Point(152, 94);
this.textBox4.Name = "textBox4";
this.textBox4.Size = new System.Drawing.Size(42, 22);
this.textBox4.TabIndex = 5;
this.textBox4.Text = "1000000";
//
// textBox5
//
this.textBox5.Location = new System.Drawing.Point(144, 126);
this.textBox5.Name = "textBox5";
this.textBox5.Size = new System.Drawing.Size(42, 22);
this.textBox5.TabIndex = 5;
this.textBox5.Text = "1";
//
// label5
//
this.label5.Location = new System.Drawing.Point(42, 128);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(94, 14);
this.label5.TabIndex = 4;
this.label5.Text = "生命稅(定值):";
//
// label6
//
this.label6.Location = new System.Drawing.Point(50, 162);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(94, 14);
this.label6.TabIndex = 4;
this.label6.Text = "出價比例:";
//
// textBox6
//
this.textBox6.Location = new System.Drawing.Point(154, 162);
this.textBox6.Name = "textBox6";
this.textBox6.Size = new System.Drawing.Size(42, 22);
this.textBox6.TabIndex = 5;
this.textBox6.Text = "0.1";
//
// label7
//
this.label7.Location = new System.Drawing.Point(48, 198);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(94, 14);
this.label7.TabIndex = 4;
this.label7.Text = "獎勵值(定值):";
//
// textBox7
//
this.textBox7.Location = new System.Drawing.Point(154, 200);
this.textBox7.Name = "textBox7";
this.textBox7.Size = new System.Drawing.Size(42, 22);
this.textBox7.TabIndex = 5;
this.textBox7.Text = "10";
//
// label8
//
this.label8.Location = new System.Drawing.Point(50, 234);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(94, 14);
this.label8.TabIndex = 4;
this.label8.Text = "懲罰值(定值):";
//
// textBox8
//
this.textBox8.Location = new System.Drawing.Point(158, 238);
this.textBox8.Name = "textBox8";
this.textBox8.Size = new System.Drawing.Size(42, 22);
this.textBox8.TabIndex = 5;
this.textBox8.Text = "10";
//
// label9
//
this.label9.Location = new System.Drawing.Point(248, 26);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(94, 14);
this.label9.TabIndex = 4;
this.label9.Text = "交配比例:";
//
// textBox9
//
this.textBox9.Location = new System.Drawing.Point(356, 24);
this.textBox9.Name = "textBox9";
this.textBox9.Size = new System.Drawing.Size(42, 22);
this.textBox9.TabIndex = 5;
this.textBox9.Text = "70";
//
// textBox10
//
this.textBox10.Location = new System.Drawing.Point(360, 62);
this.textBox10.Name = "textBox10";
this.textBox10.Size = new System.Drawing.Size(42, 22);
this.textBox10.TabIndex = 5;
this.textBox10.Text = "19";
//
// label10
//
this.label10.Location = new System.Drawing.Point(250, 62);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(94, 14);
this.label10.TabIndex = 4;
this.label10.Text = "複製比例:";
//
// label11
//
this.label11.Location = new System.Drawing.Point(252, 94);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(94, 14);
this.label11.TabIndex = 4;
this.label11.Text = "突變比例:";
//
// textBox11
//
this.textBox11.Location = new System.Drawing.Point(364, 96);
this.textBox11.Name = "textBox11";
this.textBox11.Size = new System.Drawing.Size(42, 22);
this.textBox11.TabIndex = 5;
this.textBox11.Text = "11";
//
// oleDbConnection2
//
this.oleDbConnection2.ConnectionString = @"Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Registry Path=;Jet OLEDB:Database Locking Mode=1;Data Source=""F:\OLD Backup\【作業區】\【_我的論文資料__應用分類元方法於微觀車流系統之 模擬-以高快速公路多車道為例】\接下來以這個為主繼續,但不要忘了其他的版本中有的在這被刪了。\【應用程式】\車流資 料.mdb"";Mode=Share Deny None;Jet OLEDB:Engine Type=5;Provider=""Microsoft.Jet.OLEDB.4.0"";Jet OLEDB:System database=;Jet OLEDB:SFP=False;persist security info=False;Extended Properties=;Jet OLEDB:Compact Without Replica Repair=False;Jet
OLEDB:Encrypt Database=False;Jet OLEDB:Create System Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;User ID=Admin;Jet OLEDB:Global Bulk Transactions=1";
//
// button2
//
this.button2.Location = new System.Drawing.Point(312, 228);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 24);
this.button2.TabIndex = 0;
this.button2.Text = "驗證";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// button3
//
this.button3.Location = new System.Drawing.Point(396, 228);
this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(75, 24);
this.button3.TabIndex = 0;
this.button3.Text = "預測";
//
// textBox12
//
this.textBox12.Location = new System.Drawing.Point(362, 134);
this.textBox12.Name = "textBox12";
this.textBox12.Size = new System.Drawing.Size(42, 22);
this.textBox12.TabIndex = 5;
this.textBox12.Text = "0";
//
// label12
//
this.label12.Location = new System.Drawing.Point(252, 132);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(94, 14);
this.label12.TabIndex = 4;
this.label12.Text = "訓練樣本數:";
//
// label13
//
this.label13.Location = new System.Drawing.Point(252, 168);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(94, 14);
this.label13.TabIndex = 4;
this.label13.Text = "驗證樣本數:";
//
// textBox13
//
this.textBox13.Location = new System.Drawing.Point(362, 166);
this.textBox13.Name = "textBox13";
this.textBox13.Size = new System.Drawing.Size(42, 22);
this.textBox13.TabIndex = 5;
this.textBox13.Text = "0";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 15);
this.ClientSize = new System.Drawing.Size(482, 273);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.button1);
this.Controls.Add(this.textBox2);
this.Controls.Add(this.textBox3);
this.Controls.Add(this.label3);
this.Controls.Add(this.label4);
this.Controls.Add(this.textBox4);
this.Controls.Add(this.textBox5);
this.Controls.Add(this.label5);
this.Controls.Add(this.label6);
this.Controls.Add(this.textBox6);
this.Controls.Add(this.label7);
this.Controls.Add(this.textBox7);
this.Controls.Add(this.label8);
this.Controls.Add(this.textBox8);
this.Controls.Add(this.label9);
this.Controls.Add(this.textBox9);
this.Controls.Add(this.textBox10);
this.Controls.Add(this.label10);
this.Controls.Add(this.label11);
this.Controls.Add(this.textBox11);
this.Controls.Add(this.button2);
this.Controls.Add(this.button3);
this.Controls.Add(this.textBox12);
this.Controls.Add(this.label12);
this.Controls.Add(this.label13);
this.Controls.Add(this.textBox13);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void button1_Click(object sender, System.EventArgs e)
{
this.RunFirst();
//陣列初始化
/*一般起始解比較
int seed = unchecked((int)DateTime.Now.Ticks);
random2 = new Random(seed);
for (int i=0; i<z1; i++)
{
this.randomArray[i] = new Random(random2.Next(20));
}
本車車速c[i] = this.randomArray[4].Next(16);
前車車距c[i] = this.randomArray[5].Next(16);
前車車速c[i] = this.randomArray[6].Next(16);
後車車距c[i] = this.randomArray[7].Next(16);
後車車速c[i] = this.randomArray[8].Next(16);
採取行動c[i] = this.randomArray[9].Next(3);
this.oleDbConnection1.Open();
this.oleReader = this.oleDbSelect1.ExecuteReader();
int j = 0, l = 0;
while (this.oleReader.Read())
{
this.本車車道代碼c[j] = this.oleReader.GetInt32(0);
this.本車車種代碼c[j] = this.oleReader.GetInt32(1);
this.本車車速c[j] = ((int)this.oleReader.GetFloat(2)-51)/z15;
this.前車車速c[j] = ((int)this.oleReader.GetFloat(3)-51)/z15;
this.後車車速c[j] = ((int)this.oleReader.GetFloat(4)-51)/z15;
this.前車車距c[j] = ((int)this.oleReader.GetFloat(5)-11)/z15;
this.後車車距c[j] = ((int)this.oleReader.GetFloat(6)-11)/z15;
if (this.本車車速c[j] < 0){this.本車車速c[j] = 0;}
else if((this.前車車速c[j]-this.本車車速c[j])>0)
{
//維持等速【本車加速度r=0】、加速【本車加速度r=1】、減速【本車加速度r=2】、變換車道【本
車加速度r=3】、5為誤差值
if (System.Math.Abs(this.oleReader.GetFloat(7)) < z14)
{
this.前車車種c[j] = this.oleReader.GetInt32(8);
this.後車車種c[j] = this.oleReader.GetInt32(9);
this.ST[j] = z3 + sample;
this.SP[j] = z5;
}
j = j+1;
}
this.oleDbConnection1.Close();
// */
for (int i=0; i<z4; i++)
{
this.oleDbSelect1.CommandText = "SELECT 車道代碼, 車種代碼, 本車車速, 前車車速, 後車車速, 前 車車距, 後車車距, 本車加速度, 前車車種, 後車車種, 車輛代碼 FROM averageFlowData ORDER BY 車輛代碼";
this.oleDbConnection1.Open();
this.oleReader = this.oleDbSelect1.ExecuteReader();
l=0;
while (this.oleReader.Read())
{
this.本車車道代碼r = this.oleReader.GetInt32(0);
this.本車車種代碼r = this.oleReader.GetInt32(1);
this.本車車速r = ((int)this.oleReader.GetFloat(2)-51)/z15;
this.前車車速r = ((int)this.oleReader.GetFloat(3)-51)/z15;
this.後車車速r = ((int)this.oleReader.GetFloat(4)-51)/z15;
this.前車車距r = ((int)this.oleReader.GetFloat(5)-11)/z15;
this.後車車距r = ((int)this.oleReader.GetFloat(6)-11)/z15;
if (this.本車車速r < 0){this.本車車速r = 0;}
}
//維持等速【本車加速度r=0】、加速【本車加速度r=1】、減速【本車加速度r=2】、變換車道【本
車加速度r=3】、5為誤差值
if (System.Math.Abs(this.oleReader.GetFloat(7)) < z14)
{
this.前車車種r = this.oleReader.GetInt32(8);
this.後車車種r = this.oleReader.GetInt32(9);
this.ClassiFier1();
}
this.oleDbConnection1.Close();
if (i%100 == 0 && i != 0)
{
if(MessageBox.Show("第" + i.ToString() + "循環中,合格的RULE有" + correctNB,"請選擇
",MessageBoxButtons.OKCancel) == DialogResult.Cancel )
{
break;
}
this.oleDbConnection2.Open();
this.oleDbDelete1.CommandText = string.Format("DELETE * FROM RulesSaved");
this.oleDbDelete1.ExecuteNonQuery();
for (int k=0; k<z; k++)
{
if (ST[k]>z3)
{
this.oleDbSelect2.CommandText = string.Format("SELECT Count(0) FROM RulesSaved WHERE 本車車道代碼c={0} AND 本車車種代碼c={1} AND 前車車種c={2} AND 後車車種c={3} AND 本車車速c={4}
this.oleDbInsert1.CommandText = string.Format("INSERT INTO RulesSaved(本車車道代碼c, 本車車種代碼c, 前車車種c, 後車車種c, 本車車速c, 前車車距c, 前車車速c, 後車車距c, 後車車速c, 採取行動c, ST) VALUES ({0}, {1}, {2}, {3}, '{4}', {5}, {6}, {7}, {8}, {9}, {10})", 本車車道代碼c[k], 本車車種代碼c[k], 前車車種 c[k], 後車車種c[k], 本車車速c[k], 前車車距c[k], 前車車速c[k], 後車車距c[k], 後車車速c[k], 採取行動c[k], ST[k]);
this.oleDbInsert1.ExecuteNonQuery();
}
}
}
this.oleDbConnection2.Close();
}
correctNB = 0;
}
MessageBox.Show("訓練完成!");
}
private void RunFirst()
{
z = Convert.ToInt32(this.textBox1.Text);
z2 = Convert.ToInt32(this.textBox2.Text);
z3 = Convert.ToInt32(this.textBox3.Text);
z4 = Convert.ToInt32(this.textBox4.Text);
z7 = Convert.ToInt32(this.textBox5.Text);
z8 = Convert.ToSingle(this.textBox6.Text);
z9 = Convert.ToInt32(this.textBox7.Text);
z10 = Convert.ToInt32(this.textBox8.Text);
z12 = Convert.ToInt32(this.textBox12.Text);
z13 = Convert.ToInt32(this.textBox13.Text);
z14 = 2;
z15 = 1;
z16 = 1;
this.rCrossOver = Convert.ToInt32(this.textBox9.Text);
this.rCopy = Convert.ToInt32(this.textBox10.Text);
this.rMutation = Convert.ToInt32(this.textBox11.Text);
this.oleDbSelect1.Connection = this.oleDbConnection1;
this.oleDbSelect2.Connection = this.oleDbConnection2;
this.oleDbInsert1.Connection = this.oleDbConnection2;
this.oleDbDelete1.Connection = this.oleDbConnection2;
this.oleDbConnection1.Open();
this.oleDbSelect1.CommandText = "SELECT Count(0) FROM averageFlowData";
this.sample1 = Convert.ToInt32(this.oleDbSelect1.ExecuteScalar());
this.oleDbConnection1.Close();
sample = sample1;
if (z12 > 0 )
{
sample = z12;
}
int seed = unchecked((int)DateTime.Now.Ticks);
int [] r1 = new int[j];
r = random1.Next(rCrossOver+rCopy+rMutation);
if(r<rCrossOver)
{
//CrossOver, 採一點交配法
CrossOver(ref 本車車速c[i], length1, 本車車速c[parent[r1[j]]], 本車車速c[parent[r1[j+1]]], ref 本車車速c[i+1], i);
CrossOver(ref 前車車距c[i], length1, 前車車距c[parent[r1[j]]], 前車車距c[parent[r1[j+1]]], ref 前車車距c[i+1], i);
CrossOver(ref 前車車速c[i], length1, 前車車速c[parent[r1[j]]], 前車車速c[parent[r1[j+1]]], ref 前車車速c[i+1], i);
CrossOver(ref 後車車距c[i], length1, 後車車距c[parent[r1[j]]], 後車車距c[parent[r1[j+1]]], ref 後車車距c[i+1], i);
CrossOver(ref 後車車速c[i], length1, 後車車速c[parent[r1[j]]], 後車車速c[parent[r1[j+1]]], ref 後車車速c[i+1], i);
CrossOver(ref 採取行動c[i], length2, 採取行動c[parent[r1[j]]], 採取行動c[parent[r1[j+1]]], ref 採取行動c[i+1], i);
CrossOver(ref 本車車道代碼c[i], length2, 本車車道代碼c[parent[r1[j]]], 本車車道代碼 c[parent[r1[j+1]]], ref 本車車道代碼c[i+1], i);
CrossOver(ref 本車車種代碼c[i], length3, 本車車種代碼c[parent[r1[j]]], 本車車種代碼 c[parent[r1[j+1]]], ref 本車車種代碼c[i+1], i);
CrossOver(ref 前車車種c[i], length3, 前車車種c[parent[r1[j]]], 前車車種c[parent[r1[j+1]]], ref 前車車種c[i+1], i);
CrossOver(ref 後車車種c[i], length3, 後車車種c[parent[r1[j]]], 後車車種c[parent[r1[j+1]]], ref 後車車種c[i+1], i);
else if(rCrossOver<=r && r<(rCopy+rCrossOver))
{
Mutation(ref 前車車速c[i], length1, 前車車速c[parent[r1[j]]]);
private void CrossOver(ref int var0, int length, int var1, int var2, ref int var3, int i)
{
int r, temp1, temp2;
r = random1.Next(length-1)+1;
//交配法二
temp1 = var1 | (int)(Math.Pow(2, r)-1);
temp2 = (var2>>(length-r)) | ((int)(Math.Pow(2, length-r)-1)<<r);
var0 = temp1 & temp2;
if (ST[i+1] <= 0)
{
temp1 = ((var1 & (int)(Math.Pow(2, r)-1)) << (length-r)) | (int)(Math.Pow(2, length-r)-1);
temp2 = var2 | ((int)(Math.Pow(2, r)-1)<<(length-r));
var3 = temp1 & temp2;
}
}
private void Mutation(ref int var0, int length, int var1)
{
int r;
r = random1.Next((int)(Math.Pow(2, length)-1)+1);
var0 = var1 ^ r;
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
ST[BidWin[i,0]] = ST[BidWin[i,0]]/(1-z8)+z7+z9*10+sample;
correctNB = correctNB+1;
if (ST[i]>0 && 本車車道代碼c[i]==本車車道代碼r && 本車車種代碼c[i]==本車車種代碼r &&
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
BidWin[j,0] = i;
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
ST[i] = ST[i]-z7;
// }
}
//取出得標者, 並進行功勞分配
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
{
if (BidWin[i,1]==BidPrice[z-1])
{
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
r[i] =random2.Next(unchecked((int)totalST));
}
while (k < 2*(z-j) && tempTotalST <= r[k] && r[k] < (tempTotalST+ST[i]))
{
parent[k] = i;
k = k+1;
}
Mutation(ref 本車車速c[i], length1, 本車車速c[random1.Next(z)]);
Mutation(ref 前車車距c[i], length1, 前車車距c[random1.Next(z)]);
Mutation(ref 前車車速c[i], length1, 前車車速c[random1.Next(z)]);
Mutation(ref 後車車距c[i], length1, 後車車距c[random1.Next(z)]);
Mutation(ref 後車車速c[i], length1, 後車車速c[random1.Next(z)]);
Mutation(ref 採取行動c[i], length2, 採取行動c[random1.Next(z)]);
Mutation(ref 本車車道代碼c[i], length2, 本車車道代碼c[random1.Next(z)]);
Mutation(ref 本車車種代碼c[i], length3, 本車車種代碼c[random1.Next(z)]);
Mutation(ref 前車車種c[i], length3, 前車車種c[random1.Next(z)]);
Mutation(ref 後車車種c[i], length3, 後車車種c[random1.Next(z)]);
}
}
Gene(parent, j);
}
}
private void button2_Click(object sender, System.EventArgs e)
{
this.oleDbConnection1.Open();
this.oleReader = this.oleDbSelect1.ExecuteReader();
int j = 0;
while (this.oleReader.Read())
{
if (j<z)
{
//車速 51~130(km/h)每5km/h為一區隔,故有16個區段
//距離11~90(m)每5公尺作一區隔,共16個間隔
this.本車車道代碼c[j] = this.oleReader.GetInt32(0);
this.本車車種代碼c[j] = this.oleReader.GetInt32(1);
this.前車車種c[j] = this.oleReader.GetInt32(2);
this.後車車種c[j] = this.oleReader.GetInt32(3);
this.本車車速c[j] = this.oleReader.GetInt32(4);
this.前車車距c[j] = this.oleReader.GetInt32(5);
this.前車車速c[j] = this.oleReader.GetInt32(6);
this.後車車距c[j] = this.oleReader.GetInt32(7);
this.後車車速c[j] = this.oleReader.GetInt32(8);
this.採取行動c[j] = this.oleReader.GetInt32(9);
this.ST[j] = this.oleReader.GetFloat(10);
this.SP[j] = z5;
j = j+1;
}
}
this.oleDbConnection1.Close();
//開始驗證
int l=0;
correctNB = 0;
this.oleDbSelect1.CommandText = "SELECT 車道代碼, 車種代碼, 本車車速, 前車車速, 後車車速, 前車車距, 後車車距, 本車加速度, 前車車種, 後車車種, 車輛代碼 FROM averageFlowData ORDER BY 車輛代碼";
this.oleDbConnection1.Open();
this.oleReader = this.oleDbSelect1.ExecuteReader();
while (this.oleReader.Read())
{
//車速 51~130(km/h)每5km/h為一區隔,故有16個區段
//距離11~90(m)每5公尺作一區隔,共16個間隔
this.本車車道代碼r = this.oleReader.GetInt32(0);
this.本車車種代碼r = this.oleReader.GetInt32(1);
this.本車車速r = ((int)this.oleReader.GetFloat(2)-51)/z15;
this.前車車速r = ((int)this.oleReader.GetFloat(3)-51)/z15;
this.後車車速r = ((int)this.oleReader.GetFloat(4)-51)/z15;
this.前車車距r = ((int)this.oleReader.GetFloat(5)-11)/z15;
this.後車車距r = ((int)this.oleReader.GetFloat(6)-11)/z15;
if (this.本車車速r < 0){this.本車車速r = 0;}
{
if (System.Math.Abs(this.oleReader.GetFloat(7)) < z14)
{
this.前車車種r = this.oleReader.GetInt32(8);
this.後車車種r = this.oleReader.GetInt32(9);
if (z12 == 0 && z13 == 0)
this.oleDbConnection1.Close();
MessageBox.Show("驗證完成!準確率為" + (correctNB/sample));
tempx=0;
速c[i]==本車車速r && 前車車種c[i]==前車車種r && 前車車距c[i]==前車車距r && 前車車速c[i]==前車車速r && 後車車種c[i]==
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
correctNB = correctNB+1;
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
}
}
//取出得標者, 並進行功勞分配
Array.Sort(BidPrice);
for (int i=0; BidWin[i,1]>0; i++)
{
if (BidWin[i,1]==BidPrice[z-1])
{
if (採取行動c[BidWin[i,0]]==採取行動r)
{
correctNB = correctNB+1;
break;
}
}
}
}
//完全不合的
if (BidWin[0,1]==0)
{
if (this.random1.Next(3) == 採取行動r)
{
correctNB = correctNB+1;
tempx4=tempx4+1;
}
}
}
} }