@@ -90,7 +90,6 @@ def ler_dot():
90
90
91
91
# agora iremos adicionar as arestas no grafo
92
92
tupla = ()
93
- global arestas
94
93
for i in range (0 , len (vertices ), 2 ):
95
94
tupla = (vertices [i ], vertices [i + 1 ])
96
95
arestas .append (tupla )
@@ -154,6 +153,27 @@ def criar_grafo():
154
153
print 'Grafo criado com sucesso!'
155
154
plot (g , layout = layout )
156
155
156
+
157
+ # ------------------------------------------------------------FUNCOES-DOS-ALGORITMOS-----------------------------------------------
158
+ # descobrir os vizinhos de um vertice e salvar na variavel adjacentes
159
+ def vizinhos (arestas , vertice , primeira_vez = False ):
160
+ aux = []
161
+ predecessor = {}
162
+ adjacentes = {}
163
+ for i in range (len (arestas )):
164
+ for j in range (2 ):
165
+ if (arestas [i ][j ] == vertice ):
166
+ if (j == 1 ):
167
+ predecessor [arestas [i ][0 ]] = arestas [i ]
168
+ aux .append (arestas [i ])
169
+ elif (j == 0 ):
170
+ aux .append (arestas [i ])
171
+ predecessor [arestas [i ][1 ]] = arestas [i ]
172
+ adjacentes [vertice ] = aux
173
+ if (primeira_vez == True ):
174
+ return predecessor , adjacentes
175
+ if (primeira_vez == False ):
176
+ return adjacentes
157
177
# ----------------------------------------------------------------------ALGORITMOS-----------------------------------------------
158
178
def dijkstra ():
159
179
global g
@@ -165,6 +185,8 @@ def dijkstra():
165
185
custo = {}
166
186
menor_custo = {}
167
187
adjacentes = {}
188
+ no_inicial = ''
189
+ no_final = ''
168
190
169
191
# mensagem de boas vindas / relembrar quais vertices existem no grafo
170
192
print '\n Voce selecionou o algoritmo de DIJKSTRA\n A seguir o nome dos vertices do seu grafo:\n V = {' ,
@@ -190,40 +212,163 @@ def dijkstra():
190
212
191
213
# inicializando o dijkstra
192
214
v_visitados .append (no_inicial )
193
- predecessor [no_inicial ] = '0'
194
215
menor_custo [no_inicial ] = 0
195
216
for i in range (len (arestas )):
196
217
custo [arestas [i ]] = pesos [i ]
197
-
198
- # descobrir os vizinhos do vertice raiz
218
+ predecessor , adjacentes = vizinhos (arestas , no_inicial , True )
219
+ dict = {}
220
+ for v in vertices :
221
+ if (v not in predecessor ) and (v != no_inicial ):
222
+ menor_custo [v ] = 999
223
+ if v in predecessor :
224
+ menor_custo [v ] = custo [predecessor [v ]]
225
+
226
+ # salva em adjacentes todas as arestas que sao adjacentes em cada vertice
227
+ for v in vertices :
228
+ dict = vizinhos (arestas , v )
229
+ adjacentes .update (dict )
230
+
231
+ # print 'ANTES DO DIJKSTRA'
232
+ # print predecessor
233
+ # print adjacentes
234
+ # print menor_custo
235
+ # print '\n'
236
+
237
+ # agora comecando de verdade o algoritmo
238
+ predecessor_aux = {}
239
+ falta_vertice = True
240
+ while True :
241
+ for p in predecessor :
242
+ for a in adjacentes [p ]:
243
+ if (a != predecessor [p ]):
244
+ for tupla in a :
245
+ if (tupla != p ):
246
+ if ((menor_custo [p ] + custo [a ]) < menor_custo [tupla ]):
247
+ aux = menor_custo [p ] + custo [a ]
248
+ aux2 = aux % (int (aux ))
249
+ if ((aux2 > 0.09 ) and (aux2 < 0.1 )):
250
+ aux = int (aux ) + 0.1
251
+ elif (aux2 < 0.009 ):
252
+ aux = int (aux )
253
+ menor_custo [tupla ] = aux
254
+ predecessor_aux [tupla ] = a
255
+ predecessor .update (predecessor_aux )
256
+ falta_vertice = False
257
+ for v in vertices :
258
+ if v not in predecessor :
259
+ if (v != no_inicial ):
260
+ falta_vertice = True
261
+ if falta_vertice == False :
262
+ break
263
+ # print 'DEPOIS DO DIJKSTRA'
264
+ # print predecessor
265
+ # print adjacentes
266
+ # print menor_custo
267
+ # print '\n'
268
+
269
+ # printar na tela o menor caminho e o menor custo
199
270
aux = []
200
- for i in range (len (arestas )):
201
- for j in range (2 ):
202
- if (arestas [i ][j ] == no_inicial ):
203
- if (j == 1 ):
204
- predecessor [arestas [i ][0 ]] = no_inicial
205
- aux .append (arestas [i ][0 ])
206
- elif (j == 0 ):
207
- aux .append (arestas [i ][1 ])
208
- predecessor [arestas [i ][1 ]] = no_inicial
209
- adjacentes [no_inicial ] = aux
210
-
211
- print adjacentes
212
-
271
+ cont = 0
272
+ cabou = False
273
+ print 'O menor caminho entre ' + no_inicial + ' e ' + no_final + ' eh: ' ,
274
+ aux .append (no_final )
275
+ while cabou == False :
276
+ for tupla in predecessor [aux [cont ]]:
277
+ if (tupla == no_inicial ):
278
+ cabou = True
279
+ if (tupla != aux [cont ]):
280
+ aux .append (tupla )
281
+ a = cont + 1
282
+ cont = a
283
+ aux = aux [::- 1 ]
284
+
285
+ for i in range (len (aux )):
286
+ if (i == (len (aux )- 1 )):
287
+ print aux [i ]
288
+ else :
289
+ print aux [i ] + ' -> ' ,
290
+ print 'Com o custo total de: ' + str (menor_custo [no_final ])
291
+ print 'A seguir a arvore de caminho minimo criada pelo DIJKSTRA:'
292
+
293
+ # printar arvore criada para o dijkstra
294
+ t = Graph ()
295
+ t .add_vertices (len (vertices ))
296
+ arestas_final = []
297
+ lista = []
298
+ for p in predecessor :
299
+ arestas_final .append (predecessor [p ])
300
+ lista .append (custo [predecessor [p ]])
301
+ t .vs ["name" ] = vertices
302
+ t .add_edges (arestas_final )
303
+ t .es ["weight" ] = lista
304
+ t .vs ["label" ] = t .vs ["name" ]
305
+ t .es ["label" ] = t .es ["weight" ]
306
+ cont = 0
307
+ for v in vertices :
308
+ if (v == no_inicial ):
309
+ break
310
+ cont = cont + 1
311
+ lista = []
312
+ lista .append (cont )
313
+ layout = t .layout ("tree" , root = lista )
314
+ plot (t , layout = layout )
213
315
214
316
#g.vcount()
215
317
#g.ecount()
216
318
319
+ # o algoritmo usado na spanning tree foi o de Kruskal
320
+ def spanning_tree ():
321
+ global g
322
+ global vertices
323
+ global arestas
324
+ global pesos
325
+ antes = {}
326
+ depois = {}
327
+ arestas2 = []
328
+ pesos2 = []
329
+
330
+ print 'Voce selecionou o algoritmo de SPANNING TREE\n A partir do seu grafo, sera construida uma arvore minima:'
331
+ print 'VERTICES: ' + str (vertices )
332
+ print 'ARESTAS: ' + str (arestas )
333
+ print 'PESOS: ' + str (pesos )
217
334
335
+ for i in range (len (vertices )):
336
+ antes [arestas [i ]] = pesos [i ]
337
+ print antes
338
+ menor = pesos
339
+ menor .sort ()
340
+ arestas2 .append
341
+ '''
342
+ t = Graph()
343
+ t.add_vertices(len(vertices))
344
+ for p in predecessor:
345
+ arestas_final.append(predecessor[p])
346
+ lista.append(custo[predecessor[p]])
347
+ t.vs["name"] = vertices
348
+ t.add_edges(arestas_final)
349
+ t.es["weight"] = lista
350
+ t.vs["label"] = t.vs["name"]
351
+ t.es["label"] = t.es["weight"]
352
+ cont = 0
353
+ for v in vertices:
354
+ if(v == no_inicial):
355
+ break
356
+ cont = cont + 1
357
+ lista = []
358
+ lista.append(cont)
359
+ layout = t.layout("tree", root = lista)
360
+ plot(t, layout=layout)
361
+ '''
218
362
219
363
# ----------------------------------------------------------------------MAIN-----------------------------------------------------
220
364
def main ():
221
- global n
222
365
menu ()
223
366
while (n != 5 ):
224
367
criar_grafo ()
225
368
if (n == 1 ):
226
369
dijkstra ()
370
+ elif n == 4 :
371
+ spanning_tree ()
227
372
menu (False )
228
373
229
374
if __name__ == "__main__" :
0 commit comments