English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Introdução
O algoritmo Prim é semelhante ao algoritmo de caminho mais curto de Dijkstra, ele usa uma estratégia de greed. O algoritmo começa adicionando a aresta de menor peso à árvore T e continuamente adicionando a aresta E (um dos vértices de E está em T, o outro em G-Quando não há arestas E que atendam aos requisitos, o algoritmo termina e T é uma menor floresta geradora de G.
NetworkX é um pacote de software Python para criar, operar redes complexas e aprender a estrutura, dinâmica e função das redes complexas. Este artigo utiliza a classe networkx.Graph para implementar o algoritmo Prim.
Texto
Código do algoritmo Prim
Prim
def prim(G, s): dist = {} # dist registra a menor distância até os nós parent = {} # parent registra a tabela pais da menor floresta geradora Q = lista(G.nodes()) # Q contém todos os nós não cobertos pela floresta geradora MAXDIST = 9999.99 # MAXDIST representa o infinito positivo, ou seja, os nós não são vizinhos # Inicializa dados # Define a menor distância de todos os nós como MAXDIST e os pais como None para v in G.nodes(): dist[v] = MAXDIST parent[v] = None # Define a distância até o nó inicial s como 0 dist[s] = 0 # Continuar removendo o nó 'mais próximo' de Q e adicionando-o à menor floresta geradora # Para quando Q estiver vazio, para parar o loop, o algoritmo termina enquanto Q: # Remove o nó 'mais próximo' u e adiciona-o à menor floresta geradora u = Q[0] para v in Q: se (dist[v] < dist[u]): u = v Q.remove(u) # Atualiza a menor distância dos vizinhos de u para v in G.adj[u]: se (v in Q) e (G[u][v]['weight'] < dist[v]): parent[v] = u dist[v] = G[u][v]['weight'] # A algoritmo termina, retornando o menor floresta geradora na forma de tabela pais return parent
Dados de teste
De ~ para | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
1 | 1.3 | 2.1 | 0.9 | 0.7 | 1.8 | 2.0 | 1.8 |
2 | 0.9 | 1.8 | 1.2 | 2.8 | 2.3 | 1.1 | |
3 | 2.6 | 1.7 | 2.5 | 1.9 | 1.0 | ||
4 | 0.7 | 1.6 | 1.5 | 0.9 | |||
5 | 0.9 | 1.1 | 0.8 | ||||
6 | 0.6 | 1.0 | |||||
7 | 0.5 |
Código de teste
import matplotlib.pyplot as plt import networkx as nx g_data = [(1, 2, 1.3), (1, 3, 2.1), (1, 4, 0.9), (1, 5, 0.7), (1, 6, 1.8), (1, 7, 2.0), (1, 8, 1.8), (2, 3, 0.9), (2, 4, 1.8), (2, 5, 1.2), (2, 6, 2.8), (2, 7, 2.3), (2, 8, 1.1), (3, 4, 2.6), (3, 5, 1.7), (3, 6, 2.5), (3, 7, 1.9), (3, 8, 1.0), (4, 5, 0.7), (4, 6, 1.6), (4, 7, 1.5), (4, 8, 0.9), (5, 6, 0.9), (5, 7, 1.1), (5, 8, 0.8), (6, 7, 0.6), (6, 8, 1.0), (7, 8, 0.5) def draw(g): pos = nx.spring_layout(g) nx.draw(g, pos, \ arrows=True, \ with_labels=True, \ nodelist=g.nodes(), \ style='dashed', \ edge_color='b', \ width=, \ 2, \ node_color='y', \ alpha=0.5) plt.show() g = nx.Graph() g.add_weighted_edges_from(g_data) tree = prim(g, 1) mtg = nx.Graph() mtg.add_edges_from(tree.items()) mtg.remove_node(None) draw(mtg)
Resultados da execução
Este artigo sobre o algoritmo Prim do NetworkX (explicação em exemplos) é tudo o que o editor compartilhou com você, esperando que possa fornecer uma referência e que todos vocês possam apoiar e gritar tutorial.
Declaração: O conteúdo deste artigo é da Internet, pertence ao respectivo proprietário, foi carregado voluntariamente pelos usuários da Internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade por questões legais relacionadas. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#w3Declaração: O conteúdo deste artigo foi extraído da Internet, pertence ao respectivo proprietário, foi carregado por usuários da Internet de forma voluntária, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade por questões legais relacionadas. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#w