9
9
# variavel global para ir armazenando decisoes do usuario
10
10
n = 0
11
11
12
- # criar grafo
12
+ # variaveis globais do grafo
13
+
13
14
g = Graph ()
15
+ vertices = []
16
+ arestas = []
17
+ pesos = []
14
18
15
19
'''
16
20
g.add_vertices(4)
28
32
plot(g, layout = layout)
29
33
'''
30
34
35
+ # ----------------------------------------------------------------------MENU-----------------------------------------------
31
36
def menu (primeira_vez = True ):
37
+ global n
32
38
if (primeira_vez == True ):
33
39
os .system ('clear' )
34
40
print 'Seja bem vindo ao meu programa que simula grafos\n '
35
41
print 'A seguir os algoritmos disponiveis:\n '
36
42
print '1) Dijkstra\n 2) Bellman-Ford\n 3) RPF\n 4) Spanning Tree\n 5) SAIR'
37
- global n
38
43
n = input ('Por favor, selecione um algoritmo que vc gostaria de executar:\n ' )
39
44
while (n < 1 or n > 5 ):
40
45
n = input ('Escolha um numero valido (entre 1 e 5):\n ' )
41
46
42
47
def ler_dot ():
43
48
lista = []
44
- vertices = []
45
49
vertices_aux = []
46
50
n_vertices = 0
51
+ global vertices
52
+ global arestas
53
+ global pesos
54
+ global g
55
+ g = Graph ()
56
+ vertices = []
57
+ arestas = []
58
+ pesos = []
47
59
48
60
# abrir arquivo do usuario e ler cada linha
49
61
x = raw_input ('Por favor digite o nome do arquivo: (eh preciso ter .dot no final e o PATH adequado)\n ' )
50
62
file = open (x , 'r' )
51
63
linhas = file .readlines ()
52
- pattern = '\w+\s *'
64
+ pattern = '\w+\.*\w *'
53
65
54
66
# lista = variavel que guarda par de vertices que possuem aresta
55
67
# comeca a ler da linha 1 ao inves da 0, pois a linha zero contem o nome do grafo
56
68
for i in range (1 , len (linhas )):
57
69
lista .append (re .findall (pattern , linhas [i ]))
58
70
71
+ # apos o regex, temos de deletar o 'label' e salvar o peso da aresta
72
+ for i in range (len (lista )):
73
+ if (len (lista [i ]) == 4 ):
74
+ lista [i ].remove ('label' )
75
+ pesos .append (float (lista [i ][2 ]))
76
+ del lista [i ][2 ]
77
+
59
78
# lista = lista de listas. vertices = lista
60
79
for sublista in lista :
61
80
for item in sublista :
@@ -69,6 +88,13 @@ def ler_dot():
69
88
except ValueError :
70
89
break
71
90
91
+ # agora iremos adicionar as arestas no grafo
92
+ tupla = ()
93
+ global arestas
94
+ for i in range (0 , len (vertices ), 2 ):
95
+ tupla = (vertices [i ], vertices [i + 1 ])
96
+ arestas .append (tupla )
97
+
72
98
# loop para eliminar duplicatas na lista "vertices"
73
99
for i in vertices :
74
100
if i not in vertices_aux :
@@ -79,29 +105,20 @@ def ler_dot():
79
105
n_vertices = len (vertices )
80
106
g .add_vertices (n_vertices )
81
107
g .vs ["name" ] = vertices
82
-
83
- # agora iremos adicionar as arestas no grafo
84
- tupla = ()
85
- arestas = []
86
- for i in range (len (lista )):
87
- if (len (sublista ) == 2 ):
88
- for sublista in lista [i ]:
89
- tupla = (sublista [0 ], sublista [1 ])
90
- arestas .append (tupla )
91
108
g .add_edges (arestas )
92
- g .es ["weight" ] = [0 ]* len (vertices )
93
-
94
-
109
+ g .es ["weight" ] = pesos
95
110
file .close ()
96
-
97
111
98
112
def criar_grafo ():
99
113
print 'Agora iremos criar seu grafo de testes\n '
100
114
y = raw_input ('Voce gostaria de carregar um grafo a partir de um arquivo .DOT? (s/n)\n ' )
101
115
if (y == 's' ):
102
116
ler_dot ()
103
- # fazer algo aqui depois
104
117
else :
118
+ global g
119
+ g = Graph ()
120
+ vertices = []
121
+ arestas = []
105
122
while True :
106
123
try :
107
124
x = input ('Quantos vertices tem seu grafo?\n ' )
@@ -138,17 +155,61 @@ def criar_grafo():
138
155
plot (g , layout = layout )
139
156
140
157
# ----------------------------------------------------------------------ALGORITMOS-----------------------------------------------
141
- #def dijkstra(grafo, no_inicial):
158
+ def dijkstra ():
159
+ global g
160
+ global vertices
161
+ global arestas
162
+ global pesos
163
+ v_visitados = []
164
+ predecessor = {}
165
+ custo = {}
166
+ menor_custo = {}
167
+
168
+ # mensagem de boas vindas / relembrar quais vertices existem no grafo
169
+ print '\n Voce selecionou o algoritmo de DIJKSTRA\n A seguir o nome dos vertices do seu grafo:\n V = {' ,
170
+ for i in range (len (vertices )):
171
+ if (i < len (vertices )- 1 ):
172
+ print vertices [i ] + ', ' ,
173
+ else :
174
+ print vertices [i ] + ' }'
175
+
176
+ # loop para selecionar vertice raiz
177
+ while True :
178
+ no_inicial = raw_input ('Qual sera o seu no inicial(Raiz)?\n ' )
179
+ if (no_inicial not in vertices ):
180
+ print 'Por favor, digite um vertice que realmente exista no grafo\n A seguir os vertices do seu grafo:\n V = {' ,
181
+ for i in range (len (vertices )):
182
+ if (i < len (vertices )- 1 ):
183
+ print vertices [i ] + ', ' ,
184
+ else :
185
+ print vertices [i ] + ' }'
186
+ else :
187
+ break
188
+
189
+ # inicializando o dijkstra
190
+ v_visitados .append (no_inicial )
191
+ predecessor [no_inicial ] = '0'
192
+ menor_custo [no_inicial ] = 0
193
+ for i in range (len (arestas )):
194
+ custo [arestas [i ]] = pesos [i ]
195
+
196
+ # descobrir os vizinhos do vertice raiz
142
197
143
198
144
199
200
+ #g.vcount()
201
+ #g.ecount()
202
+
203
+
145
204
146
205
# ----------------------------------------------------------------------MAIN-----------------------------------------------------
147
206
def main ():
148
207
global n
149
208
menu ()
150
209
while (n != 5 ):
151
210
criar_grafo ()
211
+ if (n == 1 ):
212
+ dijkstra ()
152
213
menu (False )
153
214
154
215
if __name__ == "__main__" :
@@ -161,4 +222,3 @@ def main():
161
222
162
223
163
224
164
-
0 commit comments