Skip to content

Commit 7bc2c76

Browse files
ler_dot() finalizada. Iniciando o Dijkstra
1 parent 726b02b commit 7bc2c76

File tree

3 files changed

+92
-20
lines changed

3 files changed

+92
-20
lines changed

g2.dot

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
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+
}

g3.dot

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
graph g {
2+
a -- v1 [label=0.3];
3+
v1 -- a [label=1.5];
4+
v2 -- v3 [label=3.8];
5+
v3 -- v4 [label=1.7];
6+
}

trabalho3.py

Lines changed: 80 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@
99
# variavel global para ir armazenando decisoes do usuario
1010
n = 0
1111

12-
# criar grafo
12+
# variaveis globais do grafo
13+
1314
g = Graph()
15+
vertices = []
16+
arestas = []
17+
pesos = []
1418

1519
'''
1620
g.add_vertices(4)
@@ -28,34 +32,49 @@
2832
plot(g, layout = layout)
2933
'''
3034

35+
# ----------------------------------------------------------------------MENU-----------------------------------------------
3136
def menu(primeira_vez=True):
37+
global n
3238
if (primeira_vez == True):
3339
os.system('clear')
3440
print 'Seja bem vindo ao meu programa que simula grafos\n'
3541
print 'A seguir os algoritmos disponiveis:\n'
3642
print '1) Dijkstra\n2) Bellman-Ford\n3) RPF\n4) Spanning Tree\n5) SAIR'
37-
global n
3843
n = input('Por favor, selecione um algoritmo que vc gostaria de executar:\n')
3944
while (n < 1 or n > 5):
4045
n = input('Escolha um numero valido (entre 1 e 5):\n')
4146

4247
def ler_dot():
4348
lista = []
44-
vertices = []
4549
vertices_aux = []
4650
n_vertices = 0
51+
global vertices
52+
global arestas
53+
global pesos
54+
global g
55+
g = Graph()
56+
vertices = []
57+
arestas = []
58+
pesos = []
4759

4860
# abrir arquivo do usuario e ler cada linha
4961
x = raw_input('Por favor digite o nome do arquivo: (eh preciso ter .dot no final e o PATH adequado)\n')
5062
file = open(x, 'r')
5163
linhas = file.readlines()
52-
pattern = '\w+\s*'
64+
pattern = '\w+\.*\w*'
5365

5466
# lista = variavel que guarda par de vertices que possuem aresta
5567
# comeca a ler da linha 1 ao inves da 0, pois a linha zero contem o nome do grafo
5668
for i in range(1, len(linhas)):
5769
lista.append(re.findall(pattern, linhas[i]))
5870

71+
# apos o regex, temos de deletar o 'label' e salvar o peso da aresta
72+
for i in range(len(lista)):
73+
if (len(lista[i]) == 4):
74+
lista[i].remove('label')
75+
pesos.append(float(lista[i][2]))
76+
del lista[i][2]
77+
5978
# lista = lista de listas. vertices = lista
6079
for sublista in lista:
6180
for item in sublista:
@@ -69,6 +88,13 @@ def ler_dot():
6988
except ValueError:
7089
break
7190

91+
# agora iremos adicionar as arestas no grafo
92+
tupla = ()
93+
global arestas
94+
for i in range(0, len(vertices), 2):
95+
tupla = (vertices[i], vertices[i+1])
96+
arestas.append(tupla)
97+
7298
# loop para eliminar duplicatas na lista "vertices"
7399
for i in vertices:
74100
if i not in vertices_aux:
@@ -79,29 +105,20 @@ def ler_dot():
79105
n_vertices = len(vertices)
80106
g.add_vertices(n_vertices)
81107
g.vs["name"] = vertices
82-
83-
# agora iremos adicionar as arestas no grafo
84-
tupla = ()
85-
arestas = []
86-
for i in range(len(lista)):
87-
if (len(sublista) == 2):
88-
for sublista in lista[i]:
89-
tupla = (sublista[0], sublista[1])
90-
arestas.append(tupla)
91108
g.add_edges(arestas)
92-
g.es["weight"] = [0]*len(vertices)
93-
94-
109+
g.es["weight"] = pesos
95110
file.close()
96-
97111

98112
def criar_grafo():
99113
print 'Agora iremos criar seu grafo de testes\n'
100114
y = raw_input('Voce gostaria de carregar um grafo a partir de um arquivo .DOT? (s/n)\n')
101115
if (y == 's'):
102116
ler_dot()
103-
# fazer algo aqui depois
104117
else:
118+
global g
119+
g = Graph()
120+
vertices = []
121+
arestas = []
105122
while True:
106123
try:
107124
x = input('Quantos vertices tem seu grafo?\n')
@@ -138,17 +155,61 @@ def criar_grafo():
138155
plot(g, layout=layout)
139156

140157
# ----------------------------------------------------------------------ALGORITMOS-----------------------------------------------
141-
#def dijkstra(grafo, no_inicial):
158+
def dijkstra():
159+
global g
160+
global vertices
161+
global arestas
162+
global pesos
163+
v_visitados = []
164+
predecessor = {}
165+
custo = {}
166+
menor_custo = {}
167+
168+
# mensagem de boas vindas / relembrar quais vertices existem no grafo
169+
print '\nVoce selecionou o algoritmo de DIJKSTRA\nA seguir o nome dos vertices do seu grafo:\nV = {',
170+
for i in range(len(vertices)):
171+
if (i < len(vertices)-1):
172+
print vertices[i] + ', ',
173+
else:
174+
print vertices[i] + ' }'
175+
176+
# loop para selecionar vertice raiz
177+
while True:
178+
no_inicial = raw_input('Qual sera o seu no inicial(Raiz)?\n')
179+
if (no_inicial not in vertices):
180+
print 'Por favor, digite um vertice que realmente exista no grafo\nA seguir os vertices do seu grafo:\nV = {',
181+
for i in range(len(vertices)):
182+
if (i < len(vertices)-1):
183+
print vertices[i] + ', ',
184+
else:
185+
print vertices[i] + ' }'
186+
else:
187+
break
188+
189+
# inicializando o dijkstra
190+
v_visitados.append(no_inicial)
191+
predecessor[no_inicial] = '0'
192+
menor_custo[no_inicial] = 0
193+
for i in range(len(arestas)):
194+
custo[arestas[i]] = pesos[i]
195+
196+
# descobrir os vizinhos do vertice raiz
142197

143198

144199

200+
#g.vcount()
201+
#g.ecount()
202+
203+
145204

146205
# ----------------------------------------------------------------------MAIN-----------------------------------------------------
147206
def main():
148207
global n
149208
menu()
150209
while (n != 5):
151210
criar_grafo()
211+
if (n == 1):
212+
dijkstra()
152213
menu(False)
153214

154215
if __name__ == "__main__":
@@ -161,4 +222,3 @@ def main():
161222

162223

163224

164-

0 commit comments

Comments
 (0)