Težinski grafovi u pythonu

In [1]:
import platform
In [2]:
platform.platform()
Out[2]:
'Linux-4.17.19-1-MANJARO-x86_64-with-arch-Manjaro-Linux'
In [3]:
platform.python_version()
Out[3]:
'3.7.0'
In [4]:
import networkx as nx
In [5]:
nx.__version__
Out[5]:
'2.2'
In [6]:
from pylab import *
In [7]:
%matplotlib inline
In [8]:
import random
In [9]:
import DSTG

formiranje Petersenovog težinskog grafa s random težinama

In [10]:
G=nx.Graph()
G.add_weighted_edges_from((u,v,random.randint(1,8)) for u,v in nx.petersen_graph().edges())

ispisivanje bridova zajedno s njihovim težinama

In [11]:
G.edges(data=True)
Out[11]:
EdgeDataView([(0, 1, {'weight': 2}), (0, 4, {'weight': 4}), (0, 5, {'weight': 5}), (1, 2, {'weight': 4}), (1, 6, {'weight': 1}), (4, 3, {'weight': 4}), (4, 9, {'weight': 5}), (5, 7, {'weight': 8}), (5, 8, {'weight': 6}), (2, 3, {'weight': 4}), (2, 7, {'weight': 4}), (6, 8, {'weight': 5}), (6, 9, {'weight': 1}), (3, 8, {'weight': 6}), (7, 9, {'weight': 4})])

dva načina spremanja težinskog grafa u datoteku

In [12]:
nx.write_edgelist(G,"tezinskiPetersen.edgelist")
In [13]:
nx.write_multiline_adjlist(G,"tezinskiPetersen.multiadjlist")

sadržaji pojedinih datoteka

In [14]:
dat=open("tezinskiPetersen.edgelist",'r')
print(dat.read())
dat.close()
0 1 {'weight': 2}
0 4 {'weight': 4}
0 5 {'weight': 5}
1 2 {'weight': 4}
1 6 {'weight': 1}
4 3 {'weight': 4}
4 9 {'weight': 5}
5 7 {'weight': 8}
5 8 {'weight': 6}
2 3 {'weight': 4}
2 7 {'weight': 4}
6 8 {'weight': 5}
6 9 {'weight': 1}
3 8 {'weight': 6}
7 9 {'weight': 4}

In [15]:
dat=open("tezinskiPetersen.multiadjlist",'r')
print(dat.read())
dat.close()
#/usr/lib/python3.7/site-packages/ipykernel_launcher.py -f /run/user/1000/jupyter/kernel-f0e307fb-e78b-4e40-82c5-d1de0e9267d5.json
# GMT Sat Oct 20 11:08:23 2018
# 
0 3
1 {'weight': 2}
4 {'weight': 4}
5 {'weight': 5}
1 2
2 {'weight': 4}
6 {'weight': 1}
4 2
3 {'weight': 4}
9 {'weight': 5}
5 2
7 {'weight': 8}
8 {'weight': 6}
2 2
3 {'weight': 4}
7 {'weight': 4}
6 2
8 {'weight': 5}
9 {'weight': 1}
3 1
8 {'weight': 6}
7 1
9 {'weight': 4}
8 0
9 0

učitavanje težinskog grafa iz datoteke i pretvaranje vrhova u tip integer

In [16]:
Z1=nx.read_edgelist("tezinskiPetersen.edgelist",nodetype=int)
In [17]:
Z1
Out[17]:
<networkx.classes.graph.Graph at 0x7f3a9d16a358>
In [18]:
Z1.nodes()
Out[18]:
NodeView((0, 1, 4, 5, 2, 6, 3, 9, 7, 8))
In [19]:
Z2=nx.read_multiline_adjlist("tezinskiPetersen.multiadjlist",nodetype=int)
In [20]:
Z2
Out[20]:
<networkx.classes.graph.Graph at 0x7f3a9d1e05f8>
In [21]:
Z2.nodes()
Out[21]:
NodeView((0, 1, 4, 5, 2, 6, 3, 9, 7, 8))

Učitavanje težinskog grafa iz datoteke s kojim ćemo dalje raditi

In [22]:
tezinskiGraf1=nx.read_edgelist("tezinskiGraf1.edgelist",nodetype=str)

crtanje težinskog grafa pomoću funkcije iz modula DSTG

In [23]:
figure(figsize=(8,6))
DSTG.CrtajTezinskiGraf(tezinskiGraf1, pos={'A':(0,2),'B':(0,4),'C':(0,0),'D':(2,4),'E':(2,2),'F':(2,0),'G':(4,4),'H':(4,2),'I':(4,0)},
                      rubVrha='k',velicinaVrha=500,fontTezine=14)

težinska matrica

In [24]:
nx.to_pandas_adjacency(tezinskiGraf1,dtype=int)
Out[24]:
A B C D E F G H I
A 0 5 2 4 10 0 0 0 0
B 5 0 0 8 0 0 0 0 0
C 2 0 0 0 7 5 0 0 0
D 4 8 0 0 6 0 2 0 0
E 10 0 7 6 0 3 2 3 0
F 0 0 5 0 3 0 0 2 4
G 0 0 0 2 2 0 0 3 0
H 0 0 0 0 3 2 3 0 5
I 0 0 0 0 0 4 0 5 0
In [25]:
nx.adj_matrix(tezinskiGraf1).todense()
Out[25]:
matrix([[ 0,  5,  2,  4, 10,  0,  0,  0,  0],
        [ 5,  0,  0,  8,  0,  0,  0,  0,  0],
        [ 2,  0,  0,  0,  7,  5,  0,  0,  0],
        [ 4,  8,  0,  0,  6,  0,  2,  0,  0],
        [10,  0,  7,  6,  0,  3,  2,  3,  0],
        [ 0,  0,  5,  0,  3,  0,  0,  2,  4],
        [ 0,  0,  0,  2,  2,  0,  0,  3,  0],
        [ 0,  0,  0,  0,  3,  2,  3,  0,  5],
        [ 0,  0,  0,  0,  0,  4,  0,  5,  0]], dtype=int64)

najkraći put od vrha A do vrha E u težinskom grafu

