Actualmente estoy escribiendo una IA para un juego que está escrito en C++. La IA es conceptualmente bastante simple, simplemente se ejecuta a través de un árbol de decisión y selecciona las acciones apropiadas. Anteriormente estaba usando Prolog para el motor de decisión, pero debido a que los otros desarrolladores usan C++ y algunos problemas con la integración del código de prólogo, ahora intento portarlo a C++.Patrón de diseño para gran árbol de decisión basado en IA en C++
Actualmente tengo un montón de hechos y reglas en prolog (más de 100). Muchos expresan cosas en la forma, si game_state entonces realiza la acción xyz. La mayoría de las reglas son bastante simples, y algunas son bastante complejas. Miré un enfoque de máquina de estados finitos, pero eso no parecía escalar tan bien a las situaciones más grandes. Mi primer intento de codificar esto en C++ fue una gran pesadilla de si las otras declaraciones de caso. Tuve este tipo de código apareciendo en todas partes:
if(this->current_game_state->some_condition == true){
if(this->current_game_state->some_other_condition == false){
//some code
}else{
return do_default_action();
}
}else if(this->current_game->another_condition){
//more code
}
La complejidad se hizo rápidamente inmanejable.
¿Hay una buena manera de codificar este tipo de problema en C++? ¿Hay algún patrón de diseño bueno para tratar este tipo de situación? No es necesario que la lógica deba estar contenida dentro de la fuente, solo debe ser accesible desde C++. El único requisito real es que sea razonablemente rápido.
También miré los motores de reglas y si eran lo suficientemente rápidos podrían ser apropiados. ¿Sabes si hay un motor de reglas C++ de código abierto que sería apropiado?
Esa es una máquina de estado finito, que es exactamente lo que dijo que probó primero y explotó en su cara. – Potatoswatter
No era tanto que una máquina de estados finitos no fuera lo que yo quería, sino que la implementación ingenua de una máquina de estados finitos era demasiado compleja para ser manejable. Esta sugerencia parece ayudar a gestionar mejor la complejidad. El uso del intérprete parece ser justo lo que necesito si debo seguir este enfoque. Sin embargo, todavía no estoy completamente convencido de utilizar un enfoque de máquina de estados finitos – shuttle87
El primer fragmento es una máquina de estado, por supuesto, pero mi punto es que puedes implementarlo como un algoritmo impulsado por tablas en lugar de un conjunto de si-entonces- Elses o una gran declaración de cambio desagradable. El segundo bloque está tratando de mostrar una DSL utilizando solo la sintaxis de C++. Esto puede ser más que una simple máquina de estados. Tienes Prolog trabajando, así que en lugar de tratar de traducirlo a C++, creo que podría ser más simple y más limpio enseñarle a C++ cómo interpretar tus códigos/datos existentes. Tal vez podría publicar un subconjunto de sus reglas/hechos para que podamos darle un mejor tratamiento y dar un ejemplo razonable. – xscott