@@ -189,7 +189,8 @@ def vizinhos(arestas, vertice, primeira_vez = False):
189
189
return adjacentes
190
190
191
191
# ----------------------------------------------------------------------ALGORITMOS-----------------------------------------------
192
- def dijkstra ():
192
+ # caso queira, pode retornar a arvore gerada pelo dijkstra
193
+ def dijkstra (no_inicial = '' , no_final = '' , quer_somente_o_resultado = False ): # DIJKSTRA --------------------------------------
193
194
global g
194
195
global vertices
195
196
global arestas
@@ -199,30 +200,31 @@ def dijkstra():
199
200
custo = {}
200
201
menor_custo = {}
201
202
adjacentes = {}
202
- no_inicial = ''
203
- no_final = ''
204
203
205
204
# mensagem de boas vindas / relembrar quais vertices existem no grafo
206
- print '\n Voce selecionou o algoritmo de DIJKSTRA\n A seguir o nome dos vertices do seu grafo:\n V = {' ,
207
- for i in range (len (vertices )):
208
- if (i < len (vertices )- 1 ):
209
- print vertices [i ] + ', ' ,
210
- else :
211
- print vertices [i ] + ' }'
205
+ if quer_somente_o_resultado == False :
206
+ no_inicial = ''
207
+ no_final = ''
208
+ print '\n Voce selecionou o algoritmo de DIJKSTRA\n A seguir o nome dos vertices do seu grafo:\n V = {' ,
209
+ for i in range (len (vertices )):
210
+ if (i < len (vertices )- 1 ):
211
+ print vertices [i ] + ', ' ,
212
+ else :
213
+ print vertices [i ] + ' }'
212
214
213
215
# loop para selecionar vertice raiz e destino
214
- while True :
215
- no_inicial = raw_input ('Qual sera o seu no inicial(Raiz)?\n ' )
216
- no_final = raw_input ('E o seu no final?\n ' )
217
- if ((no_inicial not in vertices ) or (no_final not in vertices )):
218
- print 'Por favor, digite um vertice que realmente exista no grafo\n A seguir os vertices do seu grafo:\n V = {' ,
219
- for i in range (len (vertices )):
220
- if (i < len (vertices )- 1 ):
221
- print vertices [i ] + ', ' ,
222
- else :
223
- print vertices [i ] + ' }'
224
- else :
225
- break
216
+ while True :
217
+ no_inicial = raw_input ('Qual sera o seu no inicial(Raiz)?\n ' )
218
+ no_final = raw_input ('E o seu no final?\n ' )
219
+ if ((no_inicial not in vertices ) or (no_final not in vertices )):
220
+ print 'Por favor, digite um vertice que realmente exista no grafo\n A seguir os vertices do seu grafo:\n V = {' ,
221
+ for i in range (len (vertices )):
222
+ if (i < len (vertices )- 1 ):
223
+ print vertices [i ] + ', ' ,
224
+ else :
225
+ print vertices [i ] + ' }'
226
+ else :
227
+ break
226
228
227
229
# inicializando o dijkstra
228
230
v_visitados .append (no_inicial )
@@ -268,12 +270,13 @@ def dijkstra():
268
270
falta_vertice = True
269
271
if falta_vertice == False :
270
272
break
271
-
273
+
272
274
# printar na tela o menor caminho e o menor custo
273
275
aux = []
274
276
cont = 0
275
277
cabou = False
276
- print 'O menor caminho entre ' + no_inicial + ' e ' + no_final + ' eh: ' ,
278
+ if quer_somente_o_resultado == False :
279
+ print 'O menor caminho entre ' + no_inicial + ' e ' + no_final + ' eh: ' ,
277
280
aux .append (no_final )
278
281
while cabou == False :
279
282
for tupla in predecessor [aux [cont ]]:
@@ -284,23 +287,29 @@ def dijkstra():
284
287
a = cont + 1
285
288
cont = a
286
289
aux = aux [::- 1 ]
287
-
288
- for i in range (len (aux )):
289
- if (i == (len (aux )- 1 )):
290
- print aux [i ]
291
- else :
292
- print aux [i ] + ' -> ' ,
293
- print 'Com o custo total de: ' + str (menor_custo [no_final ])
294
- print 'A seguir a arvore de caminho minimo criada pelo DIJKSTRA:'
290
+
291
+ if quer_somente_o_resultado == False :
292
+ for i in range (len (aux )):
293
+ if (i == (len (aux )- 1 )):
294
+ print aux [i ]
295
+ else :
296
+ print aux [i ] + ' -> ' ,
297
+ print 'Com o custo total de: ' + str (menor_custo [no_final ])
298
+ print 'A seguir a arvore de caminho minimo criada pelo DIJKSTRA:'
295
299
296
300
# printar arvore criada para o dijkstra
297
301
t = Graph ()
298
302
t .add_vertices (len (vertices ))
299
303
arestas_final = []
300
304
lista = []
301
305
for p in predecessor :
302
- arestas_final .append (predecessor [p ])
303
- lista .append (custo [predecessor [p ]])
306
+ if quer_somente_o_resultado == False :
307
+ arestas_final .append (predecessor [p ])
308
+ lista .append (custo [predecessor [p ]])
309
+ elif quer_somente_o_resultado == True :
310
+ if p in aux :
311
+ arestas_final .append (predecessor [p ])
312
+ lista .append (custo [predecessor [p ]])
304
313
t .vs ["name" ] = vertices
305
314
t .add_edges (arestas_final )
306
315
t .es ["weight" ] = lista
@@ -314,17 +323,30 @@ def dijkstra():
314
323
lista = []
315
324
lista .append (cont )
316
325
layout = t .layout ("tree" , root = lista )
317
- plot (t , layout = layout )
318
- salvar (t , 'dijkstra.png' , 'tree' , lista )
326
+ if quer_somente_o_resultado == False :
327
+ plot (t , layout = layout )
328
+ salvar (t , 'dijkstra.png' , 'tree' , lista )
329
+ else :
330
+ return t
319
331
320
332
# o algoritmo usado na spanning tree foi o de Kruskal
321
- def spanning_tree ():
333
+ def spanning_tree (): # SPANNING TREE --------------------------------------------------------------------------------------------
322
334
global vertices
323
335
global arestas
324
336
global pesos
325
337
antes = {} # aresta: peso
326
338
327
339
print '\n Bem vindo ao algoritmo do SPANNING TREE\n Iremos gerar uma arvore de custo minimo a partir do grafo que voce escolheu'
340
+ v_raiz = ['kk eae men' ]
341
+ while v_raiz not in vertices :
342
+ if v_raiz != ['kk eae men' ]:
343
+ print 'Por favor, digite um vertice valido\n A seguir os vertices do seu grafo:\n V = { ' ,
344
+ for v in vertices :
345
+ if v != vertices [- 1 ]:
346
+ print v + ', ' ,
347
+ else :
348
+ print v + ' }'
349
+ v_raiz = raw_input ('Qual sera o seu vertice raiz?\n ' )
328
350
329
351
# ordenar os pesos em ordem crescente
330
352
for i in range (len (arestas )):
@@ -341,8 +363,21 @@ def spanning_tree():
341
363
t = Graph ()
342
364
t .add_vertices (len (vertices ))
343
365
t .vs ["name" ] = vertices
344
-
345
- # IMPLEMENTAR FUNCAO AQUI QUE RECEBA UM NO CENTRAL
366
+
367
+ # ja adicionar as arestas do vertice raiz no grafo
368
+ aux3 = []
369
+ aux4 = []
370
+ aux = t .neighbors (v_raiz )
371
+ for i in range (len (menor_arestas )):
372
+ for a in menor_arestas [i ]:
373
+ if a in aux :
374
+ aux3 .append (menor_arestas [i ])
375
+ aux4 .append (menor_pesos [i ])
376
+ del menor_arestas [i ]
377
+ del menor_pesos [i ]
378
+ for i in range (len (aux3 )):
379
+ menor_arestas .insert (0 , aux3 [i ])
380
+ menor_pesos .insert (0 , aux4 [i ])
346
381
347
382
# comecar o algoritmo de kruskal
348
383
aux = menor_arestas
@@ -365,15 +400,92 @@ def spanning_tree():
365
400
t .es ["weight" ] = aux2
366
401
t .vs ["label" ] = t .vs ["name" ]
367
402
t .es ["label" ] = t .es ["weight" ]
368
- print 'A seguir a sua arvore gerada a partir do spanning tree algorithm!'
403
+ print 'A seguir a sua arvore gerada a partir do Spanning Tree algorithm!'
369
404
plot (t , layout = "kk" )
370
405
salvar (t , "spanning_tree.png" , "kk" )
371
406
372
407
# algoritmo que constroi arvore a partir dos menores caminhos entre os vertices
373
- def rpf ():
408
+ def rpf (): # RPF ----------------------------------------------------------------------------------------------------------------
409
+ global g
410
+ global vertices
411
+ global arestas
412
+ global pesos
413
+ custo = {} # aresta: peso
414
+ arestas2 = []
374
415
416
+ # criar o dicionario do custo
417
+ for i in range (len (arestas )):
418
+ custo [arestas [i ]] = pesos [i ]
419
+ custo [arestas [i ][::- 1 ]] = pesos [i ]
375
420
376
- salvar (t , "rpf.png" , "tree" )
421
+ # loop para selecionar vertice raiz e destino
422
+ print '\n Bem vindo ao algoritmo RPF'
423
+ while True :
424
+ print 'A seguir os vertices do seu grafo:\n V = {' ,
425
+ for i in range (len (vertices )):
426
+ if (i < len (vertices )- 1 ):
427
+ print vertices [i ] + ', ' ,
428
+ else :
429
+ print vertices [i ] + ' }'
430
+ no_inicial = raw_input ('Qual sera o seu no inicial(Raiz)?\n ' )
431
+ if no_inicial not in vertices :
432
+ print 'Por favor, digite um vertice que realmente exista no grafo\n '
433
+ else :
434
+ break
435
+ grafos = []
436
+ for v in vertices :
437
+ if v != no_inicial :
438
+ grafos .append (dijkstra (no_inicial , v , True ))
439
+
440
+ aux = Graph ()
441
+ for graf in grafos :
442
+ aux = aux + graf
443
+ print 'A seguir a sua arvore gerada a partir do Reverse Path Fowarding!'
444
+ aux .vs ["name" ] = vertices
445
+ aux .vs ["label" ] = aux .vs ["name" ]
446
+
447
+ # deletar todos os vertices que vieram sem aresta: degree = 0
448
+ cont = []
449
+ for i in range (len (aux .vs )):
450
+ if aux .degree (aux .vs [i ]) == 0 :
451
+ cont .append (i )
452
+ i = len (cont ) - 1
453
+ while i >= 0 :
454
+ aux .delete_vertices (cont [i ])
455
+ i = i - 1
456
+
457
+
458
+ # deletar todos os vertices que sao o no_inicial
459
+ a = []
460
+ cont = []
461
+ for i in range (len (aux .vs )):
462
+ if aux .vs [i ]["name" ] == no_inicial :
463
+ cont .append (i )
464
+ i = len (cont ) - 1
465
+ while i >= 0 :
466
+ a .append (aux .incident (cont [i ])[0 ])
467
+ aux .delete_vertices (cont [i ])
468
+ i = i - 1
469
+
470
+ # criar a arvore final a partir de tudo isso
471
+ g = Graph ()
472
+ g = g or aux
473
+ g .add_vertices (no_inicial )
474
+ g .vs [g .vcount ()- 1 ]["label" ]= g .vs [g .vcount ()- 1 ]["name" ]
475
+ for azin in a :
476
+ g .add_edges ([(azin , no_inicial )])
477
+ for e in g .es :
478
+ arestas2 .append ((g .vs [e .source ]["name" ], g .vs [e .target ]["name" ]))
479
+ pesos2 = []
480
+ for a in arestas2 :
481
+ pesos2 .append (custo [a ])
482
+ g .es ["weight" ] = pesos2
483
+ g .es ["label" ] = g .es ["weight" ]
484
+ raiz = []
485
+ raiz .append (no_inicial )
486
+ print 'A arvore a seguir mostra o menor caminho entre ' + no_inicial + ' e todos os outros vertices do grafo que o senhor passou'
487
+ plot (g , layout = "tree" , root = raiz )
488
+ salvar (g , "rpf.png" , "tree" , raiz )
377
489
# ----------------------------------------------------------------------MAIN-----------------------------------------------------
378
490
def main ():
379
491
menu ()
0 commit comments