In [26]:
nx.dijkstra_path(tezinskiGraf1,'A','E')
Out[26]:
['A', 'D', 'G', 'E']

najkraći put od vrha A do vrha E u pripadnom netežinskom grafu (sve težine su jednake 1)

In [27]:
nx.shortest_path(tezinskiGraf1,'A','E')
Out[27]:
['A', 'E']

duljina najkraćeg puta od vrha A do vrha E u težinskom grafu

In [28]:
nx.dijkstra_path_length(tezinskiGraf1,'A','E')
Out[28]:
8

duljina najkraćeg puta od vrha A do vrha E u pripadnom netežinskom grafu

In [29]:
nx.shortest_path_length(tezinskiGraf1,'A','E')
Out[29]:
1

najkraći put od vrha A do vrha H u težinskom grafu

In [30]:
nx.dijkstra_path(tezinskiGraf1,'A','H')
Out[30]:
['A', 'D', 'G', 'H']

najkraći put od vrha A do vrha H u pripadnom netežinskom grafu (sve težine su jednake 1)

In [31]:
nx.shortest_path(tezinskiGraf1,'A','H')
Out[31]:
['A', 'E', 'H']

duljina najkraćeg puta od vrha A do vrha H u težinskom grafu

In [32]:
nx.dijkstra_path_length(tezinskiGraf1,'A','H')
Out[32]:
9

duljina najkraćeg puta od vrha A do vrha H u pripadnom netežinskom grafu

In [33]:
nx.shortest_path_length(tezinskiGraf1,'A','H')
Out[33]:
2

svi najkraći putovi od vrha A prema svim ostalim vrhovima u težinskom grafu

In [34]:
nx.single_source_dijkstra_path(tezinskiGraf1,'A')
Out[34]:
{'A': ['A'],
 'B': ['A', 'B'],
 'C': ['A', 'C'],
 'D': ['A', 'D'],
 'E': ['A', 'D', 'G', 'E'],
 'F': ['A', 'C', 'F'],
 'G': ['A', 'D', 'G'],
 'H': ['A', 'D', 'G', 'H'],
 'I': ['A', 'C', 'F', 'I']}

svi najkraći putovi od vrha B prema svim ostalim vrhovima u težinskom grafu

In [35]:
nx.single_source_dijkstra_path(tezinskiGraf1,'B')
Out[35]:
{'B': ['B'],
 'A': ['B', 'A'],
 'D': ['B', 'D'],
 'C': ['B', 'A', 'C'],
 'E': ['B', 'D', 'G', 'E'],
 'F': ['B', 'A', 'C', 'F'],
 'G': ['B', 'D', 'G'],
 'H': ['B', 'D', 'G', 'H'],
 'I': ['B', 'A', 'C', 'F', 'I']}

svi najkraći putovi od vrha A prema svim ostalim vrhovima u pripadnom netežinskom grafu

In [36]:
nx.single_source_shortest_path(tezinskiGraf1,'A')
Out[36]:
{'A': ['A'],
 'B': ['A', 'B'],
 'C': ['A', 'C'],
 'D': ['A', 'D'],
 'E': ['A', 'E'],
 'F': ['A', 'C', 'F'],
 'G': ['A', 'D', 'G'],
 'H': ['A', 'E', 'H'],
 'I': ['A', 'C', 'F', 'I']}

svi najkraći putovi od vrha B prema svim ostalim vrhovima u pripadnom netežinskom grafu

In [37]:
nx.single_source_shortest_path(tezinskiGraf1,'B')
Out[37]:
{'B': ['B'],
 'A': ['B', 'A'],
 'D': ['B', 'D'],
 'C': ['B', 'A', 'C'],
 'E': ['B', 'A', 'E'],
 'G': ['B', 'D', 'G'],
 'F': ['B', 'A', 'C', 'F'],
 'H': ['B', 'A', 'E', 'H'],
 'I': ['B', 'A', 'C', 'F', 'I']}

duljine svih najkraćih putova od vrha A prema svim ostalim vrhovima u težinskom grafu

In [38]:
nx.single_source_dijkstra_path_length(tezinskiGraf1,'A')
Out[38]:
{'A': 0, 'C': 2, 'D': 4, 'B': 5, 'G': 6, 'F': 7, 'E': 8, 'H': 9, 'I': 11}

duljine svih najkraćih putova od vrha B prema svim ostalim vrhovima u težinskom grafu

In [39]:
nx.single_source_dijkstra_path_length(tezinskiGraf1,'B')
Out[39]:
{'B': 0, 'A': 5, 'C': 7, 'D': 8, 'G': 10, 'F': 12, 'E': 12, 'H': 13, 'I': 16}

duljine svih najkraćih putova od vrha A prema svim ostalim vrhovima u pripadnom netežinskom grafu

In [40]:
nx.single_source_shortest_path_length(tezinskiGraf1,'A')
Out[40]:
{'A': 0, 'B': 1, 'C': 1, 'D': 1, 'E': 1, 'F': 2, 'G': 2, 'H': 2, 'I': 3}

duljine svih najkraćih putova od vrha B prema svim ostalim vrhovima u pripadnom netežinskom grafu

In [41]:
nx.single_source_shortest_path_length(tezinskiGraf1,'B')
Out[41]:
{'B': 0, 'A': 1, 'D': 1, 'C': 2, 'E': 2, 'G': 2, 'F': 3, 'H': 3, 'I': 4}

svi najkraći putovi i njihove duljine od vrha A do svih preostalih vrhova u težinskom grafu

In [42]:
nx.single_source_dijkstra(tezinskiGraf1,'A')
Out[42]:
({'A': 0, 'C': 2, 'D': 4, 'B': 5, 'G': 6, 'F': 7, 'E': 8, 'H': 9, 'I': 11},
 {'A': ['A'],
  'B': ['A', 'B'],
  'C': ['A', 'C'],
  'D': ['A', 'D'],
  'E': ['A', 'D', 'G', 'E'],
  'F': ['A', 'C', 'F'],
  'G': ['A', 'D', 'G'],
  'H': ['A', 'D', 'G', 'H'],
  'I': ['A', 'C', 'F', 'I']})

svi najkraći putovi i njihove duljine od vrha B do svih preostalih vrhova u težinskom grafu

