Skip to content

Commit 79c9b44

Browse files
RPF implementado
1 parent b3d6106 commit 79c9b44

File tree

1 file changed

+153
-41
lines changed

1 file changed

+153
-41
lines changed

trabalho3.py

Lines changed: 153 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ def vizinhos(arestas, vertice, primeira_vez = False):
189189
return adjacentes
190190

191191
# ----------------------------------------------------------------------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 --------------------------------------
193194
global g
194195
global vertices
195196
global arestas
@@ -199,30 +200,31 @@ def dijkstra():
199200
custo = {}
200201
menor_custo = {}
201202
adjacentes = {}
202-
no_inicial = ''
203-
no_final = ''
204203

205204
# mensagem de boas vindas / relembrar quais vertices existem no grafo
206-
print '\nVoce selecionou o algoritmo de DIJKSTRA\nA seguir o nome dos vertices do seu grafo:\nV = {',
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 '\nVoce selecionou o algoritmo de DIJKSTRA\nA seguir o nome dos vertices do seu grafo:\nV = {',
209+
for i in range(len(vertices)):
210+
if (i < len(vertices)-1):
211+
print vertices[i] + ', ',
212+
else:
213+
print vertices[i] + ' }'
212214

213215
# 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\nA seguir os vertices do seu grafo:\nV = {',
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\nA seguir os vertices do seu grafo:\nV = {',
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
226228

227229
# inicializando o dijkstra
228230
v_visitados.append(no_inicial)
@@ -268,12 +270,13 @@ def dijkstra():
268270
falta_vertice = True
269271
if falta_vertice == False:
270272
break
271-
273+
272274
# printar na tela o menor caminho e o menor custo
273275
aux = []
274276
cont = 0
275277
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: ',
277280
aux.append(no_final)
278281
while cabou == False:
279282
for tupla in predecessor[aux[cont]]:
@@ -284,23 +287,29 @@ def dijkstra():
284287
a = cont + 1
285288
cont = a
286289
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:'
295299

296300
# printar arvore criada para o dijkstra
297301
t = Graph()
298302
t.add_vertices(len(vertices))
299303
arestas_final = []
300304
lista = []
301305
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]])
304313
t.vs["name"] = vertices
305314
t.add_edges(arestas_final)
306315
t.es["weight"] = lista
@@ -314,17 +323,30 @@ def dijkstra():
314323
lista = []
315324
lista.append(cont)
316325
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
319331

320332
# o algoritmo usado na spanning tree foi o de Kruskal
321-
def spanning_tree():
333+
def spanning_tree(): # SPANNING TREE --------------------------------------------------------------------------------------------
322334
global vertices
323335
global arestas
324336
global pesos
325337
antes = {} # aresta: peso
326338

327339
print '\nBem vindo ao algoritmo do SPANNING TREE\nIremos 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\nA seguir os vertices do seu grafo:\nV = { ',
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')
328350

329351
# ordenar os pesos em ordem crescente
330352
for i in range(len(arestas)):
@@ -341,8 +363,21 @@ def spanning_tree():
341363
t = Graph()
342364
t.add_vertices(len(vertices))
343365
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])
346381

347382
# comecar o algoritmo de kruskal
348383
aux = menor_arestas
@@ -365,15 +400,92 @@ def spanning_tree():
365400
t.es["weight"] = aux2
366401
t.vs["label"] = t.vs["name"]
367402
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!'
369404
plot(t, layout = "kk")
370405
salvar(t, "spanning_tree.png", "kk")
371406

372407
# 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 = []
374415

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]
375420

376-
salvar(t, "rpf.png", "tree")
421+
# loop para selecionar vertice raiz e destino
422+
print '\nBem vindo ao algoritmo RPF'
423+
while True:
424+
print 'A seguir os vertices do seu grafo:\nV = {',
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)
377489
# ----------------------------------------------------------------------MAIN-----------------------------------------------------
378490
def main():
379491
menu()

0 commit comments

Comments
 (0)