Attualmente sto scrivendo un'IA per un gioco scritto in C++. L'intelligenza artificiale è concettualmente abbastanza semplice, attraversa solo un albero decisionale e sceglie azioni appropriate. In precedenza utilizzavo prolog per il motore decisionale, ma a causa degli altri sviluppatori che utilizzavano C++ e alcuni problemi con l'integrazione del codice prolog ora sto provando a portarlo in C++.Modello di progettazione per una IA basata su grandi alberi decisionali in C++
Attualmente ho un sacco di fatti e regole in prolog (100+). Molti esprimono le cose nella forma, se game_state quindi fa azione xyz. La maggior parte delle regole sono abbastanza semplici e alcune sono piuttosto complesse. Ho esaminato un approccio a macchina a stati finiti, ma non sembra che si adatti alle situazioni più grandi così bene. Il mio primo tentativo di codificare questo in C++ è stato un enorme incubo di se poi altre dichiarazioni di casi. Ho avuto questo tipo di codice spuntando ovunque:
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 complessità è diventata rapidamente ingestibile.
Se esiste un buon modo per codificare questo tipo di problema in C++? Esistono buoni schemi di progettazione per affrontare questo tipo di situazione? Non è richiesto che la logica debba essere contenuta all'interno della sorgente, deve solo essere accessibile da C++. L'unico vero requisito è che sia ragionevolmente veloce.
Ho anche guardato i motori delle regole e se abbastanza veloci potevano essere appropriati. Sai se esiste un motore di regole C++ open source che sarebbe appropriato?
Questa è una macchina a stati finiti, che è esattamente quello che ha detto di aver provato per primo e gli ha fatto saltare in faccia. – Potatoswatter
Non era tanto che una macchina a stati finiti non era quello che volevo, era più che l'ingenua implementazione di una macchina a stati finiti era troppo complessa per essere gestibile. Questo suggerimento sembra aiutare a gestire meglio la complessità. L'uso dell'interprete sembra essere proprio ciò di cui ho bisogno se devo seguire questo approccio. Tuttavia, non sono ancora completamente venduto utilizzando un approccio a macchina a stati finiti – shuttle87
Il primo blocco è ovviamente una macchina a stati, ma il mio punto era che è possibile implementarlo come un algoritmo basato su tabella piuttosto che un gruppo di ifeidali nidificati Elses o una dichiarazione di interruttore brutto grande. Il secondo blocco sta cercando di mostrare un DSL usando solo la sintassi C++. Questo può essere più di una semplice macchina a stati. Hai lavorato su Prolog, quindi piuttosto che cercare di tradurlo in C++, penso che potrebbe essere più semplice e più pulito insegnare a C++ come interpretare il tuo codice/dati esistente. Forse potresti pubblicare un sottoinsieme delle tue regole/fatti in modo da poterle fornire un trattamento migliore e fare un esempio ragionevole. – xscott