In [43]:
nx.single_source_dijkstra(tezinskiGraf1,'B')
Out[43]:
({'B': 0, 'A': 5, 'C': 7, 'D': 8, 'G': 10, 'F': 12, 'E': 12, 'H': 13, 'I': 16},
 {'B': ['B'],
  'A': ['B', 'A'],
  'D': ['B', 'D'],
  'C': ['B', 'A', 'C'],
  'E': ['B', 'D', 'G', 'E'],
  'F': ['B', 'A', 'C', 'F'],
  'G': ['B', 'D', 'G'],
  'H': ['B', 'D', 'G', 'H'],
  'I': ['B', 'A', 'C', 'F', 'I']})

najkraći putovi između svaka dva vrha u pripadnom netežinskom grafu

In [44]:
list(nx.all_pairs_shortest_path(tezinskiGraf1))
Out[44]:
[('A',
  {'A': ['A'],
   'B': ['A', 'B'],
   'C': ['A', 'C'],
   'D': ['A', 'D'],
   'E': ['A', 'E'],
   'F': ['A', 'C', 'F'],
   'G': ['A', 'D', 'G'],
   'H': ['A', 'E', 'H'],
   'I': ['A', 'C', 'F', 'I']}),
 ('B',
  {'B': ['B'],
   'A': ['B', 'A'],
   'D': ['B', 'D'],
   'C': ['B', 'A', 'C'],
   'E': ['B', 'A', 'E'],
   'G': ['B', 'D', 'G'],
   'F': ['B', 'A', 'C', 'F'],
   'H': ['B', 'A', 'E', 'H'],
   'I': ['B', 'A', 'C', 'F', 'I']}),
 ('C',
  {'C': ['C'],
   'A': ['C', 'A'],
   'E': ['C', 'E'],
   'F': ['C', 'F'],
   'B': ['C', 'A', 'B'],
   'D': ['C', 'A', 'D'],
   'G': ['C', 'E', 'G'],
   'H': ['C', 'E', 'H'],
   'I': ['C', 'F', 'I']}),
 ('D',
  {'D': ['D'],
   'A': ['D', 'A'],
   'B': ['D', 'B'],
   'E': ['D', 'E'],
   'G': ['D', 'G'],
   'C': ['D', 'A', 'C'],
   'F': ['D', 'E', 'F'],
   'H': ['D', 'E', 'H'],
   'I': ['D', 'E', 'F', 'I']}),
 ('E',
  {'E': ['E'],
   'A': ['E', 'A'],
   'C': ['E', 'C'],
   'D': ['E', 'D'],
   'F': ['E', 'F'],
   'G': ['E', 'G'],
   'H': ['E', 'H'],
   'B': ['E', 'A', 'B'],
   'I': ['E', 'F', 'I']}),
 ('F',
  {'F': ['F'],
   'C': ['F', 'C'],
   'E': ['F', 'E'],
   'H': ['F', 'H'],
   'I': ['F', 'I'],
   'A': ['F', 'C', 'A'],
   'D': ['F', 'E', 'D'],
   'G': ['F', 'E', 'G'],
   'B': ['F', 'C', 'A', 'B']}),
 ('G',
  {'G': ['G'],
   'D': ['G', 'D'],
   'E': ['G', 'E'],
   'H': ['G', 'H'],
   'A': ['G', 'D', 'A'],
   'B': ['G', 'D', 'B'],
   'C': ['G', 'E', 'C'],
   'F': ['G', 'E', 'F'],
   'I': ['G', 'H', 'I']}),
 ('H',
  {'H': ['H'],
   'E': ['H', 'E'],
   'F': ['H', 'F'],
   'G': ['H', 'G'],
   'I': ['H', 'I'],
   'A': ['H', 'E', 'A'],
   'C': ['H', 'E', 'C'],
   'D': ['H', 'E', 'D'],
   'B': ['H', 'E', 'A', 'B']}),
 ('I',
  {'I': ['I'],
   'F': ['I', 'F'],
   'H': ['I', 'H'],
   'C': ['I', 'F', 'C'],
   'E': ['I', 'F', 'E'],
   'G': ['I', 'H', 'G'],
   'A': ['I', 'F', 'C', 'A'],
   'D': ['I', 'F', 'E', 'D'],
   'B': ['I', 'F', 'C', 'A', 'B']})]

najkraće udaljenosti između svaka dva vrha u pripadnom netežinskom grafu

In [45]:
list(nx.all_pairs_shortest_path_length(tezinskiGraf1))
Out[45]:
[('A',
  {'A': 0, 'B': 1, 'C': 1, 'D': 1, 'E': 1, 'F': 2, 'G': 2, 'H': 2, 'I': 3}),
 ('B',
  {'B': 0, 'A': 1, 'D': 1, 'C': 2, 'E': 2, 'G': 2, 'F': 3, 'H': 3, 'I': 4}),
 ('C',
  {'C': 0, 'A': 1, 'E': 1, 'F': 1, 'B': 2, 'D': 2, 'G': 2, 'H': 2, 'I': 2}),
 ('D',
  {'D': 0, 'A': 1, 'B': 1, 'E': 1, 'G': 1, 'C': 2, 'F': 2, 'H': 2, 'I': 3}),
 ('E',
  {'E': 0, 'A': 1, 'C': 1, 'D': 1, 'F': 1, 'G': 1, 'H': 1, 'B': 2, 'I': 2}),
 ('F',
  {'F': 0, 'C': 1, 'E': 1, 'H': 1, 'I': 1, 'A': 2, 'D': 2, 'G': 2, 'B': 3}),
 ('G',
  {'G': 0, 'D': 1, 'E': 1, 'H': 1, 'A': 2, 'B': 2, 'C': 2, 'F': 2, 'I': 2}),
 ('H',
  {'H': 0, 'E': 1, 'F': 1, 'G': 1, 'I': 1, 'A': 2, 'C': 2, 'D': 2, 'B': 3}),
 ('I',
  {'I': 0, 'F': 1, 'H': 1, 'C': 2, 'E': 2, 'G': 2, 'A': 3, 'D': 3, 'B': 4})]

najkraći putovi između svaka dva vrha u težinskom grafu

