|
3 | 3 | # DANIEL GOBBI BERGHOLZ 16/0004551
|
4 | 4 | # TRABALHO 3 FUNDAMENTOS DE REDES 1
|
5 | 5 |
|
| 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 | + |
6 | 9 | from igraph import *
|
7 | 10 | import os, re
|
8 | 11 |
|
9 | 12 | # variavel global para ir armazenando decisoes do usuario
|
10 | 13 | n = 0
|
11 | 14 |
|
12 | 15 | # variaveis globais do grafo
|
13 |
| - |
14 | 16 | g = Graph()
|
15 | 17 | vertices = []
|
16 | 18 | arestas = []
|
@@ -500,13 +502,118 @@ def rpf(): # RPF ---------------------------------------------------------------
|
500 | 502 |
|
501 | 503 | plot(g, layout = "tree", root = raiz)
|
502 | 504 | 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 | + |
503 | 608 | # ----------------------------------------------------------------------MAIN-----------------------------------------------------
|
504 | 609 | def main():
|
505 | 610 | menu()
|
506 | 611 | while (n != 5):
|
507 | 612 | criar_grafo()
|
508 | 613 | if (n == 1):
|
509 | 614 | dijkstra()
|
| 615 | + elif n == 2: |
| 616 | + bellman_ford() |
510 | 617 | elif n == 3:
|
511 | 618 | rpf()
|
512 | 619 | elif n == 4:
|
|
0 commit comments