Algoritmos para estrategia en tiempo real wargame AI


Estoy diseñando un juego de estrategia en tiempo real donde la IA será responsable de controlar un gran número de unidades (posiblemente más de 1000) en un gran mapa hexagonal.

Una unidad tiene una serie de puntos de acción que se pueden gastar en movimiento, atacar unidades enemigas o varias acciones especiales (por ejemplo, construir nuevas unidades). Por ejemplo, un tanque con 5 puntos de acción podría gastar 3 en movimiento y 2 en disparar a un enemigo dentro del alcance. Diferentes unidades tienen diferentes costos para diferentes acciones sucesivamente.

Algunas notas adicionales:

  • La salida de la IA es un" comando " a cualquier unidad dada
  • Los puntos de acción se asignan al comienzo de un período de tiempo, pero pueden gastarse en cualquier momento dentro del período de tiempo (esto es para permitir juegos multijugador en tiempo real). Por lo tanto, "no hacer nada y guardar puntos de acción para más tarde" es una táctica potencialmente válida (por ejemplo, una torreta de cañón que no puede moverse esperando a que un enemigo se acerque al rango de tiro)
  • El juego se actualiza en tiempo real, pero la IA puede obtener una instantánea coherente del estado del juego en cualquier momento (gracias a que el estado del juego es una de las estructuras de datos persistentes de Clojure)
  • No estoy esperando un comportamiento "óptimo", solo algo que no es obviamente estúpido y proporciona diversión/desafío razonable para jugar contra

¿Qué puede recomendar en términos de algoritmos/enfoques específicos que permitan el equilibrio adecuado entre eficiencia y comportamiento razonablemente inteligente?

Author: mikera, 2010-07-18

4 answers

