當前位置:首頁 » 操作系統 » 演算法題換乘

演算法題換乘

發布時間: 2023-02-10 22:33:10

A. 公交換乘查詢演算法如何計及步行

先搜索一條最優路徑,再從目的地反向查找,將找到的點和條最優路徑對比,
比如:最優路徑倒數點為A,現在查找的為B,判斷B到A的距離,小於我們的要求即為所要求的點,存入(這里可以有多個符合的點)然後再對每個點按上面的那樣尋找,直到找到出發點。。
還有一種是隨便找到一條路線,再以中間點做為換乘點,搜尋附近的點,再判斷搜尋到的點到起始和結束點的距離,進行判斷,。

B. 換乘缺陷的演算法應用

新線開通與漏洞

隨著廣州地鐵8號線北延段開通,廣州地鐵的很多站點都換上了新的票價指示圖。但是我發現,由於8號線西村站無法和5號線進行換乘,導致很多區段的票價仍然按照原票價執行,並未能達到減價的目的。

除此之外,有些站去近的站點反而比去遠的站點繞遠路,造成加價。

本文將以最短路徑演算法的應用為例,去尋找8號線西村站造成的票價問題(准確來說是里程問題)。

背景知識

本文將用迪傑斯特拉演算法進行分析,演算法如下:

本文為簡化地鐵線路圖的分析,僅截取2號線飛翔公園以南,昌崗以北,5號線小北以西,1號線公園前以西,6號線海珠廣場以西,沙貝以東,8號線昌崗以西,同德以南,廣佛線燕崗以西,西塱以東的部分進行分析。

同時取精確到0.1公里的站距,票價按4公里內2元,4-12公里每4公里加1元,12-24公里每6公里加1元(因區域內只存在最高5元票價,後略)計算。規定超過臨界票價里程0.5公里加1元(即4.4公里2元,4.5公里3元)。(但為方便計算,里程乘10後再寫入演算法。)

具體分析

為進一步簡化模型,規定起始站為1號節點,途徑的站點僅換乘站和區域內的端點站標注節點,其他一律不計。本文將選取芳村、燕崗、陳家祠、西村、沙貝和公園前6個代表性車站作為示例,說明西村換乘對線網票價的影響。

這兩張圖是芳村站前往各站的里程圖,上圖是西村開通之後的,下圖是西村開通之前的。主要差距在於西村(節點11),廣州火車站(節點12),小北(節點14),尤其是西村,換乘與否增加了2.7公里,甚至超過了相鄰的鵝掌坦站的里程,可見對於1號線西段來說,西村換乘與否會影響前往5號線西段的便捷程度。

這是陳家祠站的里程對比,眾所周知,由於陳家祠換乘的開通,荔灣區北片前往海珠西部不需要再通過6號線迂迴換乘,所以沙園加入了陳家祠的2元俱樂部。但是依然是西村(節點10),廣州火車站(節點11),小北(節點13)存在問題,所以說,解決西村換乘問題對老西關地區和西村聯絡還是有幫助的。

和芳村、陳家祠不一樣,公園前由於2號線的強力作用(北通機場,南接順德),所以8北開通對公園前影響很有限,最多就是西村換乘通車之後,可以減少西村前往北京路商圈的換乘問題。

西村——影響太大了,除了去5號線本線的滘口(節點14),坦尾(節點9),廣州火車站(節點11),小北(節點13)外,其他都可以減里程。尤其是西村-西塱,相比5-6-1,8-廣佛的換乘更加快捷(可以省2.7公里,還有沙園站同台換乘的便利)。這說明西村換乘對西村本站的優勢是最大的,對西村長期依靠地面交通聯絡老西關、芳村和海珠有極大幫助。

燕崗可以說是近幾年市區站點中的大贏家,2018年,廣佛線最後3個站開通,燕崗不再是終點;2019年,8號線鳳凰新村-文化公園開通,燕崗站前往6號線沿途各站無需繞行2號線;2020年,8號線再次向北延伸,陳家祠換乘讓荔灣北片不再遙遠。但如果西村換乘開通,燕崗的潛力更大,至少前往5號線沿線的站點可以不用繞行2號線,充分體現了8號線北延段為2號線分流的作用。

沙貝受到西村換乘的影響很小,但不能忽視,因為西村換乘開通以後,通過6-5-8進行白雲區西部內部的聯絡會更多,從沙貝-鵝掌坦可以省3.5公里可以看出,這在白雲區內東西向動脈12號線開通前很有必要。

