[英]How to store a map and generate a graph with BFS in Ruby
所以我想這對於MSC中的MSC來說是一個經典的問題。
我有N元素,我也有距離。 假設我有3個具有以下距離的元素。 它是對稱的,所以
A -> B == B -> A
它看起來像一個矩陣:
A, B, C,
A 0, 10, 20
B 10, 0, 30
C 20, 30, 0
我的問題是:
在這種情況下,最好的是
B -> A -> C = 30 which equals to C -> A -> B
其他情況:
A -> B -> C = 40 which equals to C -> B -> A
我的印象是BFS可能適合這個。 鏈接到英文文檔是好的,甚至亞馬遜的書籍......
數據結構的理想解決方案是鄰接列表 。
鄰接列表只是一個對象列表(表示圖形上的頂點)。 每個對象都有一個列表,其中包含它具有相鄰邊的所有頂點以及相應的權重。
在ruby中,一個簡單的實現可能看起來像:
vertices = {}
a = Vertex.new
b = Vertex.new
a.add(b, 10)
b.add(a, 10)
vertices[a] = a
vertices[b] = b
找到最短加權路徑的算法稱為Dijkstra 。
如果您希望在運行算法后獲得最短路徑,則可以進行回溯。 這是通過在到達時存儲每個節點的(最佳)父節點來完成的。 為了做到這一點,你可以為每個被訪問節點創建一個哈希值,該哈希值以最低的成本映射到導致它的節點。
完成算法后,遞歸回溯可能如下所示:
def traceback(parent, start, node, path)
if(start == node)
(path + start.to_s).reverse
else
path += node.to_s + " "
traceback(parent, start, parent[node], path)
end
end
我聽說Dijkstra有一個算法來導航加權圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.