Operacions bàsiques de digrafs¶
Importem la biblioteca NetworkX.
>>> import networkx as nx
Creem un graf buit.
>>> g = nx.DiGraph()
Consultem els nodes.
>>> list(g.nodes)
[]
Quants nodes té?
>>> len(g)
0
>>> g.order()
0
>>> g.number_of_nodes()
0
Consultem les arestes.
>>> list(g.edges)
[]
Quantes arestes té?
>>> g.size()
0
>>> g.number_of_edges()
0
Hi afegim un node.
>>> g.add_node(10)
>>> sorted(g.nodes)
[10]
>>> g.order(), g.size()
(1, 0)
Els nodes són un conjunt: només hi apareixen un cop malgrat que els hi afegim més d’un cop.
>>> g.add_node(10)
>>> sorted(g.nodes)
[10]
Hi afegim una aresta.
>>> g.add_edge(1, 2)
Consultem tots els nodes.
>>> sorted(g.nodes)
[1, 2, 10]
Si algun dels nodes incidents a una aresta encara no pertany al graf, s’hi afegeix.
Consultem totes les arestes.
>>> sorted(g.edges)
[(1, 2)]
Les arestes són un conjunt: només hi apareixen un cop malgrat que les hi afegim més d’un cop.
>>> g.add_edge(1, 2)
>>> sorted(g.edges)
[(1, 2)]
Hi afegim uns quants nodes més a partir d’un iterable.
>>> g.add_nodes_from( [3, 4, 5, 11] )
>>> sorted(g.nodes)
[1, 2, 3, 4, 5, 10, 11]
>>> g.order(), g.size()
(7, 1)
Hi afegim unes quantes arestes més a partir d’un iterable.
>>> g.add_edges_from( [(2,3), (3,4), (4,5), (5,2), (11,10)] )
>>> g.size()
6
Visualitzem el graf utilitzant el mòdul matplotlib.pyplot.
>>> import matplotlib.pyplot as plt
>>> nx.draw(g, with_labels=True)
>>> plt.show()
Consultem si el graf conté un node.
>>> 1 in g
True
>>> 8 in g
False
>>> g.has_node(10)
True
Consultem si el graf conté una aresta.
>>> g.has_edge(1, 2)
True
El graf és dirigit: només conté les arestes que hem afegit i no les simètriques (llevat que les afegim).
>>> g.has_edge(2, 1)
False
>>> g.has_edge(3, 5)
False
Consultem el grau d’un node: total, d’entrada i de sortida.
>>> g.degree(2)
3
>>> g.in_degree(2)
2
>>> g.out_degree(2)
1
Recorrem els nodes del graf.
El graf és iterable, però desconeixem en quin ordre es recorreran els nodes perquè són un conjunt.
for node in g:
print(node)
>>> sorted(g)
[1, 2, 3, 4, 5, 10, 11]
També els podem recórrer mitjançant la vista nodes.
for node in g.nodes:
print(node)
>>> sorted(g.nodes)
[1, 2, 3, 4, 5, 10, 11]
Recorrem les arestes del graf mitjançant la vista
edges. Desconeixem en quin ordre es recorreran perquè són un
conjunt.
for edge in g.edges:
print(edge)
>>> sorted(g.edges)
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 2), (11, 10)]
Recorrem els successors d’un node.
for node in g.neighbors(2):
print(node)
>>> sorted(g.neighbors(2))
[3]
for node in g[2]:
print(node)
>>> sorted(g[2])
[3]
for node in g.successors(2):
print(node)
>>> sorted(g.successors(2))
[3]
Recorrem els predecessors d’un node.
for node in g.predecessors(2):
print(node)
>>> sorted(g.predecessors(2))
[1, 5]
Recorrem les arestes de les quals un node és cap, és a dir, les que parteixen del node.
for node in g.edges(2):
print(node)
>>> sorted(g.edges(2))
[(2, 3)]
for node in g.out_edges(2):
print(node)
>>> sorted(g.out_edges(2))
[(2, 3)]
Recorrem les arestes de les quals un node és cua, és a dir, les que arriben al node.
for node in g.in_edges(2):
print(node)
>>> sorted(g.in_edges(2))
[(1, 2), (5, 2)]
Afegim un camí al graf.
>>> nx.add_path(g, [1,2,3,5])
Visualitzem el graf
>>> nx.draw(g, with_labels=True)
>>> plt.show()