In [46]:
list(nx.all_pairs_dijkstra_path(tezinskiGraf1))
Out[46]:
[('A',
  {'A': ['A'],
   'B': ['A', 'B'],
   'C': ['A', 'C'],
   'D': ['A', 'D'],
   'E': ['A', 'D', 'G', 'E'],
   'F': ['A', 'C', 'F'],
   'G': ['A', 'D', 'G'],
   'H': ['A', 'D', 'G', 'H'],
   'I': ['A', 'C', 'F', 'I']}),
 ('B',
  {'B': ['B'],
   'A': ['B', 'A'],
   'D': ['B', 'D'],
   'C': ['B', 'A', 'C'],
   'E': ['B', 'D', 'G', 'E'],
   'F': ['B', 'A', 'C', 'F'],
   'G': ['B', 'D', 'G'],
   'H': ['B', 'D', 'G', 'H'],
   'I': ['B', 'A', 'C', 'F', 'I']}),
 ('C',
  {'C': ['C'],
   'A': ['C', 'A'],
   'E': ['C', 'E'],
   'F': ['C', 'F'],
   'B': ['C', 'A', 'B'],
   'D': ['C', 'A', 'D'],
   'H': ['C', 'F', 'H'],
   'I': ['C', 'F', 'I'],
   'G': ['C', 'A', 'D', 'G']}),
 ('D',
  {'D': ['D'],
   'A': ['D', 'A'],
   'B': ['D', 'B'],
   'E': ['D', 'G', 'E'],
   'G': ['D', 'G'],
   'H': ['D', 'G', 'H'],
   'C': ['D', 'A', 'C'],
   'F': ['D', 'G', 'E', 'F'],
   'I': ['D', 'G', 'H', 'I']}),
 ('E',
  {'E': ['E'],
   'A': ['E', 'G', 'D', 'A'],
   'C': ['E', 'C'],
   'D': ['E', 'G', 'D'],
   'F': ['E', 'F'],
   'G': ['E', 'G'],
   'H': ['E', 'H'],
   'I': ['E', 'F', 'I'],
   'B': ['E', 'G', 'D', 'B']}),
 ('F',
  {'F': ['F'],
   'C': ['F', 'C'],
   'E': ['F', 'E'],
   'H': ['F', 'H'],
   'I': ['F', 'I'],
   'G': ['F', 'H', 'G'],
   'A': ['F', 'C', 'A'],
   'D': ['F', 'H', 'G', 'D'],
   'B': ['F', 'C', 'A', 'B']}),
 ('G',
  {'G': ['G'],
   'D': ['G', 'D'],
   'E': ['G', 'E'],
   'H': ['G', 'H'],
   'A': ['G', 'D', 'A'],
   'B': ['G', 'D', 'B'],
   'C': ['G', 'D', 'A', 'C'],
   'F': ['G', 'E', 'F'],
   'I': ['G', 'H', 'I']}),
 ('H',
  {'H': ['H'],
   'E': ['H', 'E'],
   'F': ['H', 'F'],
   'G': ['H', 'G'],
   'I': ['H', 'I'],
   'C': ['H', 'F', 'C'],
   'A': ['H', 'G', 'D', 'A'],
   'D': ['H', 'G', 'D'],
   'B': ['H', 'G', 'D', 'B']}),
 ('I',
  {'I': ['I'],
   'F': ['I', 'F'],
   'H': ['I', 'H'],
   'C': ['I', 'F', 'C'],
   'E': ['I', 'F', 'E'],
   'G': ['I', 'H', 'G'],
   'A': ['I', 'F', 'C', 'A'],
   'D': ['I', 'H', 'G', 'D'],
   'B': ['I', 'F', 'C', 'A', 'B']})]

najkraće udaljenosti između svaka dva vrha u težinskom grafu

In [47]:
DSTG.ispis(list(nx.all_pairs_dijkstra_path_length(tezinskiGraf1)),80)
[('A', {'A': 0, 'C': 2, 'D': 4, 'B': 5, 'G': 6, 'F': 7, 'E': 8, 'H': 9, 'I': 11}
), ('B', {'B': 0, 'A': 5, 'C': 7, 'D': 8, 'G': 10, 'F': 12, 'E': 12, 'H': 13, 'I
': 16}), ('C', {'C': 0, 'A': 2, 'F': 5, 'D': 6, 'E': 7, 'B': 7, 'H': 7, 'G': 8, 
'I': 9}), ('D', {'D': 0, 'G': 2, 'A': 4, 'E': 4, 'H': 5, 'C': 6, 'F': 7, 'B': 8,
 'I': 10}), ('E', {'E': 0, 'G': 2, 'F': 3, 'H': 3, 'D': 4, 'C': 7, 'I': 7, 'A': 
8, 'B': 12}), ('F', {'F': 0, 'H': 2, 'E': 3, 'I': 4, 'C': 5, 'G': 5, 'A': 7, 'D'
: 7, 'B': 12}), ('G', {'G': 0, 'D': 2, 'E': 2, 'H': 3, 'F': 5, 'A': 6, 'I': 8, '
C': 8, 'B': 10}), ('H', {'H': 0, 'F': 2, 'E': 3, 'G': 3, 'I': 5, 'D': 5, 'C': 7,
 'A': 9, 'B': 13}), ('I', {'I': 0, 'F': 4, 'H': 5, 'E': 7, 'G': 8, 'C': 9, 'D': 
10, 'A': 11, 'B': 16})]

najkraće udaljenosti od vrha A prema svim preostalim vrhovima zajedno s listom svih mogućih prethodnika preko kojih je pojedini vrh mogao dobiti oznaku

In [48]:
nx.dijkstra_predecessor_and_distance(tezinskiGraf1,'A')
Out[48]:
({'A': [],
  'B': ['A'],
  'C': ['A'],
  'D': ['A'],
  'E': ['G'],
  'F': ['C'],
  'G': ['D'],
  'H': ['G', 'F'],
  'I': ['F']},
 {'A': 0, 'C': 2, 'D': 4, 'B': 5, 'G': 6, 'F': 7, 'E': 8, 'H': 9, 'I': 11})

