Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,14 @@ y conjuntos (como estructura de datos).

En clase se dio un ejemplo de el uso de dichas búsquedas. Revisa y familiarizate con dichas clases y funciones. Si es necesario desarrolla un problema pequeñito para que las pruebes (el problema de los *misioneros y los canibales* es un ejemplo fácil de programar y fácil de aplicar).

2. En el mismo archivo, en la parte final, se encuentra el encabezado para desarrollar la función de búsqueda utilizando el algoritmo A*. Recuerda que en general estamos haciendo la búsqueda en grafos con el fin de reducir el número de estados explorados. Con el fin que pruebes si el algortimo que desarrollaste funciona, en el archivo `ocho_puzzle.py` se encuentra programado y funcionando el problema del ocho puzzle, así como las dos heurísicas vistas en clase. Con el fin de comparar resultados, se presenta la solucion de 3 problemas (3 estados iniciales diferentes) con ambas heurísticas y con la búsqueda de costo uniforme. Puedes cambiar esto y experimentar, hasta que estes seguro que tu algoritmo es eficiente.
2. En el mismo archivo, en la parte final, se encuentra el encabezado para desarrollar la función de búsqueda utilizando el algoritmo A*. Recuerda que en general estamos haciendo la búsqueda en grafos con el fin de reducir el número de estados explorados. Con el fin que pruebes si el algoritmo que desarrollaste funciona, en el archivo `ocho_puzzle.py` se encuentra programado y funcionando el problema del ocho puzzle, así como las dos heurísticas vistas en clase. Con el fin de comparar resultados, se presenta la solución de 3 problemas (3 estados iniciales diferentes) con ambas heurísticas y con la búsqueda de costo uniforme. Puedes cambiar esto y experimentar, hasta que estes seguro que tu algoritmo es eficiente.

3. En el archivo `problemas.py` se encuentran unos nuevos problemas de planeación. Desarrolla los modelos de cada reto, definiendo los métodos de `acciones_legales`, `sucesor`, `costo_local` y modificando el método `__init__`.

4. Desarrolla una huerística para cada reto, especifíca porque consideras que es admisible, y prográmala en la función `h_1_{nombre del problema}`.
4. Desarrolla una heurística para cada reto, específica porque consideras que es admisible, y prográmala en la función `h_1_{nombre del problema}`.

5. Ahora desarrolla una segunda heurística (proponer una puede ser algo dificil, pero dos ya implica creatividad). Argumenta porque crees que es admisible esta heurística.

6. Ejecuta el programa y revisa las soluciones con ambas heurísticas, y sobre esto, determina si hay una que parece dominante sobre la otra, y porqué.



25 changes: 23 additions & 2 deletions busquedas.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

"""

import busquedas

__author__ = 'juliowaissman'

from collections import deque
Expand Down Expand Up @@ -283,5 +285,24 @@ def busqueda_A_estrella(problema, heuristica):
@return Un objeto tipo Nodo con la estructura completa

"""
raise NotImplementedError('Hay que hacerlo de tarea \
(problema 2 en el archivo busquedas.py)')

nodo_inicio = busquedas.Nodo(problema.x0)
frontera = []
heapq.heappush(frontera, (heuristica(nodo_inicio), nodo_inicio))
visitados = {nodo_inicio.estado: nodo_inicio.costo}

while frontera:
_, nodo = heapq.heappop(frontera) # Se extrae el nodo con menor costo f(n)

if problema.es_meta(nodo.estado):
nodo.nodos_visitados = problema.num_nodos
return nodo

for hijo in nodo.expande(problema.modelo):
f_hijo = hijo.costo + heuristica(hijo) # f(n) = g(n) + h(n)

