01
12306花了3億沒解決的問題
前文《》說到12306 app存在2個問題:
1.1搜出的中轉方案不是最快的
從贛州西站去保定東站,用12306搜索出的中轉方案如下圖所示:
![]()
這些中轉方案是按總耗時排的序,可以看出,12306搜出的最快方案為11:44出發、23:00到,用時為11小時16分鐘,明顯不是真正的最快方案。
1.2只支持中轉1次
12306無論是中轉,還是定制中轉,都只支持中轉1次,比如我搜索:贛州西站——石河子站,怎么搜都顯示無法到達。
![]()
02
我是怎么解決12306問題的?
我針對以上2個問題向12306客服郵箱(kyfw@12306.cn)提出建議,請求TA們升級功能,使app支持多次中轉、并確保搜出的方案是真的前K最快方案。
然而12306一直沒有回應,這咋辦?
如果每次旅途能省下1個人的1小時,14億人就是14億個小時,14億小時/24小時/365天/80年=2千萬人,時間就是生命,相當于每次能省下2千萬條人命。
節省全國人民坐火車的時間功德無量,于是,我決定不等12306了,生死看淡,不服就干,從2023年9月1日開始開發“野貓版12306”。
我是電氣博士,以前開發的都是電網仿真與分析軟件,因此,對超大型網絡分析是有研究基礎的,火車網跟電網差不多,也是最復雜的人造網絡之一。
下圖是我繪制的全國火車網絡圖,一鍵布局、自動繪制,圖太大,只能截圖展示部分。
![]()
注:本文所有圖片皆高清,點擊可放大查看
我的開發步驟如下:
1)開發網絡爬蟲爬取全國列車時刻表,形成火車網字典;2023/9/1完成
2)網絡爬蟲爬取全國各車站所屬省份,形成車站-分區字典;2023/9/5完成
3)將火車網字典轉換為電網數據,對車站進行分區管理;2023/9/10完成
4)建立全國火車網圖,支持雙向、多回路、多標簽,方便未來的功能擴展;2023/9/11完成
5)將車站按時刻不同劃分為多個子站,添加子站之間的空線路,以乘車時長作為線路權重,搜索兩兩之間的最短路徑;2023/9/13完成
6)對搜出的路徑進行精簡、整合、形成路徑描述字符串及時長,對路徑字典按時長排序,輸出前K條最短路徑。2023/9/15完成
7)允許時間篩選、站名擴展,支持指定多個中轉站。2023/9/18完成
8)提高程序運行速度和準確率,讓用戶使用更傻瓜、更友好。正在完成中,軟件有任何問題,歡迎大家批評指正,提出改善建議。
9月的課余時間多數都投入在開發這軟件上了,代碼量約2千行,當前發布的算是1.0版本,綠色運行文件夾如下圖所示:
![]()
注:本文所有圖片皆高清,點擊可放大查看
03
野貓版12306的功能和用法
首先申明,本次開發和測試用的是個人電腦,內存和CPU性能有限,不敢開多線程,因此圖論搜索用時較長,如果換成12306之類的大公司的服務器,開多線程、運行速度不是問題。
野貓版12306共有以下5大功能:
3.1更強大的單次中轉方案搜索
啟動程序之后界面如下圖所示,在關鍵詞框中輸入火車站名,比如“贛”,點擊篩選,會篩選出贛州站和贛州西站等所有名字帶“贛”的。
雙擊列表中篩選出的“贛州西”,即完成出發站的設置,同理設置目的站。
你如果記得火車站的全名,可以不篩選、直接在出發站文本框中輸入火車站全名。
軟件的每個按鈕都提供了懸停提示,哪里不會就把鼠標懸停在哪。
![]()
12306搜出的最快方案為11:44出發、23:00到,用時為11小時16分鐘。
從上圖可以看出,野貓版12306搜出的前11個最快方案,最慢的都比12306的快,最快的只需要9小時26分鐘。搜索用時<1秒。
將K值改為20,搜索前20個最快方案,發現12306的最快方案,實際就是野貓版12306的第18快方案。
3.2二次中轉方案搜索
將中轉次數由1次改為2次,再次搜索前9個最快方案(超過9個1張截圖顯示不全),結果如下圖所示:
![]()
從上圖可以看出,中轉次數從1次到2次會量變引起質變,程序無法短時通過簡單搜索獲取最優方案,而需要生成火車網絡圖,利用圖論搜索。
最終生成了1張包含5.7萬個節點、46.6萬條支路的全國火車網絡圖,搜索用時達到155秒。
可以看到,贛州西到保定東用12306搜索中轉1次最快要11小時16分,用野貓版12306中轉1次最快要9小時26分、中轉2次最快要8小時34分。
(8*60+34)/(11*60+16) = 76.04%,由此可見野貓版12306可以節省旅途約1/4的用時,贛州西到保定東的用時少了近3小時。
3.3不限次中轉方案搜索
將中轉次數由2次改為不限,再次搜索前9個最快方案(K值超過9個時1張截圖顯示不全,K值想取多大就可以取多大,幾乎不影響運行速度),結果如下圖所示:
![]()
可以看出,不限中轉次數的搜索是真的全局搜索,生成了1張包含6.3萬個節點、582.2萬條支路的全國火車網絡圖,搜索用時達到317秒。
它搜出的方案是真的全網最快,贛州西到保定東只用了8個半小時。上圖還可以看出,并非中轉次數越多就越快,一般2次以內就可以取得最快方案。
3.4時間過濾
軟件支持對出行方案進行時間過濾,限制最早和最晚的出發時間、最早和最晚的到達時間。
如果搜索之前未限制,也可以事后對搜出的結果進行時間過濾。
![]()
從贛州西到烏魯木齊,12306搜索最少要用44小時45分,用野貓版12306只需要33小時53分鐘。(縮時搜索,上圖方案并非全局最優)。
車型為GDCT時,形成的火車網絡圖有12.7萬節點、1171.7萬支路;車型為GDCZ時,形成的火車網絡圖有12.8萬節點、1199.1萬支路。
網絡越大,搜索用時也越長,因此,建議只輸入需要的車型。
![]()
上圖是我真花時間搜的,用了1847秒,已經是GDCZ車型下的全國最快方案。贛州西去烏魯木齊最快要31小時36分鐘,比12306的省了13個多小時。
如果還要考慮T和K字頭的火車,則將車型改為GDCZTK,有可能會有更快方案,但搜索用時會更長,我就不演示了。
3.5指定中轉站
指定中轉站之后,程序搜索最短路徑的難度大為下降,只需要簡單搜索即可,不必圖論搜索,因此搜索速度會更快。
指定1個中轉站如下圖所示,搜索用時為0.033秒。
![]()
指定2個中轉站如下圖所示,用時為0.702秒。
![]()
指定中轉站的優先級高于中轉次數,也就是如果用戶輸入了2個中轉站、但限制了中轉次數為1,程序會優先滿足那2個中轉站、中轉2次。
指定3個中轉站如下圖所示,用時為6.631秒。
![]()
指定4個中轉站如下圖所示,用時為58.792秒。
![]()
總結:12306只支持1次中轉,且搜出的最快方案,并非1次中轉方案中最快的。野貓版12306很好的解決了這2個問題,能確保搜出的1次中轉方案是最優的,并支持多次中轉和時間過濾。
04
野貓版12306的獲取與更新
人生三不朽,立德、立功、立言。本人是大學老師,開發此軟件為的是廣積善緣。
大家可以回復“火車”免費獲取本軟件的綠色版,下載之后解壓,解壓之后不用安裝、直接雙擊“野貓版12306.exe”即可運行。
軟件文件夾中有個“列車時刻表.txt”文件,是用“野貓網絡.exe”從攜程官網爬取的列車信息,每季度列車調圖之后需要一鍵更新它。
9月27日至10月4日是本季度的列車調圖時間,許多列車暫時停運了,10月5日我會主動更新1次。
大家只需要回復“火車”,獲取的就是最新的“列車時刻表.txt”和“野貓版12306.exe”。
任何軟件,都需要用戶的不斷使用與反饋才能完善,因此,歡迎大家進讀者群交流,對軟件提出寶貴的修改意見。
讀者群也是互助群,博士們在線答疑,有問必答,回復“幫助”可進群。
有電氣軟件開發需求的,歡迎找我合作,只要項目真正有用,我都愿意開發。
作為贛州人,生死看淡,不服就干,實干興邦!!!
往期相關文章:
![]()
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.