najkraće udaljenosti od vrha B prema svim preostalim vrhovima zajedno s listom svih mogućih prethodnika preko kojih je pojedini vrh mogao dobiti oznaku

In [49]:
nx.dijkstra_predecessor_and_distance(tezinskiGraf1,'B')
Out[49]:
({'B': [],
  'A': ['B'],
  'D': ['B'],
  'C': ['A'],
  'E': ['G'],
  'F': ['C'],
  'G': ['D'],
  'H': ['G'],
  'I': ['F']},
 {'B': 0, 'A': 5, 'C': 7, 'D': 8, 'G': 10, 'F': 12, 'E': 12, 'H': 13, 'I': 16})

najkraće udaljenosti od vrha F prema svim preostalim vrhovima zajedno s listom svih mogućih prethodnika preko kojih je pojedini vrh mogao dobiti oznaku

In [50]:
nx.dijkstra_predecessor_and_distance(tezinskiGraf1,'F')
Out[50]:
({'F': [],
  'C': ['F'],
  'E': ['F'],
  'H': ['F'],
  'I': ['F'],
  'G': ['H', 'E'],
  'A': ['C'],
  'D': ['G'],
  'B': ['A']},
 {'F': 0, 'H': 2, 'E': 3, 'I': 4, 'C': 5, 'G': 5, 'A': 7, 'D': 7, 'B': 12})

ista svih mogućih prethodnika preko kojih je pojedini vrh mogao dobiti oznaku u pripadnom netežinskom grafu gledajući najkraće putove od vrha A

In [51]:
nx.predecessor(tezinskiGraf1,'A')
Out[51]:
{'A': [],
 'B': ['A'],
 'C': ['A'],
 'D': ['A'],
 'E': ['A'],
 'F': ['C', 'E'],
 'G': ['D', 'E'],
 'H': ['E'],
 'I': ['F', 'H']}

Isticanje najkraćih putova na grafu

In [52]:
pozicije={'A':(0,2),'B':(0,4),'C':(0,0),'D':(2,4),'E':(2,2),'F':(2,0),'G':(4,4),'H':(4,2),'I':(4,0)}

istaknuti najkraći put između vrhova A i H

In [53]:
DSTG.CrtajNajkraciPut(tezinskiGraf1,pozicije,'A','H',velicinaVrha=500,fontTezine=14,rubVrha='k')

istaknuti najkraći put između vrhova A i E

In [54]:
DSTG.CrtajNajkraciPut(tezinskiGraf1,pozicije,'A','E',velicinaVrha=500,fontTezine=14,rubVrha='k')

istaknuti najkraći put između vrhova A i H u pripadnom netežinskom grafu

In [55]:
DSTG.CrtajNajkraciPut(tezinskiGraf1,pozicije,'A','H',velicinaVrha=500,rubVrha='k',tezine=False)

istaknuti najkraći put između vrhova A i E u pripadnom netežinskom grafu

In [56]:
DSTG.CrtajNajkraciPut(tezinskiGraf1,pozicije,'A','E',velicinaVrha=500,rubVrha='k',tezine=False)

stablo najkraćih putova iz vrha A

In [57]:
DSTG.StabloNajkracihPutova(tezinskiGraf1,pozicije,'A',velicinaVrha=500,fontTezine=14,rubVrha='k')

stablo najkraćih putova iz vrha B

In [58]:
DSTG.StabloNajkracihPutova(tezinskiGraf1,pozicije,'B',velicinaVrha=500,fontTezine=14,rubVrha='k')

stablo najkraćih putova iz vrha A u pripadnom netežinskom grafu

In [59]:
DSTG.StabloNajkracihPutova(tezinskiGraf1,pozicije,'A',velicinaVrha=500,rubVrha='k',tezine=False)

stablo najkraćih putova iz vrha B u pripadnom netežinskom grafu

In [60]:
DSTG.StabloNajkracihPutova(tezinskiGraf1,pozicije,'B',velicinaVrha=500,rubVrha='k',tezine=False)

stablo najkraćih putova iz vrha A prikazano kao korijensko stablo s korijenom A

In [61]:
DSTG.KorijenskoStabloNajkracihPutova(tezinskiGraf1,'A',velicinaVrha=500,rubVrha='k',fontTezine=14)

stablo najkraćih putova iz vrha B prikazano kao korijensko stablo s korijenom B

In [62]:
figure(figsize=(6,7))
DSTG.KorijenskoStabloNajkracihPutova(tezinskiGraf1,'B',velicinaVrha=500,rubVrha='k',fontTezine=14)
In [63]:
DSTG.KorijenskoStabloNajkracihPutova(tezinskiGraf1,'A',velicinaVrha=500,rubVrha='k',tezine=False)

Ručni Dijkstra

ručno traženje najkraćih putova od vrha A prema ostalim vrhovima

In [64]:
DSTG.rucni_Dijkstra_graf(tezinskiGraf1,'A')
Out[64]:
vrh | korak012345678
A$(-,0)$****************************************
B$(-,\infty)$$(A,5)$$(A,5)$$(A,5)$*************************
C$(-,\infty)$$(A,2)$***********************************
D$(-,\infty)$$(A,4)$$(A,4)$******************************
E$(-,\infty)$$(A,10)$$(C,9)$$(C,9)$$(C,9)$$(G,8)$$(G,8)$**********
F$(-,\infty)$$(-,\infty)$$(C,7)$$(C,7)$$(C,7)$$(C,7)$***************
G$(-,\infty)$$(-,\infty)$$(-,\infty)$$(D,6)$$(D,6)$********************
H$(-,\infty)$$(-,\infty)$$(-,\infty)$$(-,\infty)$$(-,\infty)$$(G,9)$$(G,9)$$(G,9)$*****
I$(-,\infty)$$(-,\infty)$$(-,\infty)$$(-,\infty)$$(-,\infty)$$(-,\infty)$$(F,11)$$(F,11)$$(F,11)$

ručno traženje najkraćih putova od vrha B prema ostalim vrhovima

