You are on page 1of 5

Nota: Referencia de una solucin hbrida del Algoritmo de Bsqueda en Amplitud:

map={
'Arad':{'Sibiu':140, 'Timisoara':118, 'Zerind':75},
'Bucharest':{'Fagaras':211, 'Giurgiu':90, 'Pitesti':101, 'Urziceni':85},
'Craiova':{'Dobreta':120, 'Pitesti':138, 'Rimnicu Vilcea':146},
'Dobreta':{'Craiova':120, 'Mehadia':75},
'Eforie':{'Hirsova':86},
'Fagaras':{'Bucharest':221, 'Sibiu':99},
'Giurgiu':{'Bucharest':90},
'Hirsova':{'Eforie':86, 'Urziceni':98},
'Iasi':{'Neamt':87, 'Vaslui':92},
'Lugoj':{'Mehadia':70, 'Timisoara':111},
'Mehadia':{'Dobreta':75, 'Lugoj':70},
'Neamt':{'Iasi':87},
'Oradea':{'Sibiu':151, 'Zerind':71},
'Pitesti':{'Bucharest':101, 'Craiova':138, 'Rimnicu Vilcea':97},
'Rimnicu Vilcea':{'Craiova':146, 'Pitesti':97, 'Sibiu':80},
'Sibiu':{'Arad':140, 'Fagaras':99, 'Oradea':151, 'Rimnicu Vilcea':80},
'Timisoara':{'Arad':118, 'Lugoj':111},
'Urziceni':{'Bucharest':85, 'Hirsova':98, 'Vaslui':142},
'Vaslui':{'Iasi':92, 'Urziceni':142},
'Zerind':{'Arad':75, 'Oradea':71}}

class Nodo():
"""Clase para los Nodos del rbol de Bsqueda"""
def __init__(self, estado, padre, costo):
self.estado = estado
self.padre = padre
self.costo = costo
self.hijos = []

def traeRuta(y):
"""
Retorna la Ruta desdes y.estado
hasta el estado inicial
"""
ruta = [y.estado]
while y.padre != False:
y = y.padre
ruta.append(y.estado)
ruta.reverse()
return ruta
def expandir(x,sucesores):
"""
Retorna una lista con los Nodos hijos de x
"""
print('{:14}'.format(x.estado), end='')
ruta = set(traeRuta(x))
for (estado, costo) in sucesores(x.estado):
if estado in ruta:
print("{0} x, ".format(estado), end='')
else:
y = Nodo(estado, x, x.costo + costo)
x.hijos.append(y)
estatus = y.costo
print("{0} {1}, ".format(estado, estatus), end='')
print('')
return x.hijos

def vecinos(state):
"""
Utilice esta funcion como entrada del parametro sucesores.
Retorna el estado de los vecinos cercanos de acuerdo al map,
como una secuencia de pares (estado,costo)
"""
return map[state].items()

def buscar(estado, sucesores, meta, estrategia='bf'):


"""
Hace una busqueda en arbol empezando desde estado.
Busca un estado x que satisface la meta(x).
La Estrategia puede ser Amplitud 'bf' (breadth-first)
o Profundidad 'df' (depth-first).
"""
frontera = [Nodo(estado, False,0)]
# "False" significa que no tiene padre
print('\n{:14} {}'.format('__Nodo__','__Expansin__ ...'))
while frontera != []:
if estrategia == 'bf':
x = frontera.pop(0) # Nodo mas antiguo; esto es ineficiente
elif estrategia == 'df':
x = frontera.pop() # Nodo mas reciente; prioriza la rama derecha
else:
raise RuntimeError("'"+ estrategia + "' no es una estrategia valida")
for y in expandir(x,sucesores):
if meta(y.estado):
print('');
return traeRuta(y)
frontera.append(y)
return False

def es_bucharest(estado):
"""
Utilice esta funcion como entrada del parametro meta.
Retorna Verdadero-True en caso estado=Bucharest, sino False-Falso
"""
return estado=='Bucharest'

buscar('Arad', vecinos, es_bucharest, estrategia='bf')

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

La tres
map={
'Arad':{'Sibiu':140, 'Timisoara':118, 'Zerind':75},
'Bucharest':{'Fagaras':211, 'Giurgiu':90, 'Pitesti':101, 'Urziceni':85},
'Craiova':{'Dobreta':120, 'Pitesti':138, 'Rimnicu Vilcea':146},
'Dobreta':{'Craiova':120, 'Mehadia':75},
'Eforie':{'Hirsova':86},
'Fagaras':{'Bucharest':221, 'Sibiu':99},
'Giurgiu':{'Bucharest':90},
'Hirsova':{'Eforie':86, 'Urziceni':98},
'Iasi':{'Neamt':87, 'Vaslui':92},
'Lugoj':{'Mehadia':70, 'Timisoara':111},
'Mehadia':{'Dobreta':75, 'Lugoj':70},
'Neamt':{'Iasi':87},
'Oradea':{'Sibiu':151, 'Zerind':71},
'Pitesti':{'Bucharest':101, 'Craiova':138, 'Rimnicu Vilcea':97},
'Rimnicu Vilcea':{'Craiova':146, 'Pitesti':97, 'Sibiu':80},
'Sibiu':{'Arad':140, 'Fagaras':99, 'Oradea':151, 'Rimnicu Vilcea':80},
'Timisoara':{'Arad':118, 'Lugoj':111},
'Urziceni':{'Bucharest':85, 'Hirsova':98, 'Vaslui':142},
'Vaslui':{'Iasi':92, 'Urziceni':142},
'Zerind':{'Arad':75, 'Oradea':71}}
class Nodo:
def __init__(self, estado, padre, costo):
self.estado = estado
self.padre = padre
self.costo = costo
self.hijos = []

def traeRuta(self,y):
ruta = [y.estado]
while y.padre != False:
y = y.padre
ruta.append(y.estado)
ruta.reverse()
return ruta

def expandir(self,x):
print('Nodo: {:22}'.format(x.estado))

ruta = set(self.traeRuta(x))
for (estado, costo) in self.vecinos(x.estado):
if estado in ruta:
print("[ x ], ".format(estado))
else:
y = Nodo(estado, x, x.costo + costo)
x.hijos.append(y)
estatus = y.costo
print("[ {0} {1} ] ".format(estado, estatus))
print("")
print("")
return x.hijos

def es_bucharest(self,estado):
return estado=='Bucharest'

def vecinos(self,state):
return map[state].items()

class Buscar:
def __init__(self):
self.nodo = Nodo(None, False,0)
def buscar(self,estado, sucesores, meta, estrategia):
frontier = [Nodo(estado, False,0)]
while frontier != []:
if estrategia == 'bf':
x = frontier.pop(0)
elif estrategia == 'df':
x = frontier.pop()
else:
raise RuntimeError("'"+ estrategia + "' no es una estrategia valida")
for y in self.nodo.expandir(x):
if meta(y.estado):
print("Ruta: ", self.nodo.traeRuta(y))
return self.nodo.traeRuta(y)
frontier.append(y)
return False

def buscar_ruta(self):
self.buscar('Arad', self.nodo.vecinos, self.nodo.es_bucharest, 'bf')
if __name__ == '__main__':
buscar = Buscar()
buscar.buscar_

You might also like