Ich schreibe gerade eine AI für ein Spiel, das in C++ geschrieben ist. Die KI ist konzeptionell ziemlich einfach, sie läuft einfach durch einen Entscheidungsbaum und wählt geeignete Aktionen aus. Ich habe vorher Prolog für die Entscheidungs-Engine verwendet, aber aufgrund der anderen Entwickler, die C++ benutzen und einige Probleme mit der Integration des Prolog-Codes, versuche ich jetzt, es nach C++ zu portieren.Design-Muster für große Entscheidungsbaum AI in C++
Derzeit habe ich eine Reihe von Fakten und Regeln in Prolog (100+). Viele drücken Dinge in der Form aus, wenn game_state dann Aktion xyz macht. Die meisten Regeln sind ziemlich einfach, einige sind ziemlich komplex. Ich betrachtete einen endlichen Automaten, aber das schien nicht so gut auf die größeren Situationen zu skalieren. Mein erster Versuch, dies in C++ zu kodieren, war ein riesiger Albtraum von dann noch anderen Case-Statements. Ich hatte diese Art von Code überall auftauchen:
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
}
Die Komplexität wurde schnell unüberschaubar.
Wenn es eine gute Möglichkeit gibt, diese Art von Problem in C++ zu codieren? Gibt es gute Entwurfsmuster, um mit dieser Art von Situation umzugehen? Es gibt keine Anforderung, dass die Logik in der Quelle enthalten sein muss, sie muss nur von C++ aus zugänglich sein. Die einzige wirkliche Anforderung ist, dass es einigermaßen schnell ist.
Ich schaute auch auf Regeln Motoren und wenn schnell genug, könnten sie angemessen sein. Weißt du, ob es eine Open-Source-C++ - Regel-Engine gibt, die angemessen wäre?
Das ist eine Finite-State-Maschine ist, was genau das ist, was er sagte, er versucht, ersten und blies in seinem Gesicht. – Potatoswatter
Es war nicht so sehr, dass ein endlicher Automat war nicht das, was ich wollte, war es, dass die naive Implementierung eines endlichen Automaten zu komplex war überschaubar. Dieser Vorschlag scheint die Komplexität besser zu verwalten. Der Gebrauch des Dolmetschers scheint genau das zu sein, was ich brauche, um diesem Ansatz zu folgen. Ich bin jedoch noch nicht vollständig verkauft auf einen endlichen Automaten Ansatz – shuttle87
Der erste Block eine Zustandsmaschine ist natürlich, aber mein Punkt war, dass man es als tabellengesteuerten Algorithmus eher als ein Bündel von verschachtelten if-dann- implementieren elses oder eine große böse switch-Anweisung. Der zweite Chunk versucht, ein DSL nur mit C++ - Syntax zu zeigen. Dies kann mehr als eine einfache Zustandsmaschine sein. Sie haben Prolog im Einsatz, und anstatt es in C++ zu übersetzen, denke ich, dass es einfacher und sauberer ist, C++ beizubringen, wie Sie Ihren vorhandenen Code/Daten interpretieren. Vielleicht könnten Sie eine Teilmenge Ihrer Regeln/Fakten veröffentlichen, damit wir sie besser behandeln und ein vernünftiges Beispiel geben können. – xscott