El espacio de estado del último tic-tac-toe es mucho más grande que el simple 3 × 3 tic-tac-toe con el que todos estamos familiarizados.
Si bien el árbol Minimax de 3 × 3 tic-tac-toe se puede construir fácilmente debido a su factor de ramificación pequeño y constantemente degradante, no se puede decir lo mismo de t3 ultimate (tic-tac-toe). Con un factor de ramificación inicial de 81 y degradando constantemente en 1 después de cada turno. ¡Esto significa que el nodo hoja tendrá 81! posibles estados Ni siquiera podemos almacenar este valor correctamente en lenguaje C.
Esto nos lleva a la conclusión de que no puedo usar Minimax o sus variantes para este problema, al menos no de manera eficiente.
- ¿Cuál es el peor tipo de error que enfrenta un programador?
- ¿Dónde debería comenzar si quiero implementar un algoritmo de detección de movimiento en FPGA?
- ¿Cómo funciona el algoritmo de caminante aleatorio para la segmentación de imágenes en términos simples?
- ¿Cómo se debe aprender la codificación, haciendo algoritmos, desde el nivel básico, dado que no tiene experiencia en codificación? (especialmente desde el punto de vista de la colocación y también dado el hecho de que me queda un año para que comience mi temporada de colocación).
- ¿Qué significa que el algoritmo TD (en el aprendizaje por refuerzo) hace predicción y no control?
Ahora, antes de pasar a métodos más complejos, siempre es bueno analizar los recursos disponibles. Así que mencionaste en tu pregunta que el límite de tiempo es de 15 segundos. Esta es una gran cantidad de tiempo para elegir en un movimiento. Una implementación eficiente de NegaMax podría alcanzar una profundidad decente con esa limitación de tiempo. Pero lo podemos hacer mejor.
Soluciones posibles:
- Búsqueda de árbol de Monte Carlo (MCTS) : en lugar de buscar todos los movimientos posibles desde el estado actual, intente realizar jugadas aleatorias desde el estado actual hasta que finalice el juego. Haga esto suficientes veces y tendrá una estimación decente de qué movimientos tienen la mejor posibilidad de ganar. MCTS es mejor que MiniMax, ya que no necesita ninguna función de costo compleja y precisa y, por lo tanto, ahorra muchos cálculos. Existen muchas implementaciones eficientes de MCTS que funcionan mejor que MiniMax en la mayoría de los casos.
- Aprendizaje de refuerzo (RL) : deje que su bot aprenda de sus errores y aprenda automáticamente el mejor movimiento para tomar desde cada posición del tablero. RL es muy parecido a Minimax, excepto que una vez entrenado solo tiene que mirar un paso adelante para decidir el próximo movimiento.
- Por qué no ambos : el uso de poderosas heurísticas no es infrecuente en MCTS para aumentar sus estadísticas de búsqueda. La heurística entrenada con MCTS evita que la búsqueda se desvíe y pierda tiempo en caminos subóptimos. Incluso con el uso de la heurística, MTCS es mucho más rápido y preciso que Minimax, ya que no tiene que buscar en todas las partes del árbol.
La belleza de estos 2 métodos es que pueden aumentar enormemente usando programación paralela. La ejecución de muchas instancias del agente RL le permitirá conocer la política óptima mucho más rápido. Y ejecutar muchas instancias paralelas de MCTS dará como resultado un aumento masivo en su confianza en la estadística de movimiento.
Sobre esto, intente implementar la lógica de la placa utilizando tablas de bits . No solo le ahorrarán mucha memoria, sino que también le permitirán acelerar el cálculo necesario de varias actualizaciones de la placa con el uso de operaciones morfológicas a nivel de bits (dilatación, erosión, etc.)
Usando estos métodos, estoy seguro de que puedes hacer un bot muy poderoso para el juego