Sto cercando di implementare l'algoritmo di Kou per identificare gli alberi di Steiner in R usando igraph.L'algoritmo di Kou per trovare l'albero di Steiner usando l'igraph
algoritmo del Kou può essere descritto come segue:
- Trova grafo completo distanza G '(G' ha = S (nodi Steiner V'), e per ogni coppia di nodi (u, v) in VxV c'è un fronte con peso uguale al peso del percorso minimo tra questi nodi p_ (u, v) in G)
- Trova un albero di spaziatura minimo T 'in G'
- Costruisci il sottografo Gs , di G sostituendo ogni spigolo di T ', che è un bordo di G' con il corrispondente percorso più breve di G (ci sono diversi percorsi più corti, ne scegli uno arbitrario).
- Trova lo spanning tree minimo, Ts, di Gs (se ci sono diversi spanning tree minimi, ne scegli uno arbitrario)
- Costruisci un albero di Steiner, Th, da Ts eliminando i bordi in Ts, se necessario, a quello tutte le foglie di Th sono nodi di Steiner.
I primi 2 passi sono facili:
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)
Tuttavia, non so come sostituire i bordi in T' per il percorso più breve in G. So che con get.shortest.paths
posso ottenere il vpath
da una coppia di nodi, ma come sostituisco e bordo in T 'con il shortest.path
in G?
Molte grazie in anticipo
Grazie @Forrest, tuttavia tutti i bordi delle 's mst' deve essere sostituito per i percorsi più elevati (in caso di più percorsi più brevi, quindi sceglierne uno a caso). Allego un collegamento con il metodo in cui è possibile vedere un esempio grafico http://www.cs.umaine.edu/~markov/SteinerTrees.pdf – user2380782
Non sono sicuro di quali bordi si sta riferendo a, credo. La figura a sinistra è l'albero di spanning minimo che hai calcolato. La figura a destra ha ogni margine sostituito dal percorso più breve del grafico originale 'g' eccetto per il margine' 1% -% 100' che nei dati simulati è una connessione diretta (i nodi 1 e 100 sono vicini). Per favore aiutami se mi manca qualcosa? –
Il mio male @Forrest, hai ragione, molte grazie !!! – user2380782