Cómo calcular el árbol de expansión mínimo en R

8

Dado un gráfico de N vértices y la distancia entre los bordes de los vértices almacenados en tuplas T1 = (d11, d12, …, d1n) to Tn = (dn1, dn2, …, dnn). Descubra un árbol de expansión mínimo de este gráfico a partir del vértice V1. Además, imprima la distancia total recorrida necesaria para recorrer este árbol generado.

Example:
For N =5 
T1 = (0, 4, 5, 7, 5)
T2 = (4, 0, 6, 2, 5)
T3 = (5, 6, 0, 2, 1)
T4 = (7, 2, 2, 0, 5)
T5 = (5, 5, 1, 5, 0)

Selection of edges according to minimum distance are:
V1 -> V2 = 4
V2 -> V4 = 2
V4 -> V3 = 2
V3 -> V5 = 1

Thus, MST is V1 -> V2 -> V4 -> V3 -> V5 and the distance travelled is 9 (4+2+2+1)

Literalmente, no tengo idea de cómo crear una gráfica de n vértices en R.

Busqué en google pero no entendí cómo abordar el problema anterior.

Por favor, ayúdame.

Magie
fuente
¿comprobaste el igraphpaquete , o esta pregunta o esta función ?
bretauv
En realidad, no tenía gráfico, ¿necesito crear un gráfico con n vértices? Un poco confundido con la pregunta
Magie
Creo que podemos calcular el árbol de expansión mínimo si tenemos un gráfico. ¿Cómo obtener un gráfico de N vértices que represente el senario como en cuestión?
Magie
1
Creo que puedes usar, mst(g)pero ¿quizás también mst(g, weights = E(g)$weights)?
user20650
1
sum(E(mg)$weight), ¿dónde mgestá el gráfico de árbol de expansión mínimo
user20650

Respuestas:

4

Su pregunta no parece coincidir con el título: ¿busca la creación del gráfico, no el MST? Una vez que tiene un gráfico, como dice @ user20650, el MST en sí mismo es fácil.

Es fácil crear un gráfico de tamaño n , pero existe una gran complejidad sobre qué nodos están conectados y sus pesos (distancias) de los que no nos habla, por lo que esta es una ilustración realmente básica.

Si suponemos que todos los nodos están conectados a todos los demás nodos (gráfico completo), podemos usar make_full_graph. Si ese no es el caso, necesita datos para decir qué nodos están conectados o utilizar un gráfico aleatorio.

# create graph
n <- 5
g <- make_full_graph(n)

El siguiente problema son las distancias. No nos ha proporcionado ninguna información sobre cómo se distribuyen esas distancias, pero podemos demostrar su asignación al gráfico. Aquí, solo usaré números aleatorios uniformes [0-1]:

# number of edges in an (undirected) full graph is (n2 - n) /2 but
# it is easier to just ask the graph how many edges it has - this
# is more portable if you change from make_full_graph
n_edge <- gsize(g)
g <- set_edge_attr(g, 'weight', value=runif(n_edge))
plot(g)

Gráfico aleatorio

El siguiente bit es solo el MST, usando minimum.spanning.tree:

mst <-  minimum.spanning.tree(g)

El resultado se mstve así:

IGRAPH dc21276 U-W- 5 4 -- Full graph
+ attr: name (g/c), loops (g/l), weight (e/n)
+ edges from dc21276:
[1] 1--4 1--5 2--3 2--5
David_O
fuente
Yo tampoco sé cómo se calculan las distancias, por eso estoy confundido. He publicado una pregunta completa. Solo dieron tanta información. Y soy nuevo en este tema de MST .
Magie
No podemos ayudar con eso. Si no se le ha proporcionado información sobre la estructura del gráfico más allá de n nodos, entonces solo es posible dar una respuesta genérica con algunos supuestos. Podría usar gráficos aleatorios y una distribución diferente de las longitudes de los bordes y el código aún daría la respuesta
David_O
Sí, sé que sin información gráfica y de distancias es difícil ayudar. Con esa información user20650me ayudó. Es suficiente.
Magie
Por cierto, su respuesta es útil para mí porque llegué a saber cómo hacer un gráfico en R. Gracias.
Magie