總結

總的來說,8北的西村換乘開通與否,對大多數區域而言,僅僅是錦上添花而已,但是對於1號線西段、廣佛線前往5號線西段等方向的線路而言,就意義重大。這只是在一個小區域內簡化分析,雖然本文主要分析西村換乘對已有線路和站點的影響,但是,西村換乘的開通,最大受益者是8號線北延段的人們前往5號線的小北、珠江新城等區域。

所以通過這個迪傑斯特拉演算法的應用,表明了路徑是可以被新路徑覆蓋的。例如芳村-廣州火車站就可以由1-2改為1-8-5,充分體現了迪傑斯特拉演算法的思想,就是路徑被更近的路徑覆蓋。

不過這只是一個模擬,真正有沒有人這樣坐地鐵,就是開通以後的事情了。我只能希望,這種因換乘未開通而繞路的加價行為不要再發生了。

C. 求公交換乘演算法程序

用一個鄰接表有向圖來表示一個公交系統
如果乘坐某輛公交車能從站點u到達站點v而不需要換線、調頭,那麼添加一條有向邊e=(u,v),並且在邊e上附加信息:從u到v的距離(即該邊的權值)、該邊所屬的公交車編號、該邊在該公交線路的哪個方向上(因為有可能同一條公交線路兩個方向經過不同的站點)
之所以用鄰接表是因為這樣的圖是有重邊的
當查詢從節點i到節點j的換乘線路時,用dijkstra找出i和j之間的最短路徑,那麼根據這條路徑上的邊的附加信息就知道要怎麼換乘了
另外,如果需要知道路徑最短的基礎上怎樣換乘的次數最少(也就是在上述的圖中經過的邊數最少),可對dijkstra作少量調整,對於圖中的每個點u,除了記錄當前找到的到該點的最短距離dis[u]以及該點的前趨pi[u],還要記錄在這樣的最短距離和前趨下從起點到該點經過的最少的邊數min_edge[u]
那麼作dijkstra的時候,對於當前剛找到的路徑最短的點u,以及從點u出發的某條邊e=(u,v),如果dis[u]+e.length==dis[v]
&&
min_edge[u]+1<min_edge[v](也就是經過邊(u,v)與原先的到v的最短路徑長度相同但是經過(u,v)可以得到邊數更少的路徑,那麼也要採用(u,v))
回溯是效率非常低的演算法,如果沒有非常好的優化方案,沒事少用

D. 公交線路最少換乘演算法設計遇到的一個問題

考慮成兩趟不同的公交車試試

E. 求一公交車換乘查詢演算法(java實現,或存儲過程)

公交換乘問題---java解決方案: http://lizemin314.blog.163.com/blog/static/11128512200782331512355/

F. 求教公交換乘演算法,我不聰明,麻煩說的明白些,謝謝,財富值有回答時在加,避免浪費,謝謝

三個表(最簡單化,不考慮模糊查詢,單行線等其他東西):
1,站點表stop(stop_id,stop_name)
2,路線表line(line_id,line_name)
3,路線站點表(點線路關系表)linestops( line_id, stop_id, seq )此處的seq指某站點在某線路中的順序。
現在分析演算法:
1,直達線路
首先根據兩個站點名獲取兩個站點各自的id,這里定義為id1,id2
然後查詢
select line_id from
(select line_id from linestops where stop_id = id1) A,
(select line_id from linestops where stop_id = id2) B
where A.line_id = B.line_id
即得到可直達的線路列表
2,一次換乘
首先根據兩個站點名獲取兩個站點各自的id,這里定義為id1,id2
然後搜尋兩個站點通過直達方式各自能夠到達的站點集合,最後他們的交集就是我們所需要的換乘站點。
select stop_id from
(
select distinct stop_id from linestops where line_id in
(select line_id from linestops where stop_id = id1)
)A,
(
select distinct stop_id from linestops where line_id in
(select line_id from linestops where stop_id = id2)
)B
where A.stop_id= B.stop_id
得到換乘站(可能有多個或0個)後,剩下的就是顯示能夠到達換乘站的兩邊線路,這通過前面的直達查詢即可。
3,二次換乘
首先根據兩個站點名獲取兩個站點各自的id,這里定義為id1,id2
演算法的中心思想是:站點1能夠通過直達到達的所有站點集合A,站點2能夠通過直達到達的所有站點集合B,A和B之間有直達的線路。
一步一步來:
站點1能夠通過直達到達的所有站點集合A:
select distinct stop_id from linestops where line_id in
(select line_id from linestops where stop_id = id1)
站點2能夠通過直達到達的所有站點集合B:
select distinct stop_id from linestops where line_id in
(select line_id from linestops where stop_id = id2)
而直達的查詢是
select line_id from
1/4頁

