como programar un 8 puzzle con inteligencia artificial
El 8 puzzle es un clásico problema de búsqueda en árboles, que se puede resolver utilizando técnicas de inteligencia artificial. Aquí te presento una implementación básica en Python utilizando la búsqueda en anchura (BFS) y la búsqueda en profundidad (DFS). **Representación del problema** El 8 puzzle se puede representar como un tablero de 3x3 con 8 piezas y un espacio vacío. Cada pieza se puede mover hacia arriba, abajo, izquierda o derecha. La representación del problema se puede hacer utilizando una lista de 9 elementos, donde cada elemento es una pieza o el espacio vacío. **Implementación** ```python import heapq # Representación del problema class Puzzle: def __init__(self, estado): self.estado = estado self.padre = None def __eq__(self, otro): return self.estado == otro.estado def __hash__(self): return hash(self.estado) # Función de evaluación (heurística) def evaluacion(puzzle): # Heurística de Manhattan distancia = 0 for i in range(9): if puzzle.estado[i] != 0 and puzzle.estado[i] != i + 1: distancia += abs((i % 3) - ((puzzle.estado[i] - 1) % 3)) + abs((i // 3) - ((puzzle.estado[i] - 1) // 3)) return distancia # Función de búsqueda en anchura (BFS) def bfs(puzzle_inicial): cola = [puzzle_inicial] visitados = set() while cola: puzzle_actual = cola.pop(0) if puzzle_actual.estado == [1, 2, 3, 4, 5, 6, 7, 8, 0]: return puzzle_actual.padre visitados.add(puzzle_actual) for movimiento in self.obtener_movimientos(puzzle_actual): nuevo_puzzle = Puzzle(movimiento.estado) nuevo_puzzle.padre = puzzle_actual if nuevo_puzzle not in visitados: cola.append(nuevo_puzzle) return None # Función de búsqueda en profundidad (DFS) def dfs(puzzle_inicial): cola = [(puzzle_inicial, [])] visitados = set() while cola: puzzle_actual, camino = cola.pop() if puzzle_actual.estado == [1, 2, 3, 4, 5, 6, 7, 8, 0]: return puzzle_actual.padre, camino visitados.add(puzzle_actual) for movimiento in self.obtener_movimientos(puzzle_actual): nuevo_puzzle = Puzzle(movimiento.estado) nuevo_puzzle.padre = puzzle_actual if nuevo_puzzle not in visitados: cola.append((nuevo_puzzle, camino + [movimiento])) return None # Función para obtener los movimientos posibles def obtener_movimientos(puzzle): movimientos = [] for i in range(9): if puzzle.estado[i] == 0: if i > 2: movimiento = Puzzle(puzzle.estado[:i-1] + [puzzle.estado[i-1], 0] + puzzle.estado[i+1:]) movimientos.append(movimiento) if i % 3 != 0: movimiento = Puzzle(puzzle.estado[:i-1] + [puzzle.estado[i-1], 0] + puzzle.estado[i+1:]) movimientos.append(movimiento) if i < 6: movimiento = Puzzle(puzzle.estado[:i+1] + [0, puzzle.estado[i+1]] + puzzle.estado[i+2:]) movimientos.append(movimiento) if i % 3 != 2: movimiento = Puzzle(puzzle.estado[:i+1] + [0, puzzle.estado[i+1]] + puzzle.estado[i+2:]) movimientos.append(movimiento) return movimientos # Ejemplo de uso puzzle_inicial = Puzzle([1, 2, 3, 4, 5, 6, 7, 8, 0]) puzzle_solucion = bfs(puzzle_inicial) if puzzle_solucion: print("Solución encontrada:") camino = [] while puzzle_solucion: camino.append(puzzle_solucion.estado) puzzle_solucion = puzzle_solucion.padre camino.reverse() for movimiento in camino: print(movimiento) else: print("No se encontró una solución") ``` **Nota**: La búsqueda en anchura (BFS) es una búsqueda exhaustiva que puede ser lenta para problemas grandes. La búsqueda en profundidad (DFS) puede encontrar soluciones más rápidamente, pero puede no encontrar la solución óptima. La búsqueda en anchura con una heurística (A\*) es una búsqueda más eficiente que combina la búsqueda en anchura con una heurística para guiar la búsqueda hacia la solución óptima. **Heurísticas**: Las heurísticas son funciones que estiman la distancia entre el estado actual y el estado objetivo. En este ejemplo, se utiliza la heurística de Manhattan, que calcula la distancia entre cada pieza y su posición objetivo. Otras heurísticas comunes son la heurística de la distancia de Manhattan con una penalización para los movimientos no óptimos y la heurística de la distancia de Manhattan con una penalización para los movimientos que no se pueden realizar. **Ejemplo de uso**: El ejemplo de uso muestra cómo crear un problema de 8 puzzle y cómo buscar una solución utilizando la búsqueda en anchura (BFS). La solución se imprime en la consola.