Генерация ориентированного графа с использованием библиотеки Python любой библиотеки Python - PullRequest
0 голосов
/ 08 октября 2018

Я реализую алгоритм Беллмана Форда из GeeksForGeeks в Python.Я хочу сгенерировать график (форма Diagramatic, а не в виде словаря, что легко) с использованием некоторой библиотеки, такой как pyplot или networkx, или чего-то подобного.Я хочу, чтобы пользовательский интерфейс графа содержал узлы, ребра и соответствующую стоимость.

from collections import defaultdict 

#Class to represent a graph 
class Graph: 

    def __init__(self,vertices): 
        self.V= vertices #No. of vertices 
        self.graph = [] # default dictionary to store graph 

    # function to add an edge to graph 
    def addEdge(self,u,v,w): 
        self.graph.append([u, v, w]) 

    # utility function used to print the solution 
    def printArr(self, dist): 
        print("Vertex   Distance from Source") 
        for i in range(self.V): 
            print("%d \t\t %d" % (i, dist[i])) 

    # The main function that finds shortest distances from src to 
    # all other vertices using Bellman-Ford algorithm.  The function 
    # also detects negative weight cycle 
    def BellmanFord(self, src): 

        # Step 1: Initialize distances from src to all other vertices 
        # as INFINITE 
        dist = [float("Inf")] * self.V 
        dist[src] = 0 


        # Step 2: Relax all edges |V| - 1 times. A simple shortest  
        # path from src to any other vertex can have at-most |V| - 1  
        # edges 
        for i in range(self.V - 1): 
            # Update dist value and parent index of the adjacent vertices of 
            # the picked vertex. Consider only those vertices which are still in 
            # queue 
            for u, v, w in self.graph: 
                if dist[u] != float("Inf") and dist[u] + w < dist[v]: 
                        dist[v] = dist[u] + w 

        # Step 3: check for negative-weight cycles.  The above step  
        # guarantees shortest distances if graph doesn't contain  
        # negative weight cycle.  If we get a shorter path, then there 
        # is a cycle. 

        for u, v, w in self.graph: 
                if dist[u] != float("Inf") and dist[u] + w < dist[v]: 
                        print "Graph contains negative weight cycle"
                        return

        # print all distance 
        self.printArr(dist) 

g = Graph(5) 
g.addEdge(0, 1, -1) 
g.addEdge(0, 2, 4) 
g.addEdge(1, 2, 3) 
g.addEdge(1, 3, 2) 
g.addEdge(1, 4, 2) 
g.addEdge(3, 2, 5) 
g.addEdge(3, 1, 1) 
g.addEdge(4, 3, -3) 

График, который я хочу получить в терминале или в отдельном файле, (на основе приведенного выше кода):

enter image description here

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Ссылка на документацию от ekiim очень полезна.Это код, который я сделал для построения графика:

import networkx as nx  
import matplotlib.pyplot as plt
G=nx.DiGraph()
G.add_node(0),G.add_node(1),G.add_node(2),G.add_node(3),G.add_node(4)
G.add_edge(0, 1),G.add_edge(1, 2),G.add_edge(0, 2),G.add_edge(1, 4),G.add_edge(1, 3),G.add_edge(3, 2),G.add_edge(3,1),G.add_edge(4,3)
nx.draw(G, with_labels=True, font_weight='bold')
plt.show()

Этот код печатает ориентированный граф без затрат.Я пытался печатать с оплатой, но результат был сильно искажен, а затраты перепутаны.Некоторые расходы были написаны в пустых местах, в то время как только один или два присутствовали по краям.Следовательно, если кто-то знает, чтобы реализовать это было бы очень полезно.

0 голосов
/ 08 октября 2018

Если вы проверите этот учебник для networkx, вы увидите, насколько просто создать ориентированный граф и построить его.

В значительной степени, то же самое относится и к ориентированному или простому графу (с точки зрения API), и построение графиков также достаточно просто и использует Matplotlib для его генерации.

Вы можете создать приложение Tk, которое позволит вам вручную вводить узлы и края, сохранять их в списках и строить график, в зависимости от того, что это не будет перетаскиваниеНо, тем не менее, это помогает вам визуализировать график на лету.

и этот учебник Matplotlib даст вам представление о том, как встроить его в приложение TK.

...