專案成果與過程分享:從圖論導航到 AI 風險預測的多模態路徑系統

這個專案是怎麼開始的

專案一開始時,其實只是想做個結合Youbike的路線規劃工具,但到後來才發現,真正的問題不在於怎麼畫路線,而是路線到底能不能自己算。如果整個系統都依賴商業地圖 API,很多事情就會變得很難做,比如 YouBike 站點到底值不值得去、票價和體力要怎麼一起算、使用者偏好又要怎麼真的影響路徑結果。

所以這個專案最後走的是一條比較硬派的路:前端保留地圖的呈現與互動,後端則自己處理圖論搜尋、票價計算、廣義成本與風險預測。這樣做的好處很直接,系統不只能用,而且每一步都說得清楚、驗證得出來。

我怎麼把資料接起來

真正開始做之後,第一個大工程不是模型,而是資料整合。因為一個能用的導航系統,前提不是演算法多漂亮,而是手上必須有一張夠完整、夠一致的交通路網圖。

這部分我把幾種資料串在一起:

  • OSM 路網,當作基礎道路結構
  • 台北市捷運、公車、臺鐵與 YouBike 資料,當作多模態運具層
  • SQLite,負責保存票價、站點與路線資訊
  • 歷史 YouBike 快照,拿來做預測模型與回測驗證

接完之後,整個系統就不再只是地圖上的點和線,而是一張能拿來算路徑的城市路網。

核心運算其實在後端

前端看起來像是一個導航介面,但真正重要的部分其實都在後端。我把它拆成幾個角色來做:

  • GraphService 負責載入圖資、找最近節點、跑 A* 路徑搜尋
  • FareCalculator 負責捷運、公車、臺鐵和 YouBike 的票價與費率
  • CostService 負責把時間、金錢、體力和風險整合成廣義成本
  • PredictionService 負責根據歷史供給量預測 YouBike 站點風險

我希望它算出來的不是單純的最短路,而是合理的路。這也是整個專案跟一般導航功能最大的差別。

我做了哪些實際成果

自研圖論引擎

專案最先完成的是圖論搜尋引擎。除了基本道路搜尋之外,我也把捷運、公車、臺鐵和 YouBike 站點一起放進圖裡,讓 A* 不只是找街道,而是可以找一條真正跨運具的完整旅程。

這一段其實踩了不少坑,所以也做了幾個關鍵修正:

  • 用 BallTree 加速最近節點搜尋
  • 修正 OSM 權重型別不一致的問題
  • 修正距離累計錯誤
  • 移除重複函式和孤立實例化造成的混亂

這些看起來很像工程瑣事,但實際上會直接影響結果是不是可信。如果底層圖資有問題,後面所有分析都會跟著偏掉。

多目標成本函數

傳統導航通常只看距離或時間,但我想做的是把問題拉回到真實使用情境,所以成本函數同時考慮了四件事:

  • 行走時間
  • 金錢成本
  • 體力消耗
  • 站點風險

這樣一來,系統就能依照不同需求輸出不同路線。趕時間的人和想省錢的人,理論上就應該拿到不同答案,而不是被同一條路徑綁死。

LSTM 風險預測

另一個重點是 YouBike 的最後一哩路問題。因為站點供給量是會變的,所以只靠靜態圖論不夠,我就加了 BiLSTM 預測模型,使用歷史快照、時間特徵和站點供需資訊去預測未來可借車輛數。

這一層的角色不是取代圖論,而是補上圖論看不到的時間變化。簡單說,圖論管空間,LSTM 管時間,兩個放在一起,路徑決策才會更接近真實體驗。

回測驗證

我不想只靠單一案例說這個系統有效,所以後面又做了回測流程,把歷史快照擴充成多批次模擬,然後比較兩種策略:

  • Naive Strategy:直接前往最近站點
  • AI-Aware Strategy:避開預測供給不足的站點

結果很清楚,AI-Aware 的空站風險明顯比較低,而且不是只有單一時間點有效,在多快照統計下也維持一致優勢。這部分是我覺得最有說服力的地方,因為它不只看起來合理,在真實體驗上也能在數據上看到效果。

現在做到哪裡了

如果把目前的成果整理一下,現在這個專案已經不只是想法,而是一個完整可展示的系統。

工程上,已經完成:

  • 台北市完整多模態路網建置
  • 自研路徑搜尋與票價計算
  • YouBike 歷史資料收集與風險預測
  • 前後端整合與多場景測試

研究上,已經完成:

  • 可說明的廣義成本模型
  • 用 LSTM 補足供給變動的時間序列問題
  • 用回測驗證動態避險策略
  • 把路徑決策從單一最短路提升成多目標最佳化

開發過程中最花時間的地方

老實說,這個專案最花時間的不是把第一版功能寫出來,而是修那些會讓結果失真的細節。

像是資料庫路徑用相對路徑,啟動位置一變就可能讀錯檔案;權重欄位型別不一致,A* 就可能直接出錯;交通模式切換沒寫好,票價和路段顯示就會亂掉;預測模型如果沒有跟回測串起來,風險降低率就只是數字,沒有說服力。

這些問題最後都不是靠某一個神奇演算法解決的,而是靠資料、工程和驗證一起慢慢收斂。

我現在怎麼看這個系統

如果只用一句話來形容現在的成果,我會說:這已經不是一個單純的地圖導航系統,而是一個能同時考慮空間結構、交通模式、即時供給和風險預測的路徑分析平台。

我覺得它的價值主要有三個:

  1. 技術上,證明自研圖論和 AI 預測可以放進同一套導航架構
  2. 研究上,讓多目標成本函數和動態風險評估可以被驗證
  3. 實務上,提供一個可用的工具,讓使用者在規劃路線時能真正考慮到時間、金錢、體力和風險

接下來我想繼續做的事

這個專案其實還有不少可以繼續優化的地方:

  • 增加回測樣本數,讓結果更真實
  • 持續優化 YouBike 預測模型和特徵工程
  • 研究更細緻的多階段轉乘策略,減少節點吸附造成的偏差

未來應該會給這個系統持續迭代加料,不只是讓它更好用,也讓它在研究上能有更多的洞見。

畢竟某人拿這玩意去投了科展,不繼續玩不行

技術棧

前端

  • HTML5 / CSS3 / Vanilla JavaScript
  • Google Maps JavaScript API
  • HTML Geolocation API
  • 透過 Cloudflare R2 / Worker 提供靜態前端與 API 分流

後端

  • Python 3.11
  • FastAPI
  • Uvicorn
  • Pydantic
  • SQLAlchemy
  • httpx
  • python-dotenv
  • polyline
  • NetworkX
  • OSMnx
  • scikit-learn
  • PyTorch
  • NumPy
  • pandas

資料與演算法

  • SQLite
  • GraphML 路網資料
  • OSM / TDX 資料整合
  • A* 圖論搜尋
  • BallTree 空間索引
  • BiLSTM 供給預測
  • 廣義成本函數 / 多目標最佳化

部署與維運

  • Docker
  • Docker Compose
  • Cloudflare Tunnel
  • Cloudflare Worker
  • Wrangler
  • R2

資料管線與自動化

  • Python ETL 腳本
  • YouBike 歷史快照爬取
  • 回測模擬腳本