Skip to content

Commit 1c6bd17

Browse files
Dijkstra finalizado
1 parent 98dd161 commit 1c6bd17

File tree

2 files changed

+173
-18
lines changed

2 files changed

+173
-18
lines changed

g.dot

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
graph g {
2+
v0 -- v1 [label=0.3];
3+
v1 -- v2 [label=1.5];
4+
v2 -- v3 [label=3.8];
5+
v3 -- v4 [label=1.7];
6+
v0 -- v5 [label=1.4];
7+
v1 -- v5 [label=1.7];
8+
v2 -- v5 [label=2.2];
9+
v3 -- v5 [label=0.7];
10+
}

trabalho3.py

Lines changed: 163 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ def ler_dot():
9090

9191
# agora iremos adicionar as arestas no grafo
9292
tupla = ()
93-
global arestas
9493
for i in range(0, len(vertices), 2):
9594
tupla = (vertices[i], vertices[i+1])
9695
arestas.append(tupla)
@@ -154,6 +153,27 @@ def criar_grafo():
154153
print 'Grafo criado com sucesso!'
155154
plot(g, layout=layout)
156155

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
157177
# ----------------------------------------------------------------------ALGORITMOS-----------------------------------------------
158178
def dijkstra():
159179
global g
@@ -165,6 +185,8 @@ def dijkstra():
165185
custo = {}
166186
menor_custo = {}
167187
adjacentes = {}
188+
no_inicial = ''
189+
no_final = ''
168190

169191
# mensagem de boas vindas / relembrar quais vertices existem no grafo
170192
print '\nVoce selecionou o algoritmo de DIJKSTRA\nA seguir o nome dos vertices do seu grafo:\nV = {',
@@ -190,40 +212,163 @@ def dijkstra():
190212

191213
# inicializando o dijkstra
192214
v_visitados.append(no_inicial)
193-
predecessor[no_inicial] = '0'
194215
menor_custo[no_inicial] = 0
195216
for i in range(len(arestas)):
196217
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
199270
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)
213315

214316
#g.vcount()
215317
#g.ecount()
216318

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\nA partir do seu grafo, sera construida uma arvore minima:'
331+
print 'VERTICES: ' + str(vertices)
332+
print 'ARESTAS: ' + str(arestas)
333+
print 'PESOS: ' + str(pesos)
217334

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+
'''
218362

219363
# ----------------------------------------------------------------------MAIN-----------------------------------------------------
220364
def main():
221-
global n
222365
menu()
223366
while (n != 5):
224367
criar_grafo()
225368
if (n == 1):
226369
dijkstra()
370+
elif n == 4:
371+
spanning_tree()
227372
menu(False)
228373

229374
if __name__ == "__main__":

0 commit comments

Comments
 (0)