In [65]:
DSTG.rucni_Dijkstra_graf(tezinskiGraf1,'B')
Out[65]:
vrh | korak012345678
A$(-,\infty)$$(B,5)$***********************************
B$(-,0)$****************************************
C$(-,\infty)$$(-,\infty)$$(A,7)$******************************
D$(-,\infty)$$(B,8)$$(B,8)$$(B,8)$*************************
E$(-,\infty)$$(-,\infty)$$(A,15)$$(C,14)$$(C,14)$$(G,12)$***************
F$(-,\infty)$$(-,\infty)$$(-,\infty)$$(C,12)$$(C,12)$$(C,12)$$(C,12)$**********
G$(-,\infty)$$(-,\infty)$$(-,\infty)$$(-,\infty)$$(D,10)$********************
H$(-,\infty)$$(-,\infty)$$(-,\infty)$$(-,\infty)$$(-,\infty)$$(G,13)$$(G,13)$$(G,13)$*****
I$(-,\infty)$$(-,\infty)$$(-,\infty)$$(-,\infty)$$(-,\infty)$$(-,\infty)$$(-,\infty)$$(F,16)$$(F,16)$

Floyd-Warshallov algoritam

najkraće udaljenosti između svaka dva vrha dane kao rječnik rječnika

In [66]:
nx.floyd_warshall(tezinskiGraf1)
Out[66]:
{'A': defaultdict(<function networkx.algorithms.shortest_paths.dense.floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<locals>.<lambda>()>,
             {'A': 0,
              'B': 5,
              'C': 2,
              'D': 4,
              'E': 8,
              'F': 7,
              'G': 6,
              'H': 9,
              'I': 11}),
 'B': defaultdict(<function networkx.algorithms.shortest_paths.dense.floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<locals>.<lambda>()>,
             {'B': 0,
              'A': 5,
              'D': 8,
              'C': 7,
              'E': 12,
              'F': 12,
              'G': 10,
              'H': 13,
              'I': 16}),
 'C': defaultdict(<function networkx.algorithms.shortest_paths.dense.floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<locals>.<lambda>()>,
             {'C': 0,
              'A': 2,
              'E': 7,
              'F': 5,
              'B': 7,
              'D': 6,
              'G': 8,
              'H': 7,
              'I': 9}),
 'D': defaultdict(<function networkx.algorithms.shortest_paths.dense.floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<locals>.<lambda>()>,
             {'D': 0,
              'A': 4,
              'B': 8,
              'E': 4,
              'G': 2,
              'C': 6,
              'F': 7,
              'H': 5,
              'I': 10}),
 'E': defaultdict(<function networkx.algorithms.shortest_paths.dense.floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<locals>.<lambda>()>,
             {'E': 0,
              'A': 8,
              'C': 7,
              'D': 4,
              'F': 3,
              'G': 2,
              'H': 3,
              'B': 12,
              'I': 7}),
 'F': defaultdict(<function networkx.algorithms.shortest_paths.dense.floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<locals>.<lambda>()>,
             {'F': 0,
              'C': 5,
              'E': 3,
              'H': 2,
              'I': 4,
              'A': 7,
              'B': 12,
              'D': 7,
              'G': 5}),
 'G': defaultdict(<function networkx.algorithms.shortest_paths.dense.floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<locals>.<lambda>()>,
             {'G': 0,
              'D': 2,
              'E': 2,
              'H': 3,
              'A': 6,
              'B': 10,
              'C': 8,
              'F': 5,
              'I': 8}),
 'H': defaultdict(<function networkx.algorithms.shortest_paths.dense.floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<locals>.<lambda>()>,
             {'H': 0,
              'E': 3,
              'F': 2,
              'G': 3,
              'I': 5,
              'A': 9,
              'B': 13,
              'C': 7,
              'D': 5}),
 'I': defaultdict(<function networkx.algorithms.shortest_paths.dense.floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<locals>.<lambda>()>,
             {'I': 0,
              'F': 4,
              'H': 5,
              'A': 11,
              'B': 16,
              'C': 9,
              'D': 10,
              'E': 7,
              'G': 8})}

najkraće udaljenosti između svaka dva vrha dane kao numpy matrica

In [67]:
print(nx.floyd_warshall_numpy(tezinskiGraf1,nodelist=['A','B','C','D','E','F','G','H','I']))
[[ 0.  5.  2.  4.  8.  7.  6.  9. 11.]
 [ 5.  0.  7.  8. 12. 12. 10. 13. 16.]
 [ 2.  7.  0.  6.  7.  5.  8.  7.  9.]
 [ 4.  8.  6.  0.  4.  7.  2.  5. 10.]
 [ 8. 12.  7.  4.  0.  3.  2.  3.  7.]
 [ 7. 12.  5.  7.  3.  0.  5.  2.  4.]
 [ 6. 10.  8.  2.  2.  5.  0.  3.  8.]
 [ 9. 13.  7.  5.  3.  2.  3.  0.  5.]
 [11. 16.  9. 10.  7.  4.  8.  5.  0.]]

najkraće udaljenosti između svaka dva vrha i neposredni prethodnici pojedinog vrha na odgovarajućem najkraćem putu