Primero debes apuntar a hacer tu juego basado en turnos en algún nivel para la IA (es decir, de alguna manera puedes modelarlo basado en turnos incluso si no está completamente basado en turnos, en RTS puedes romper intervalos discretos de tiempo en turnos. En segundo lugar, debe determinar con cuánta información debe trabajar la IA. Es decir, si a la IA se le permite hacer trampa y conocer cada movimiento de su oponente (haciéndolo así más fuerte) o si debe saber menos o más. En tercer lugar, debe definir una función de costo de un estado. La idea es que un costo más alto significa un peor estado para la computadora. En cuarto lugar, necesita un generador de movimiento, que genere todos los estados válidos a los que la IA puede hacer la transición desde un estado dado (esto puede ser homogéneo [independiente del estado] o heterogéneo [dependiente del estado].)

La cosa es, la función de costo será muy influenciada por lo que exactamente define el estado a ser. Cuanta más información codifique en el estado, mejor equilibrada será su IA, pero más difícil será será para que realice, ya que tendrá que buscar exponencialmente más por cada variable de estado adicional que incluya (en una búsqueda exhaustiva.)

Si proporciona una definición de un estado y una función de costo, su problema se transforma en un problema general en IA que se puede abordar con cualquier algoritmo de su elección.

Aquí hay un resumen de lo que creo que funcionaría bien:

  1. Los algoritmos evolutivos pueden funcionar bien si pones suficiente esfuerzo en ellos, pero lo harán agregue una capa de complejidad que creará espacio para errores, entre otras cosas que pueden salir mal. También requerirán cantidades extremas de ajuste de la función de acondicionamiento físico, etc. No tengo mucha experiencia trabajando con estos, pero si son algo así como redes neuronales (que creo que lo son ya que ambas son heurísticas inspiradas en modelos biológicos), rápidamente encontrará que son volubles y lejos de ser consistentes. Lo más importante, dudo que agreguen beneficios sobre la opción que describo en 3.

  2. Con la función de costo y el estado definido, técnicamente sería posible aplicar gradiente decente (con la suposición de que la función de estado es diferenciable y el dominio de las variables de estado son continuas) sin embargo, esto probablemente produciría resultados inferiores, ya que la mayor debilidad del descenso del gradiente se atasca en los mínimos locales. Para dar un ejemplo, este método sería propenso a algo como atacar al enemigo siempre lo antes posible porque hay una posibilidad no nula de aniquilarlos. Claramente, esto puede no ser un comportamiento deseable para un juego, sin embargo, gradiente decente es un método codicioso y no sabe mejor.

  3. Esta opción sería mi más alta recomendada: recocido simulado. El recocido simulado (IMHO) tendría todas las ventajas de 1. sin la complejidad añadida mientras que es mucho más robusto que 2. En esencia, SA es solo un paseo aleatorio entre los estados. Así que además del costo y estados tendrá que definir una forma de transición aleatoria entre estados. SA tampoco es propenso a quedarse atascado en mínimos locales, mientras que produce muy buenos resultados de manera bastante consistente. El único ajuste requerido con SA sería el programa de enfriamiento which que decide qué tan rápido convergerá SA. La mayor ventaja de SA que encuentro es que es conceptualmente simple y produce resultados superiores empíricamente a la mayoría de los otros métodos que he probado. La información sobre SA se puede encontrar aquí con un largo lista de implementaciones genéricas en la parte inferior.

3b. (Edit Added much later) SA y las técnicas que enumeré anteriormente son técnicas de IA generales y no realmente especializadas en IA para juegos. En general, cuanto más especializado sea el algoritmo, más posibilidades tendrá de mejorar su rendimiento. No Ver Teorema de Almuerzo Gratis 2. Otra extensión de 3 es algo llamado templado paralelo que mejora dramáticamente el rendimiento de SA al ayudarlo a evitar los óptimos locales. Algunos de los documentos originales sobre el templado paralelo son bastante anticuados 3, pero otros han sido actualizados4.

Independientemente del método que elija al final, va a ser muy importante para romper su problema en estados y una función de costo como dije anteriormente. Como regla general, comenzaría con 20-50 variables de estado, ya que su espacio de búsqueda de estado es exponencial en el número de estas variables.

 7
Author: ldog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-17 21:46:30

Si lees Russell y Norvig, encontrarás una gran cantidad de algoritmos para cada propósito, actualizados prácticamente al estado actual del arte. Dicho esto, me sorprendió la cantidad de clases de problemas diferentes que se pueden abordar con éxito con algoritmos bayesianos.

Sin embargo, en su caso creo que sería una mala idea que cada unidad tenga su propia red Petri o motor de inferencia... solo hay una cantidad limitada de CPU, memoria y tiempo disponible. Por lo tanto, un diferente enfoque:

Mientras que de alguna manera tal vez un chiflado, Stephen Wolfram ha demostrado que es posible programar un comportamiento notablemente complejo sobre la base de reglas muy simples. Él extrapola valientemente del Juego de la Vida a la física cuántica y al universo entero.

De manera similar, mucha investigación sobre robots pequeños se centra en comportamiento emergente o inteligencia de enjambre. Mientras que la estrategia militar clásica y la práctica son fuertemente basado en jerarquías, creo que un ejército de luchadores completamente desinteresados e intrépidos (como se puede encontrar marchando en su computadora) podría ser notablemente efectivo si opera como grupos autoorganizados.

Este enfoque probablemente encajaría un poco mejor con el modelo de concurrencia basado en actores de Erlang o Scala que con el STM de Clojure: Creo que la autoorganización y los actores irían muy bien juntos. Aún así, podría imaginar correr a través de una lista de unidades en cada turno, y tener cada unidad evaluando solo un pequeño puñado de reglas muy simples para determinar su próxima acción. Estaría muy interesado en saber si ha intentado este enfoque, y cómo fue!

EDITAR

Algo más que estaba en el fondo de mi mente pero que se me escapó de nuevo mientras escribía: Creo que puedes obtener resultados notables de este enfoque si lo combinas con genética o programación evolutiva; es decir, deja que tus soldados de juguete virtuales otros mientras duermes, deja que codifiquen sus estrategias y mezclen, combinen y muten su código para esas estrategias; y deja que un programa de arbitraje seleccione a los guerreros más exitosos.

He leído sobre algunos éxitos sorprendentes logrados con estas técnicas, con unidades que operan en formas que nunca se nos ocurrirían. He oído que las AIS que trabajan en estos principios han tenido que ser intencionadamente aturdidas para no frustrar a los oponentes humanos.

 11
Author: Carl Smotricz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-18 11:55:10

Esta pregunta tiene un alcance enorme. Básicamente estás preguntando cómo escribir un juego de estrategia.

Hay toneladas de libros y artículos en línea para estas cosas. Recomiendo encarecidamente la serie Game Programming Wisdom y la serie AI Game Programming Wisdom. En particular, la sección 6 del primer volumen de AI Game Programming Wisdom cubre la arquitectura general, la Sección 7 cubre las arquitecturas de toma de decisiones y la Sección 8 cubre las arquitecturas para géneros específicos (8.2 hace el género RTS).

 8
Author: Marcelo Cantos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-18 10:51:23

Es una pregunta enorme, y las otras respuestas han señalado recursos increíbles para investigar.

He tratado con este problema en el pasado y encontré el enfoque de comportamiento simple-manifiesto-complejo/emergente un poco demasiado difícil de manejar para el diseño humano a menos que se aborde genéticamente/evolutivamente.

Terminé usando capas abstractas de IA, similar a una forma en que los ejércitos funcionan en la vida real. Las unidades se agruparían con las unidades cercanas del mismo tiempo en escuadrones, que son agrupados con escuadrones cercanos para crear una especie de mini batallón. Se podrían utilizar más capas aquí(grupos de batallones en una región, etc.), pero en última instancia en la parte superior está la IA estratégica de alto nivel.

Cada capa solo puede emitir comandos a las capas directamente debajo de ella. La capa inferior intentará ejecutar el comando con los recursos a mano (es decir, las capas debajo de esa capa).

Un ejemplo de una orden emitida a una sola unidad es "Ir aquí" y "disparar a este objetivo". Los comandos de nivel superior emitidos a niveles superiores serían "secure this location", que ese nivel procesaría y emitiría los comandos apropiados a los niveles inferiores.

El maestro AI de más alto nivel es responsable de las decisiones estratégicas de la junta directiva, como "necesitamos más unidades____", o "debemos apuntar a avanzar hacia esta ubicación".

La analogía del ejército funciona aquí; comandantes y tenientes y cadena de mando.

 6
Author: Justin L.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-19 01:03:01