12
我正在試圖用igraph實現Kou的算法來識別R中的Steiner樹(s)。Kou的算法使用igraph找到Steiner樹
的寇氏算法可以這樣描述:
- 找到完整的距離圖G '(G' 具有V」 = S(斯坦納的節點),並且對於每對節點的(U,V)在VxV中存在一個邊,其權重等於G中這些節點之間的最小成本路徑p_(u,v)的權重
- 在G'中找到最小生成樹T'
- 構造子圖Gs ,G'的每條邊代替G'的相應最短路徑G(它有幾條最短路徑,選擇一條任意一條)。
- 找到Gs的最小生成樹Ts(如果有幾個最小生成樹,則選取任意一個)
- 通過刪除Ts中的邊來構造一個Steiner樹Th,如有必要, Th中的所有葉子都是Steiner節點。
第2個步驟很簡單:
g <- erdos.renyi.game(100, 1/10) # graph
V(g)$name <- 1:100
# Some steiner nodes
steiner.points <- sample(1:100, 5)
# Complete distance graph G'
Gi <- graph.full(5)
V(Gi)$name <- steiner.points
# Find a minimum spanning tree T' in G'
mst <- minimum.spanning.tree(Gi)
不過,我不知道如何更換T中的邊緣」在G.我知道,與get.shortest.paths
我能得到的最短路徑來自一對節點的vpath
,但我如何在T中用shortest.path
代替T'中的邊緣?
提前感謝
感謝@Forrest,但是在'mst'一切都在邊緣應該替換爲最短路徑(在多條最短路徑的情況下,然後隨機選擇一條路徑)。我附上一個鏈接,你可以看到一個圖形化的例子http://www.cs.umaine.edu/~markov/SteinerTrees.pdf – user2380782
我不確定你指的是哪條邊。左邊的數字是您計算的最小生成樹。右邊的圖中,除了邊緣「1% - %100」(其在模擬數據中是直接連接(節點1和100是鄰居))之外,每個邊都被來自原始圖'g'的最短路徑替代。如果我錯過了某些東西,請幫助我嗎? –
我的壞@Forrest,你是對的,非常感謝! – user2380782