-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconstruir_grafo_m.py
116 lines (99 loc) · 4.01 KB
/
construir_grafo_m.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
def ler_arquivo_coordenadas(arquivo_coordenadas):
coordenadas = {}
with open(arquivo_coordenadas, 'r') as arquivo:
for linha in arquivo:
if linha.startswith('v'):
partes = linha.strip().split()
node_id = int(partes[1])
latitude = int(partes[3]) / 1000000
longitude = int(partes[2]) / 1000000
coordenadas[node_id] = (latitude, longitude)
return coordenadas
def ler_arquivo_grafo(arquivo_grafo):
grafo = {}
with open(arquivo_grafo, 'r') as arquivo:
for linha in arquivo:
if linha.startswith('a'):
partes = linha.strip().split()
node_id_origem = int(partes[1])
node_id_destino = int(partes[2])
distancia = int(partes[3])
if node_id_origem not in grafo:
grafo[node_id_origem] = {}
grafo[node_id_origem][node_id_destino] = distancia
return grafo
def construir_grafo(arquivo_coordenadas, arquivo_grafo):
coordenadas = ler_arquivo_coordenadas(arquivo_coordenadas)
grafo = ler_arquivo_grafo(arquivo_grafo)
node = 1
grafo_final = []
for node_id, vizinhos in grafo.items():
for vizinho_id in vizinhos.keys():
distancia = vizinhos[vizinho_id]
coordenadas_origem = coordenadas.get(node_id)
coordenadas_destino = coordenadas.get(vizinho_id)
node= node+1
# grafo_final.append({f"Origem: {node_id}, Coordenadas: {coordenadas_origem}, Destino: {vizinho_id}, Coordenadas: {coordenadas_destino}, Distância: {distancia}"})
grafo_final.append(
{
'Origem':node_id,
'Destino':vizinho_id,
'distancia': distancia,
'coordenada_origem': coordenadas_origem,
'coordenada_destino': coordenadas_destino
}
)
return grafo_final
def construir_dicionario(co, gr):
final = {}
# Adiciona os nós do dicionário co ao dicionário final
for node, coordinates in co.items():
final[coordinates[0]] = []
# Preenche o dicionário final com as arestas do grafo gr
for node, edges in gr.items():
current_coordinates = co[node][0]
for edge in edges:
neighbor = edge[0]
weight = edge[1]
neighbor_coordinates = co[neighbor][0]
final[current_coordinates].append([neighbor_coordinates, weight])
return final
def read_DIMACS_graph(file_path):
graph = {}
with open(file_path, 'r') as file:
for line in file:
if line.startswith('c'):
continue # Ignorar comentários
elif line.startswith('p'):
parts = line.split()
num_nodes = int(parts[2])
for i in range(1, num_nodes + 1):
graph[i] = []
elif line.startswith('a'):
parts = line.split()
source = int(parts[1])
target = int(parts[2])
weight = int(parts[3])
graph[source].append([target, weight])
return graph
def read_DIMACS_coordinates(file_path):
verticle_to_coordinates = {}
coordinates_to_verticle = {}
file = open(file_path, 'r')
lines = file.read().splitlines()
for line in lines:
if line.startswith('c'):
continue # Ignorar comentários
elif line.startswith('p'):
parts = line.split()
num_nodes = int(parts[4])
for i in range(1, num_nodes + 1):
verticle_to_coordinates[i] = []
elif line.startswith('v'):
parts = line.split()
verticle = int(parts[1])
lat = int(parts[3]) / 1000000
lon = int(parts[2]) / 1000000
verticle_to_coordinates[verticle].append((lat, lon))
coordinates_to_verticle[(lat, lon)] = verticle
return verticle_to_coordinates, coordinates_to_verticle