Skip to content

Commit bd054cb

Browse files
Bellman-Ford implementado. Trabalho finalizado
1 parent a26d63a commit bd054cb

File tree

1 file changed

+108
-1
lines changed

1 file changed

+108
-1
lines changed

trabalho3.py

+108-1
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@
33
# DANIEL GOBBI BERGHOLZ 16/0004551
44
# TRABALHO 3 FUNDAMENTOS DE REDES 1
55

6+
# o codigo a seguir foi feito sob o efeito de muita pressao e cafeina
7+
# nao recomendo mexer em nada, so deus sabe como isso tudo aqui funciona
8+
69
from igraph import *
710
import os, re
811

912
# variavel global para ir armazenando decisoes do usuario
1013
n = 0
1114

1215
# variaveis globais do grafo
13-
1416
g = Graph()
1517
vertices = []
1618
arestas = []
@@ -500,13 +502,118 @@ def rpf(): # RPF ---------------------------------------------------------------
500502

501503
plot(g, layout = "tree", root = raiz)
502504
salvar(g, "rpf.png", "tree", raiz)
505+
506+
# ----------------------------------------------------------------------ALGORITMOS-----------------------------------------------
507+
def bellman_ford(): # BELLMAN-FORD ----------------------------------------------------------------------------------------------
508+
global g # Graph
509+
global vertices # string
510+
global arestas # (vertice1, vertice2)
511+
global pesos # int
512+
custo = {} # aresta: peso
513+
vizinhos = {} # vertice: [aresta1, aresta2 ...]
514+
matriz = [] # matriz do algoritmo de bellman-ford
515+
indent = {} # int : vertice / indentificador do vertice
516+
517+
print '\nBem vindo ao algoritmo Bellman-Ford!'
518+
print 'A seguir sera gerada uma tabela que contem o caminho minimo entre cada vertice'
519+
520+
# criar o dicionario do custo
521+
for i in range(len(arestas)):
522+
custo[arestas[i]] = pesos[i]
523+
#custo[arestas[i][::-1]] = pesos[i]
524+
525+
# adicionar os vizinhos de cada vertice na variavel "vizinhos"
526+
for v in vertices:
527+
lista = []
528+
for a in arestas:
529+
for i in range(2):
530+
if a[i] == v:
531+
lista.append(a)
532+
vizinhos[v] = lista
533+
534+
# achar o numero (indentificador) de cada vertice e salvar na variavel "indent"
535+
# na moral que esse pedaco de codigo nao serve pra absolutamente nada
536+
cont = 0
537+
for gzin in g.vs["name"]:
538+
for v in vertices:
539+
if v == gzin:
540+
indent[cont] = v
541+
cont = cont + 1
542+
543+
# preenchendo a matriz pela primeira vez / com os custos dos vizinhos somente
544+
for i in range(g.vcount()):
545+
linha = []
546+
for j in range(g.vcount()):
547+
if j in g.neighbors(i):
548+
for a in vizinhos[indent[i]]:
549+
if g.vs["name"][j] in a:
550+
linha.append(custo[a])
551+
elif j == i:
552+
linha.append(0) # o custo so eh zero quando o vertice for ele mesmo
553+
else:
554+
linha.append(999) # 999 = INFINITO
555+
matriz.append(linha)
556+
557+
# o algoritmo propriamente dito
558+
cabou = False
559+
while cabou == False:
560+
cabou = True
561+
for i in range(g.vcount()):
562+
for j in range(g.vcount()): # percorrer toda a matriz
563+
if matriz[i][j] != 0: # se != 0, significa que o elemento eh vizinho do vertice
564+
D = []
565+
D.append(matriz[i][j]) # adicionar custo deste vizinho
566+
offset = 0
567+
while offset < g.vcount():
568+
if (matriz[offset][j] != 0 and matriz[offset][j] != 999):
569+
if matriz[i][offset] != 0 and matriz[i][offset] != 999:
570+
D.append(matriz[i][offset] + matriz[offset][j])
571+
offset = offset +1
572+
D_min = min(D)
573+
if D_min < matriz[i][j]:
574+
matriz[i][j] = D_min
575+
cabou = False
576+
577+
# printando em formato de tabela
578+
print '\nTABELA DE CAMINHOS MINIMOS\n'
579+
print ' | ',
580+
for v in vertices:
581+
print v + ' | ',
582+
print ''
583+
print '-----------------------------------------------'
584+
cont = 0
585+
for M in matriz:
586+
print vertices[cont] + ' | ',
587+
for m in M:
588+
x = str(m)
589+
if len(x) == 2:
590+
print x + ' | ',
591+
elif len(x) == 3:
592+
print x + ' | ',
593+
elif len(x) == 1:
594+
print x + ' | ',
595+
print ''
596+
cont = cont + 1
597+
598+
'''
599+
# printar na tela o menor caminho entre todos os vertices
600+
for v1 in vertices:
601+
for v in vertices:
602+
if v != v1:
603+
dijkstra(v1, v, True, True)
604+
print 'A seguir a tabela final de caminhos minimos desta rede:\n'
605+
plot(g, layout = "tree", root = raiz)
606+
'''
607+
503608
# ----------------------------------------------------------------------MAIN-----------------------------------------------------
504609
def main():
505610
menu()
506611
while (n != 5):
507612
criar_grafo()
508613
if (n == 1):
509614
dijkstra()
615+
elif n == 2:
616+
bellman_ford()
510617
elif n == 3:
511618
rpf()
512619
elif n == 4:

0 commit comments

Comments
 (0)