# Si es un mejor camino
if hijo.estado not in visitados or visitados[hijo.estado] > hijo.costo:
heapq.heappush(frontera, (f_hijo, hijo))
visitados[hijo.estado] = hijo.costo
return None
111 changes: 105 additions & 6 deletions ocho_puzzle.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ def acciones_legales(self, estado):
def sucesor(self, estado, accion):
s = list(estado)
ind = s[-1]
bias = (-3 if accion is 'N' else
3 if accion is 'S' else
-1 if accion is 'O' else
bias = (-3 if accion == 'N' else
3 if accion == 'S' else
-1 if accion == 'O' else
1)
s[ind], s[ind + bias] = s[ind + bias], s[ind]
s[-1] += bias
Expand Down Expand Up @@ -171,11 +171,110 @@ def probando(pos_ini):


if __name__ == "__main__":
estado1 = (1, 0, 2, 3, 4, 5, 6, 7, 8)
estado2 = (5, 1, 3, 4, 0, 2, 6, 7, 8)
estado3 = (1, 7, 8, 2, 3, 4, 5, 6, 0)

probando((1, 0, 2, 3, 4, 5, 6, 7, 8))
print("---------- Pruebas Default -------------")
probando(estado1)

print("\n\n\ny con otro problema de 8 puzzle")
probando((5, 1, 3, 4, 0, 2, 6, 7, 8))
probando(estado2)

print("\n\n\ny por último")
probando((1, 7, 8, 2, 3, 4, 5, 6, 0))
probando(estado3)

# ------- A* con h1 -----------
print("---------- Utilizando A* con h1 -------------")
print("------- 1 -------")
problema = Ocho_puzzle(estado1)
solucion = busquedas.busqueda_A_estrella(problema, h_1)
print(solucion)
print("Explorando {} nodos".format(solucion.nodos_visitados))

print("------- 2 -------")
problema = Ocho_puzzle(estado2)
solucion = busquedas.busqueda_A_estrella(problema, h_1)
print(solucion)
print("Explorando {} nodos".format(solucion.nodos_visitados))

print("------- 3 -------")
problema = Ocho_puzzle(estado3)
solucion = busquedas.busqueda_A_estrella(problema, h_1)
print(solucion)
print("Explorando {} nodos".format(solucion.nodos_visitados))

# ------- A* con h2 -----------
print("---------- Utilizando A* con h2 -------------")
print("------- 1 -------")
problema = Ocho_puzzle(estado1)
solucion = busquedas.busqueda_A_estrella(problema, h_2)
print(solucion)
print("Explorando {} nodos".format(solucion.nodos_visitados))

print("------- 2 -------")
problema = Ocho_puzzle(estado2)
solucion = busquedas.busqueda_A_estrella(problema, h_2)
print(solucion)
print("Explorando {} nodos".format(solucion.nodos_visitados))

print("------- 3 -------")
problema = Ocho_puzzle(estado3)
solucion = busquedas.busqueda_A_estrella(problema, h_2)
print(solucion)
print("Explorando {} nodos".format(solucion.nodos_visitados))

'''
estado1 = (1, 0, 2, 3, 4, 5, 6, 7, 8)
estado2 = (5, 1, 3, 4, 0, 2, 6, 7, 8)
estado3 = (1, 7, 8, 2, 3, 4, 5, 6, 0)

print("---------- Pruebas Default -------------")
probando(estado1)

print("\n\n\ny con otro problema de 8 puzzle")
probando(estado2)

print("\n\n\ny por último")
probando(estado3)

# ------- A* con h1 -----------
print("---------- Utilizando A* con h1 -------------")
print("------- 1 -------")
problema = Ocho_puzzle(estado1)
solucion = busquedas.busqueda_A_estrella(problema, h_1)
print(solucion)
print("Explorando {} nodos".format(solucion.nodos_visitados))

print("------- 2 -------")
problema = Ocho_puzzle(estado2)
solucion = busquedas.busqueda_A_estrella(problema, h_1)
print(solucion)
print("Explorando {} nodos".format(solucion.nodos_visitados))

print("------- 3 -------")
problema = Ocho_puzzle(estado3)
solucion = busquedas.busqueda_A_estrella(problema, h_1)
print(solucion)
print("Explorando {} nodos".format(solucion.nodos_visitados))

# ------- A* con h2 -----------
print("---------- Utilizando A* con h2 -------------")
print("------- 1 -------")
problema = Ocho_puzzle(estado1)
solucion = busquedas.busqueda_A_estrella(problema, h_2)
print(solucion)
print("Explorando {} nodos".format(solucion.nodos_visitados))

print("------- 2 -------")
problema = Ocho_puzzle(estado2)
solucion = busquedas.busqueda_A_estrella(problema, h_2)
print(solucion)
print("Explorando {} nodos".format(solucion.nodos_visitados))

print("------- 3 -------")
problema = Ocho_puzzle(estado3)
solucion = busquedas.busqueda_A_estrella(problema, h_2)
print(solucion)
print("Explorando {} nodos".format(solucion.nodos_visitados))
'''
Loading