Como calcular a árvore de abrangência mínima em R


8

Dado um gráfico de N vértices e a distância entre as arestas dos vértices armazenados na tupla T1 = (d11, d12, …, d1n) to Tn = (dn1, dn2, …, dnn). Descubra uma árvore de abrangência mínima deste gráfico começando no vértice V1. Além disso, imprima a distância total necessária para percorrer essa árvore gerada.

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, não tenho idéia de como criar um gráfico de n vértices em R.

Pesquisei no google, mas não entendi como abordar o problema acima.

Por favor me ajude.



Na verdade, eu não tinha gráfico. Preciso criar um gráfico com n vértices? Um pouco confuso com a pergunta
Magie

Eu acho que podemos calcular a árvore de abrangência mínima, se tivermos gráfico. Como obter o gráfico de N vértices representando o senario como em questão?
Magie

1
Eu acho que você pode apenas usar, mst(g)mas talvez também mst(g, weights = E(g)$weights)?
user20650 31/03

1
sum(E(mg)$weight), onde mgé o gráfico mínimo da árvore de abrangência
user20650 31/03

Respostas:


4

Sua pergunta parece não corresponder ao título - você está atrás da criação do gráfico e não do MST? Depois de obter um gráfico, como diz @ user20650, o próprio MST é fácil.

É fácil criar um gráfico de tamanho n , mas há muita complexidade sobre quais nós estão conectados e seus pesos (distâncias) dos quais você não nos fala, então essa é uma ilustração realmente básica.

Se assumirmos que todos os nós estão conectados a todos os outros nós (gráfico completo), podemos usar make_full_graph. Se esse não for o caso, você precisa de dados para dizer quais nós estão conectados ou usar um gráfico aleatório.

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

A próxima edição são as distâncias. Você não nos forneceu nenhuma informação sobre como essas distâncias são distribuídas, mas podemos demonstrar atribuí-las ao gráfico. Aqui, usarei apenas números uniformes aleatórios [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 aleatório

O próximo bit é apenas o próprio MST, usando minimum.spanning.tree:

mst <-  minimum.spanning.tree(g)

A saída msté assim:

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

Eu também não sei como as distâncias são calculadas, por isso estou confuso. Eu postei a pergunta completa. Eles deram tanta informação apenas. E eu sou novo neste tópico do MST .
Magie

Não podemos ajudar com isso. Se você não recebeu informações sobre a estrutura do gráfico além de n nós, é possível apenas fornecer uma resposta genérica com algumas suposições. Você poderia usar gráficos aleatórios e uma distribuição diferente dos comprimentos das bordas, e o código ainda daria a resposta
David_O 01/04

Sim, eu sei, sem informações de gráfico e distâncias, que é difícil ajudar. Com essa informação user20650me ajudou. É suficiente.
Magie

A propósito, sua resposta é útil para mim, porque eu vim a saber como fazer um gráfico em R. Obrigado.
Magie
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.