-
Notifications
You must be signed in to change notification settings - Fork 0
/
BusquedaBidireccional.py
70 lines (53 loc) · 2.12 KB
/
BusquedaBidireccional.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
from Arbol import Arbol
from Grafo import Grafo
def busqueda_bidireccional(inicio, meta, grafo):
#Listas de nodos expandidos
busqueda_adelante = []
busqueda_reversa = []
busqueda_adelante.append(inicio)
busqueda_reversa.append(meta)
#Listas nodos visitados
visitados_adelante = []
visitados_adelante.append(inicio)
visitados_reversa = []
visitados_reversa.append(meta)
#Arboles de ambas busquedas
arbol_adelante = Arbol(inicio, [inicio])
arbol_reversa = Arbol(meta, [meta])
se_interceptan = False
nodo_interceptado = None
while (busqueda_adelante or busqueda_reversa) and not se_interceptan:
nodo_actual = busqueda_adelante.pop(0)
for sucesor, distancia in grafo[nodo_actual]:
if sucesor not in visitados_adelante:
visitados_adelante.append(sucesor)
busqueda_adelante.append(sucesor)
arbol_adelante.añadir(nodo_actual, sucesor)
if sucesor in busqueda_reversa:
se_interceptan = True
nodo_interceptado = sucesor
break
nodo_actual = busqueda_reversa.pop(0)
for sucesor,distancia in grafo[nodo_actual]:
if sucesor not in visitados_reversa:
visitados_reversa.append(sucesor)
busqueda_reversa.append(sucesor)
arbol_reversa.añadir(nodo_actual, sucesor)
if sucesor in busqueda_adelante:
se_interceptan = True
nodo_interceptado = sucesor
break
camino_mas_corto = arbol_adelante.buscar(nodo_interceptado).camino
listaAux = arbol_reversa.buscar(nodo_interceptado).camino
listaAux.reverse()
print('Arbol de la busqueda desde el inicio:')
arbol_adelante.imprimir()
print('\nÁrbol de la búsqueda desde la meta:')
arbol_reversa.imprimir()
camino_mas_corto.extend(listaAux)
return camino_mas_corto
if __name__ == "__main__":
print('\n\n')
camino = busqueda_bidireccional('Arad', 'Bucarest', Grafo)
print('\nCamino mas corto por búsqueda bidireccional: ')
print(camino)