In [68]:
DSTG.ispis(nx.floyd_warshall_predecessor_and_distance(tezinskiGraf1),80)
({'A': {'B': 'A', 'C': 'A', 'D': 'A', 'E': 'G', 'F': 'C', 'G': 'D', 'H': 'F', 'I
': 'F'}, 'B': {'A': 'B', 'D': 'B', 'C': 'A', 'E': 'G', 'F': 'C', 'G': 'D', 'H': 
'G', 'I': 'F'}, 'C': {'A': 'C', 'E': 'C', 'F': 'C', 'B': 'A', 'D': 'A', 'G': 'D'
, 'H': 'F', 'I': 'F'}, 'D': {'A': 'D', 'B': 'D', 'E': 'G', 'G': 'D', 'C': 'A', '
F': 'E', 'H': 'G', 'I': 'H'}, 'E': {'A': 'D', 'C': 'E', 'D': 'G', 'F': 'E', 'G':
 'E', 'H': 'E', 'B': 'D', 'I': 'F'}, 'F': {'C': 'F', 'E': 'F', 'H': 'F', 'I': 'F
', 'A': 'C', 'B': 'A', 'D': 'G', 'G': 'E'}, 'G': {'D': 'G', 'E': 'G', 'H': 'G', 
'A': 'D', 'B': 'D', 'C': 'A', 'F': 'E', 'I': 'H'}, 'H': {'E': 'H', 'F': 'H', 'G'
: 'H', 'I': 'H', 'A': 'C', 'B': 'D', 'C': 'F', 'D': 'G'}, 'I': {'F': 'I', 'H': '
I', 'A': 'C', 'B': 'A', 'C': 'F', 'D': 'G', 'E': 'F', 'G': 'H'}}, {'A': defaultd
ict(<function floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<locals>
.<lambda> at 0x7f3a9b93a1e0>, {'A': 0, 'B': 5, 'C': 2, 'D': 4, 'E': 8, 'F': 7, '
G': 6, 'H': 9, 'I': 11}), 'B': defaultdict(<function floyd_warshall_predecessor_
and_distance.<locals>.<lambda>.<locals>.<lambda> at 0x7f3a9b93a488>, {'B': 0, 'A
': 5, 'D': 8, 'C': 7, 'E': 12, 'F': 12, 'G': 10, 'H': 13, 'I': 16}), 'C': defaul
tdict(<function floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<local
s>.<lambda> at 0x7f3a9b49c400>, {'C': 0, 'A': 2, 'E': 7, 'F': 5, 'B': 7, 'D': 6,
 'G': 8, 'H': 7, 'I': 9}), 'D': defaultdict(<function floyd_warshall_predecessor
_and_distance.<locals>.<lambda>.<locals>.<lambda> at 0x7f3a9b49c2f0>, {'D': 0, '
A': 4, 'B': 8, 'E': 4, 'G': 2, 'C': 6, 'F': 7, 'H': 5, 'I': 10}), 'E': defaultdi
ct(<function floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<locals>.
<lambda> at 0x7f3a9b49c488>, {'E': 0, 'A': 8, 'C': 7, 'D': 4, 'F': 3, 'G': 2, 'H
': 3, 'B': 12, 'I': 7}), 'F': defaultdict(<function floyd_warshall_predecessor_a
nd_distance.<locals>.<lambda>.<locals>.<lambda> at 0x7f3a9b49c510>, {'F': 0, 'C'
: 5, 'E': 3, 'H': 2, 'I': 4, 'A': 7, 'B': 12, 'D': 7, 'G': 5}), 'G': defaultdict
(<function floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<locals>.<l
ambda> at 0x7f3a9b49c268>, {'G': 0, 'D': 2, 'E': 2, 'H': 3, 'A': 6, 'B': 10, 'C'
: 8, 'F': 5, 'I': 8}), 'H': defaultdict(<function floyd_warshall_predecessor_and
_distance.<locals>.<lambda>.<locals>.<lambda> at 0x7f3a9b49c1e0>, {'H': 0, 'E': 
3, 'F': 2, 'G': 3, 'I': 5, 'A': 9, 'B': 13, 'C': 7, 'D': 5}), 'I': defaultdict(<
function floyd_warshall_predecessor_and_distance.<locals>.<lambda>.<locals>.<lam
bda> at 0x7f3a9b49c158>, {'I': 0, 'F': 4, 'H': 5, 'A': 11, 'B': 16, 'C': 9, 'D':
 10, 'E': 7, 'G': 8})})

ručni Floyd-Warshallov algoritam

Nulti, treći, peti, sedmi i posljednji deveti korak Floyd-Warshallovog algoritma na težinskom grafu tezinskiGraf1

In [69]:
DSTG.FW(tezinskiGraf1,step=[0,3,5,7,9],ncol=3)
Out[69]:
$k=0$$A$$B$$C$$D$$E$$F$$G$$H$$I$
$A$$0$$5$$2$$4$$10$$\infty$$\infty$$\infty$$\infty$
$B$$5$$0$$\infty$$8$$\infty$$\infty$$\infty$$\infty$$\infty$
$C$$2$$\infty$$0$$\infty$$7$$5$$\infty$$\infty$$\infty$
$D$$4$$8$$\infty$$0$$6$$\infty$$2$$\infty$$\infty$
$E$$10$$\infty$$7$$6$$0$$3$$2$$3$$\infty$
$F$$\infty$$\infty$$5$$\infty$$3$$0$$\infty$$2$$4$
$G$$\infty$$\infty$$\infty$$2$$2$$\infty$$0$$3$$\infty$
$H$$\infty$$\infty$$\infty$$\infty$$3$$2$$3$$0$$5$
$I$$\infty$$\infty$$\infty$$\infty$$\infty$$4$$\infty$$5$$0$
$k=3$$A$$B$$C$$D$$E$$F$$G$$H$$I$
$A$$0$$5$$2$$4$$9$$7$$\infty$$\infty$$\infty$
$B$$5$$0$$7$$8$$14$$12$$\infty$$\infty$$\infty$
$C$$2$$7$$0$$6$$7$$5$$\infty$$\infty$$\infty$
$D$$4$$8$$6$$0$$6$$11$$2$$\infty$$\infty$
$E$$9$$14$$7$$6$$0$$3$$2$$3$$\infty$
$F$$7$$12$$5$$11$$3$$0$$\infty$$2$$4$
$G$$\infty$$\infty$$\infty$$2$$2$$\infty$$0$$3$$\infty$
$H$$\infty$$\infty$$\infty$$\infty$$3$$2$$3$$0$$5$
$I$$\infty$$\infty$$\infty$$\infty$$\infty$$4$$\infty$$5$$0$
$k=5$$A$$B$$C$$D$$E$$F$$G$$H$$I$
$A$$0$$5$$2$$4$$9$$7$$6$$12$$\infty$
$B$$5$$0$$7$$8$$14$$12$$10$$17$$\infty$
$C$$2$$7$$0$$6$$7$$5$$8$$10$$\infty$
$D$$4$$8$$6$$0$$6$$9$$2$$9$$\infty$
$E$$9$$14$$7$$6$$0$$3$$2$$3$$\infty$
$F$$7$$12$$5$$9$$3$$0$$5$$2$$4$
$G$$6$$10$$8$$2$$2$$5$$0$$3$$\infty$
$H$$12$$17$$10$$9$$3$$2$$3$$0$$5$
$I$$\infty$$\infty$$\infty$$\infty$$\infty$$4$$\infty$$5$$0$
$k=7$$A$$B$$C$$D$$E$$F$$G$$H$$I$
$A$$0$$5$$2$$4$$8$$7$$6$$9$$11$
$B$$5$$0$$7$$8$$12$$12$$10$$13$$16$
$C$$2$$7$$0$$6$$7$$5$$8$$7$$9$
$D$$4$$8$$6$$0$$4$$7$$2$$5$$11$
$E$$8$$12$$7$$4$$0$$3$$2$$3$$7$
$F$$7$$12$$5$$7$$3$$0$$5$$2$$4$
$G$$6$$10$$8$$2$$2$$5$$0$$3$$9$
$H$$9$$13$$7$$5$$3$$2$$3$$0$$5$
$I$$11$$16$$9$$11$$7$$4$$9$$5$$0$
$k=9$$A$$B$$C$$D$$E$$F$$G$$H$$I$
$A$$0$$5$$2$$4$$8$$7$$6$$9$$11$
$B$$5$$0$$7$$8$$12$$12$$10$$13$$16$
$C$$2$$7$$0$$6$$7$$5$$8$$7$$9$
$D$$4$$8$$6$$0$$4$$7$$2$$5$$10$
$E$$8$$12$$7$$4$$0$$3$$2$$3$$7$
$F$$7$$12$$5$$7$$3$$0$$5$$2$$4$
$G$$6$$10$$8$$2$$2$$5$$0$$3$$8$
$H$$9$$13$$7$$5$$3$$2$$3$$0$$5$
$I$$11$$16$$9$$10$$7$$4$$8$$5$$0$

Isprobajmo našu funkciju na dva primjera iz prezentacije

In [70]:
F1=nx.Graph({"v1":{"v2":{'weight':2}},"v2":{"v3":{'weight':3}},"v3":{"v4":{'weight':1}}})
In [71]:
figure(figsize=(6,2))
DSTG.CrtajTezinskiGraf(F1,{'v1':(0,0),'v2':(1,0),'v3':(2,0),'v4':(3,0)},velicinaVrha=500,rubVrha='k',fontTezine=14)
In [72]:
DSTG.FW(F1,step=range(5),ncol=5)
Out[72]:
$k=0$$v1$$v2$$v3$$v4$
$v1$$0$$2$$\infty$$\infty$
$v2$$2$$0$$3$$\infty$
$v3$$\infty$$3$$0$$1$
$v4$$\infty$$\infty$$1$$0$
$k=1$$v1$$v2$$v3$$v4$
$v1$$0$$2$$\infty$$\infty$
$v2$$2$$0$$3$$\infty$
$v3$$\infty$$3$$0$$1$
$v4$$\infty$$\infty$$1$$0$
$k=2$$v1$$v2$$v3$$v4$
$v1$$0$$2$$5$$\infty$
$v2$$2$$0$$3$$\infty$
$v3$$5$$3$$0$$1$
$v4$$\infty$$\infty$$1$$0$
$k=3$$v1$$v2$$v3$$v4$
$v1$$0$$2$$5$$6$
$v2$$2$$0$$3$$4$
$v3$$5$$3$$0$$1$
$v4$$6$$4$$1$$0$
$k=4$$v1$$v2$$v3$$v4$
$v1$$0$$2$$5$$6$
$v2$$2$$0$$3$$4$
$v3$$5$$3$$0$$1$
$v4$$6$$4$$1$$0$
In [73]:
F2=nx.Graph({"v1":{"v2":{'weight':15},"v3":{'weight':5},"v4":{'weight':1}},"v2":{"v3":{'weight':8},
            "v5":{'weight':3}},"v4":{"v5":{'weight':2}}})
In [74]:
figure(figsize=(8,5))
DSTG.CrtajTezinskiGraf(F2,{"v1":(0,3),"v2":(2,3.5),"v3":(1.2,2),"v4":(0.5,0),"v5":(4,0.3)},velicinaVrha=500,rubVrha='k',fontTezine=14)
In [75]:
DSTG.FW(F2,step=range(6),ncol=3,redoslijed_vrhova=['v1','v2','v3','v4','v5'])
Out[75]:
$k=0$$v1$$v2$$v3$$v4$$v5$
$v1$$0$$15$$5$$1$$\infty$
$v2$$15$$0$$8$$\infty$$3$
$v3$$5$$8$$0$$\infty$$\infty$
$v4$$1$$\infty$$\infty$$0$$2$
$v5$$\infty$$3$$\infty$$2$$0$
$k=1$$v1$$v2$$v3$$v4$$v5$
$v1$$0$$15$$5$$1$$\infty$
$v2$$15$$0$$8$$16$$3$
$v3$$5$$8$$0$$6$$\infty$
$v4$$1$$16$$6$$0$$2$
$v5$$\infty$$3$$\infty$$2$$0$
$k=2$$v1$$v2$$v3$$v4$$v5$
$v1$$0$$15$$5$$1$$18$
$v2$$15$$0$$8$$16$$3$
$v3$$5$$8$$0$$6$$11$
$v4$$1$$16$$6$$0$$2$
$v5$$18$$3$$11$$2$$0$
$k=3$$v1$$v2$$v3$$v4$$v5$
$v1$$0$$13$$5$$1$$16$
$v2$$13$$0$$8$$14$$3$
$v3$$5$$8$$0$$6$$11$
$v4$$1$$14$$6$$0$$2$
$v5$$16$$3$$11$$2$$0$
$k=4$$v1$$v2$$v3$$v4$$v5$
$v1$$0$$13$$5$$1$$3$
$v2$$13$$0$$8$$14$$3$
$v3$$5$$8$$0$$6$$8$
$v4$$1$$14$$6$$0$$2$
$v5$$3$$3$$8$$2$$0$
$k=5$$v1$$v2$$v3$$v4$$v5$
$v1$$0$$6$$5$$1$$3$
$v2$$6$$0$$8$$5$$3$
$v3$$5$$8$$0$$6$$8$
$v4$$1$$5$$6$$0$$2$
$v5$$3$$3$$8$$2$$0$
In [ ]: