開發一個模擬國三高速公路車流的交通儀表板:網頁+python

更新 發佈閱讀 10 分鐘

寫這個模擬國三高速公路車流即時交通網頁程式,本來是要參加一個比賽的,但發現主辦單位還要求參加者要用紙本方式郵寄,這世代居然還有不是全然用網站上傳的方式的AI類比賽,最後讓我打了退堂鼓。

網頁程式畫面如下:

raw-image

對source code有想研究的可至github 下載:
主要程式發想如下:

智慧交通模擬系統  程式碼說明

這份文件詳細說明了  檔案的架構、功能與核心邏輯。此程式碼使用 Python 的 FastAPI 框架,建構一個功能豐富的後端服務,用於模擬一個基於多智能體強化學習 (MARL) 的國道動態路徑推薦系統。

一、 系統概覽 📜

本系統旨在模擬一個真實且複雜的交通環境,並在其中運行一個 MARL 路徑推薦模型,以達成兼顧「單車效益」與「路網總體效率」的目標。

核心功能包括:

  • 真實路網建模: 基於真實的國道三號交流道位置與路段資訊,建構一個詳細的交通網絡圖。
  • 多樣化車輛模擬: 模擬不同類型的車輛(私家車、貨車、公車、緊急車輛),每種車輛具有不同的行為模式與優先級。
  • 複雜交通情境: 能夠模擬多種真實世界的交通事件,如主線事故、連鎖反應、道路施工、尖峰時段、惡劣天氣、大型活動等。
  • MARL 推薦核心: 內建一個以 Q-Learning 為基礎的 MARL 推薦器,智能體(車輛)能夠在模擬中學習與演化其路徑選擇策略。
  • 智能體協調機制: 包含多種協調策略(如拍賣、共識),以解決多智能體之間的潛在衝突。
  • 動態 API 服務: 提供多個 API 端點,允許前端(如 index.html)即時獲取交通狀態、觸發事件、重置模擬等,實現動態視覺化。

二、 程式碼架構解析 🏗️

程式碼主要由以下幾個部分組成:

1. FastAPI 應用程式設置

  • 使用 FastAPI() 創建主應用實例。
  • 透過 CORSMiddleware 設置跨域資源共享 (CORS),允許來自任何來源(origins = ["*"])的前端頁面訪問後端 API,這對於開發階段非常重要。
  • 設置一個靜態文件根目錄,使 FastAPI 可以直接提供 index.html

2. 國道路網定義 (NODE_COORDSSEGMENT_DEFINITIONS)

這是系統模擬的基礎,定義了交通網絡的物理屬性。

  • NODE_COORDS (節點座標):
    • 一個字典 (Dictionary),儲存了國道三號沿線所有交流道、系統交流道、服務區的真實地理座標(緯度、經度)。
    • 同時也包含了部分替代道路、省道與國道一號的重要節點,用於模擬跨路網的交通行為。
  • SEGMENT_DEFINITIONS (路段定義):
    • 一個字典,定義了連接各節點的路段。
    • 每個路段包含其 起始節點、結束節點、長度(km)、速限(km/h)、車道數 等關鍵資訊。
    • 涵蓋了國道三號主線、系統交流道連接段以及替代道路,構建了一個龐大且複雜的路網圖。

3. 車輛與事件定義 (VEHICLE_POOLevent_queue)

  • VEHICLE_POOL (車輛池):
    • 一個列表 (List),預先定義了多種類型的車輛,用於在模擬開始時初始化交通流。
    • 每輛車包含 ID、起點、終點、車輛類型 (private, truck, bus, emergency) 和 優先級。
    • 車輛類型涵蓋了長途、中途、區域、短途以及緊急車輛,使模擬更具真實性。
  • event_queue (事件佇列):
    • 一個列表,用於儲存所有預定發生的交通事件。
    • 透過 add_event() 函數將事件(如事故、施工)安排在特定的模擬時間步 (time_step) 發生。系統會在每個時間步檢查並觸發相應事件。

4. 多智能體強化學習核心 (MARLPathRecommenderQLearningAgent)

這是系統的智慧大腦 🧠,負責決策與學習。

  • QLearningAgent Class:
    • 定義了單一智能體(車輛)的行為。
    • 使用 Q-Learning 演算法,每個智能體維護一個 Q-Table,記錄在特定狀態 (state)下採取特定動作 (action) 的預期回報。
    • 採用 ε-貪婪 (epsilon-greedy) 策略在「探索」(隨機選擇)和「利用」(選擇 Q 值最高的動作)之間進行權衡。
    • update_q_value() 函數根據獎勵 (reward) 和貝爾曼方程 (Bellman equation) 來更新 Q-Table,實現學習。
  • MARLPathRecommender Class:
    • 這是管理所有智能體的中央協調器。
    • get_or_create_agent(): 為新加入的車輛創建對應的 QLearningAgent 實例。
    • calculate_reward(): 核心獎勵函數。獎勵的計算綜合考慮了多種因素:旅行時間:時間越長,獎勵越低。路段狀態:選擇暢通路段(green)有高獎勵,選擇壅塞路段(red)會受懲罰。路段利用率:避免選擇已過度擁擠的路段。協調獎勵:鼓勵智能體們做出差異化選擇,避免扎堆。
    • predict_congestion(): 一個簡單的擁塞預測模型,基於歷史數據預測未來路段的擁塞可能性。
    • coordinate_agents(): 智能體協調機制。提供多種策略(如基於出價的拍賣或避免衝突的共識),解決多個智能體同時請求路徑時的資源分配問題。
    • recommend_path(): 根據車輛類型(普通或緊急)、當前路況和 Q-Learning 策略,為車輛推薦最佳路徑。

5. 模擬循環與狀態更新 (simulate_traffic_update)

這是模擬系統的心跳 ❤️,每個時間步都會執行一次,推動整個世界的演進。

  1. 處理事件 (process_events): 檢查 event_queue,觸發當前時間步需要發生的所有事件。
  2. 更新路段狀態: 根據路段利用率、時間因素(尖峰/離峰)、天氣因素等多重因子,動態計算每個路段的 current_speed 和 status (greenyellowred)。
  3. 智能體協調與學習:
    • 為每個需要重新規劃路徑的智能體收集資訊。
    • 調用 coordinate_agents 進行協調。
    • 調用 update_learning 更新每個智能體的 Q-Table。
  4. 車輛移動:
    • 根據路段的有效速度 (effective_speed) 和車輛類型,計算車輛在一個時間步內移動的距離。
    • 更新車輛在路段上的進度 (progress_on_segment) 和地理座標 (lat, lon)。
    • 當車輛到達路段終點時,將其移動到推薦路徑的下一個路段。
    • 當車輛到達最終目的地時,將其從模擬中移除。
  5. 生成新需求: 以一定機率隨機生成新的車輛,使交通流持續不斷。
  6. 更新系統指標: 匯總計算整個路網的平均速度、總旅行時間等宏觀指標。

6. API 端點 (Endpoints)

系統提供了一系列 RESTful API,供前端調用。

  • GET /: 回傳 index.html 頁面。
  • GET /traffic_update核心接口,回傳當前模擬時間步的所有交通狀態數據 (路段、車輛、事件、指標)。
  • GET /marl_stats: 提供 MARL 模型的學習統計數據。
  • POST /trigger_event: 允許前端手動觸發一個自定義交通事件。
  • POST /reset_simulation重置整個模擬到初始狀態。
  • POST /clear_events: 清除所有待處理的事件。
  • POST /retrain_agents: 重置所有智能體的學習進度,用於重新訓練。
  • GET /simulation_status: 獲取模擬器的簡要狀態。

7. 啟動事件 (startup_event)

  • 在 FastAPI 服務啟動時,會自動執行此函數。
  • 這裡預設了一系列複雜的、環環相扣的交通情境,例如:
    • 主線事故與連鎖二次事故。
    • 道路施工與尖峰時段疊加。
    • 緊急車輛通行測試。
    • 惡劣天氣事件。
    • 大型活動散場模擬。
    • 動態改變 MARL 協調機制。
    • 系統壓力測試。

這使得模擬一開始就充滿了各種挑戰,能充分展示系統的動態應變與學習能力。


三、 如何運行與使用 ▶️

  1. 安裝依賴:
    pip install fastapi uvicorn "python-multipart[standard]" numpy
  2. 啟動後端服務: 在終端機中,於 app.py 檔案所在的目錄下執行以下命令:
    uvicorn app:app --reload
    服務將啟動於 http://localhost:8000
  3. 訪問前端頁面: 在瀏覽器中打開 http://localhost:8000,即可看到視覺化模擬界面。前端頁面(index.html)會定期調用 /traffic_update API 來獲取數據並更新畫面。
raw-image


留言
avatar-img
Hank吳的沙龍
8會員
135內容數
這不僅僅是一個 Blog,更是一個交流與分享的空間。 期待在這裡與你相遇,一起探索科技、體驗生活、夢想旅行!💖
Hank吳的沙龍的其他內容
2026/01/08
產生步驟: 1.打開Gemini : 上傳一張 建築物的照片,例如: 101 2.輸入Prompt: Create an orthographic blueprint that describes this building in plan, elevation and section.
Thumbnail
2026/01/08
產生步驟: 1.打開Gemini : 上傳一張 建築物的照片,例如: 101 2.輸入Prompt: Create an orthographic blueprint that describes this building in plan, elevation and section.
Thumbnail
2026/01/08
Gemini nano banana 製作的圖,解析度越來越高了 (目前為2.8K),不管是寫文章或簡報的配圖,幾乎都用它來產出,但多少會因圖片上的watermark,覺得多少有點瑕疵。 所以構思撰寫個網頁程式來移除浮水印的可行性
Thumbnail
2026/01/08
Gemini nano banana 製作的圖,解析度越來越高了 (目前為2.8K),不管是寫文章或簡報的配圖,幾乎都用它來產出,但多少會因圖片上的watermark,覺得多少有點瑕疵。 所以構思撰寫個網頁程式來移除浮水印的可行性
Thumbnail
2026/01/06
康波週期(Kondratiev Wave,簡稱 K-Wave),全稱為「康德拉季耶夫週期」,是由蘇聯經濟學家尼古拉·康德拉季耶夫(Nikolai Kondratiev)於 1920 年代提出的一種長達 50 至 60 年的經濟長週期。 ​它被認為是宏觀經濟學中跨度最長的循環,核心驅動力是技術革命。
Thumbnail
2026/01/06
康波週期(Kondratiev Wave,簡稱 K-Wave),全稱為「康德拉季耶夫週期」,是由蘇聯經濟學家尼古拉·康德拉季耶夫(Nikolai Kondratiev)於 1920 年代提出的一種長達 50 至 60 年的經濟長週期。 ​它被認為是宏觀經濟學中跨度最長的循環,核心驅動力是技術革命。
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
市場經驗拉長之後,很多投資人都會遇到同一個問題:不是方向看錯,而是部位太集中個股,常常跟大趨勢脫節。 早年的台股環境,中小股非常吃香,反而權值股不動,但QE量化寬鬆後,特別是疫情之後,後疫情時代,鈔票大量在股市走動,這些大資金只能往權值股走,因此早年小P的策略偏向中小型個股,但近年AI興起,高技術
Thumbnail
市場經驗拉長之後,很多投資人都會遇到同一個問題:不是方向看錯,而是部位太集中個股,常常跟大趨勢脫節。 早年的台股環境,中小股非常吃香,反而權值股不動,但QE量化寬鬆後,特別是疫情之後,後疫情時代,鈔票大量在股市走動,這些大資金只能往權值股走,因此早年小P的策略偏向中小型個股,但近年AI興起,高技術
Thumbnail
在嘉義縣竹崎鄉的竹崎公園內,藏著一條名為「花仙子步道」的浪漫小徑。它由「野薑花步道」與「杜鵑花步道」兩段組成,全程以無障礙設計打造,木棧道平坦、欄杆雪白,蜿蜒於林蔭之間,交錯的線條宛如童話中的仙子足跡,成為攝影愛好者的熱門打卡點。 夏日烈陽下,樹冠為你撐起天然綠傘,空氣中飄散著草木清香,夾雜一縷縷
Thumbnail
在嘉義縣竹崎鄉的竹崎公園內,藏著一條名為「花仙子步道」的浪漫小徑。它由「野薑花步道」與「杜鵑花步道」兩段組成,全程以無障礙設計打造,木棧道平坦、欄杆雪白,蜿蜒於林蔭之間,交錯的線條宛如童話中的仙子足跡,成為攝影愛好者的熱門打卡點。 夏日烈陽下,樹冠為你撐起天然綠傘,空氣中飄散著草木清香,夾雜一縷縷
Thumbnail
某天晚上,老婆突然問我:「老公,開車去尖石鄉要很久嗎?」 我放下手邊的事,抬頭望著她,有些疑惑地回道:「怎麼了?那裡在新竹山區,路程可不算近,開車大概要三個小時吧。」 「我在貓咪論壇上看到,有一隻貓咪在露營區被捕獸夾夾到。牠拖著捕獸夾逃進山裡,好像有人在求救……」她語氣急切,眼裡閃著擔憂的光。 「
Thumbnail
某天晚上,老婆突然問我:「老公,開車去尖石鄉要很久嗎?」 我放下手邊的事,抬頭望著她,有些疑惑地回道:「怎麼了?那裡在新竹山區,路程可不算近,開車大概要三個小時吧。」 「我在貓咪論壇上看到,有一隻貓咪在露營區被捕獸夾夾到。牠拖著捕獸夾逃進山裡,好像有人在求救……」她語氣急切,眼裡閃著擔憂的光。 「
Thumbnail
駕駛:小愛,小愛,請為我導航到三地門的路線。導航:好的,沒有問題。請走國道3號高速公路。 駕駛:小愛,我不要走高速公路。導航:主人,是因為……窮嗎? 駕駛:不是啦!我只是不想走高速。導航:明白了主人,那麼——總長283公里,會經過405個紅綠燈。 駕駛:什麼?405個紅綠燈?不能找
Thumbnail
駕駛:小愛,小愛,請為我導航到三地門的路線。導航:好的,沒有問題。請走國道3號高速公路。 駕駛:小愛,我不要走高速公路。導航:主人,是因為……窮嗎? 駕駛:不是啦!我只是不想走高速。導航:明白了主人,那麼——總長283公里,會經過405個紅綠燈。 駕駛:什麼?405個紅綠燈?不能找
Thumbnail
高速公路拉麵店,價錢對上這個品質OK!
Thumbnail
高速公路拉麵店,價錢對上這個品質OK!
Thumbnail
位於台南市楠西區與南化區交界的竹子尖山,是台南市第二高峰,也是台灣小百岳之一。這座海拔1110公尺的郊山,地處阿里山山脈南段,屬於西拉雅國家風景區的一部分。竹子尖山步道以環狀路線、多元景觀和四季皆宜的特色,吸引無數登山客與自然愛好者前來探索。無論是俯瞰嘉南平原的壯麗風光,還是欣賞梅花盛開與螢火蟲飛舞
Thumbnail
位於台南市楠西區與南化區交界的竹子尖山,是台南市第二高峰,也是台灣小百岳之一。這座海拔1110公尺的郊山,地處阿里山山脈南段,屬於西拉雅國家風景區的一部分。竹子尖山步道以環狀路線、多元景觀和四季皆宜的特色,吸引無數登山客與自然愛好者前來探索。無論是俯瞰嘉南平原的壯麗風光,還是欣賞梅花盛開與螢火蟲飛舞
Thumbnail
桃山,位於雪霸國家公園內,是武陵四秀中最具魅力的山峰,以秀麗的山容與絕佳的展望聞名。從武陵農場出發,沿桃山瀑布步道進入,經南稜攀登,沿途高山草坡與針葉林交錯,景色壯麗。步道全程陡升約1440公尺,單程7.9公里,對體力是一大考驗,但登頂後的無垠風光絕對值得。山頂可眺望聖稜線、大霸群峰、南湖、中央尖等
Thumbnail
桃山,位於雪霸國家公園內,是武陵四秀中最具魅力的山峰,以秀麗的山容與絕佳的展望聞名。從武陵農場出發,沿桃山瀑布步道進入,經南稜攀登,沿途高山草坡與針葉林交錯,景色壯麗。步道全程陡升約1440公尺,單程7.9公里,對體力是一大考驗,但登頂後的無垠風光絕對值得。山頂可眺望聖稜線、大霸群峰、南湖、中央尖等
Thumbnail
位於台北市文山區貓空的登高步道,是一條由台北市大地工程處於2013年打造的迷你步道,鄰近明德宮。這條步道以其平易近人的設計聞名,階梯平整好走,宛如自家樓梯,適合各年齡層的健行者。雖然全長僅0.28公里(往返0.56公里),卻能讓你輕鬆登高,飽覽台北盆地的壯麗景色,是短程健行的絕佳選擇!
Thumbnail
位於台北市文山區貓空的登高步道,是一條由台北市大地工程處於2013年打造的迷你步道,鄰近明德宮。這條步道以其平易近人的設計聞名,階梯平整好走,宛如自家樓梯,適合各年齡層的健行者。雖然全長僅0.28公里(往返0.56公里),卻能讓你輕鬆登高,飽覽台北盆地的壯麗景色,是短程健行的絕佳選擇!
Thumbnail
國道三號的清水服務區經過八個月的整修,終於重新開放試營運。我們趁著週末,特地過來一探究竟,感受這個被譽為「國道金母雞」的服務區新風貌。 . 雖然清水服務區距離我們家並不遠,但坦白說,我們已經有好幾年沒來了。為什麼?因為行駛國道時,北上的話,我們通常選擇關西或湖口服務區稍作休息;南下時
Thumbnail
國道三號的清水服務區經過八個月的整修,終於重新開放試營運。我們趁著週末,特地過來一探究竟,感受這個被譽為「國道金母雞」的服務區新風貌。 . 雖然清水服務區距離我們家並不遠,但坦白說,我們已經有好幾年沒來了。為什麼?因為行駛國道時,北上的話,我們通常選擇關西或湖口服務區稍作休息;南下時
Thumbnail
炎熱的午後,術後逐漸恢復行動力的家母,在家漸漸待不住了!於是趁著假日,帶著兩個孩子陪著阿嬤一起到了這個冬天比夏天美的地方⋯
Thumbnail
炎熱的午後,術後逐漸恢復行動力的家母,在家漸漸待不住了!於是趁著假日,帶著兩個孩子陪著阿嬤一起到了這個冬天比夏天美的地方⋯
Thumbnail
一眼望去,無限延伸的高架橋墩、層層高低起伏的階梯和樹木,形成獨特的步道,像是遺世而存在的另一個世界,高低落差大,使得拍起照來景深變化更為多元。
Thumbnail
一眼望去,無限延伸的高架橋墩、層層高低起伏的階梯和樹木,形成獨特的步道,像是遺世而存在的另一個世界,高低落差大,使得拍起照來景深變化更為多元。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News