(select line_id from linestops where stop_id = id1) C,
(select line_id from linestops where stop_id = id2) D
where C.line_id = D.line_id
我們把=id1和=id2換成 in (select ....)A 和 in (select ...)B
這樣最後我們的查詢是
select line_id from
(select distinct line_id from linestops where stop_id in 【A】) C,
(select distinct line_id from linestops where stop_id in 【B】) D
where C.line_id = D.line_id
其中【A】是
(select distinct stop_id from linestops where line_id in
(select line_id from linestops where stop_id = id1))
其中【B】是
(select distinct stop_id from linestops where line_id in
(select line_id from linestops where stop_id = id2))
這樣子我們找到了作為中間換乘的線路(可能有多條或者0條),對列舉的的每一條假設命名為X線,下一步就是找出可以從站點1到達X任意一個站點的直達線路、和可以從站點2到達X任意一個站點的直達線路即可。
那麼與前面的演算法相似,我們在站點1所有能夠到達的站點中去尋找和線路X相交的站點,然後再去找這兩個點的線路
select stop_id from
(select distinct stop_id

G. 公交2次換乘演算法

呃,我來給你說說。先假設一個情況:你的公交次數卡裡面有10次余額。你拿公交次數卡在8:13第一次刷卡(還剩下8次),那麼在10:13之內的這段時間,你可以在任意一輛接受次數卡的公交車上(除了你在8:13時刷卡的那輛公交車,當然一般不會出現這種情況)再另外刷3次(仍然剩8次)。但是有一個條件:你刷過之後的公交車(注意是公交車,不是公交線路)是不再接受你再次刷次數卡的,這時就要扣你電子錢包裡面的錢,如果沒有電子錢包你就只有投幣。2小時之內你刷卡的次數超過了4次,比如你在8:13刷了一次,在10:13之內,你已經又刷了3次,那麼在10:13之內你仍舊需要轉乘的話就要另外計算次數。比如你在9:55的時候你已經是乘坐了四次,達到了最高次數,那麼轉乘就要重新扣你的次數。9:55時你又轉乘另外一趟公交車刷次數卡,這時就要重新扣你的次數(只剩下6次)。刷卡的原則是次數優先,如果沒有次數就扣電子錢包的錢,如果兩種方式都不能足夠支付你乘車費用,就只能投幣了。轉乘不分普通車和中級車,你在普通車上刷了之後拿到中級車上也是不扣次數,但要計入轉乘次數的記錄。

H. c語言問題: 什麼是演算法試從日常生活中找3個例子,描述它們的演算法。 詳細點,謝謝!

c語言中的演算法是指:一系列解決問題的清晰指令,用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。通俗說就是解決問題的方法和步驟。

描述演算法的例子:

  1. 問題:從上海去到北京。

    其中的演算法:做汽車、做飛機、或者徒步。

  2. 問題:喝茶。

    其中的演算法:先找到茶葉,再燒一壺開水,然後將茶葉放到杯子里,將開水倒入杯中,等茶葉泡好。

  3. 問題:開車。

    其中的演算法:首先要打開車門,駕駛員坐好,插上車鑰匙,發動汽車。

熱點內容
壓縮機破了 發布:2025-07-24 06:52:52 瀏覽:436
安卓軟體簽名怎麼改 發布:2025-07-24 06:52:09 瀏覽:596
sql獲取表的欄位 發布:2025-07-24 06:40:10 瀏覽:721
win2003搭建jsp伺服器 發布:2025-07-24 06:40:08 瀏覽:941
天宇梯控演算法 發布:2025-07-24 06:38:40 瀏覽:793
疫情哪個國家訪問中國 發布:2025-07-24 06:16:27 瀏覽:260
華為雲域名為什麼不用伺服器 發布:2025-07-24 06:14:59 瀏覽:668
全民助手有腳本嗎 發布:2025-07-24 06:10:01 瀏覽:836
緩存文件包括哪些 發布:2025-07-24 06:09:26 瀏覽:263
32兆內存可以存儲多長時間視頻 發布:2025-07-24 06:07:24 瀏覽:460