簡體   English   中英

如何在Ruby中存儲地圖並使用BFS生成圖形

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM