Come dovrebbe essere la struttura multitasking dinamica e interrompibile?

5

Sto cercando di creare un'IA che giochi. In realtà, sto giocando con StarCraft e MineCraft che sono completamente diversi tipi di giochi. Inoltre, utilizzo diversi linguaggi di programmazione per entrambi e uno è multi-thread (java), altri single-threaded (Node.js) guidati dagli eventi.

Nonostante tutte queste differenze, affronterò lo stesso problema: come posso creare un'intelligenza artificiale in grado di gestire le attività in ordine ragionevole, ma anche interrompere le attività in caso di necessità e tornare ad esse in seguito? Come creare una catena di compiti ragionevole (dove un'attività causa un'altra attività secondaria)?

Esempi di sopra possono essere:

  • In Minecraft, stai scavando un blocco e sei attaccato da un mostro
  • In stelline stai conducendo un attacco e una posizione critica nella tua base viene attaccata
  • In minecraft, il compito di tagliare gli alberi è causato dall'attività di costruzione della casa - il bot deve ricordare perché sta facendo ciò che sta facendo.
  • Nella stregoneria, alcuni edifici sono appena costruiti per sbloccare tipi di soldati

Stavo solo giocando con l'idea, ma ho continuato a scrivere e cancellare codice completamente stupido ...

Questo è quello che ho adesso, ma non ha senso. Posso vedere molte situazioni che non saranno risolte usando questo modello.

/***
 *  Task pseudo class. After finishing the task, this task notifies the parent task.
 *  Arguments:
 *    action - function callback that will execute. The callback must call the finished() method in the end. The callback will receive
 *             this task's object as a first argument.  
 **/   
function Task(action, parent, name) {
  this.action = action;
  this.after = after;
  this.name = name||"Void task";
}

Task.prototype.start = function() {
  console.log("Task started...");
  try {
    this.action(this);
  }
  catch(e) {
    console.log("The task action has thrown an error: "+e);
  }
}
Task.prototype.finished = function() {
  console.log("Task over.");
}
//Override this
Task.prototype.pause = function() {};

Temo di dover leggere molte cose al riguardo. Ma ci sono delle idee generali conosciute con cui posso iniziare?

    
posta Tomáš Zato 09.07.2015 - 22:16
fonte

2 risposte

4

Stai costruendo un agente AI artigianale, spesso chiamato Intelligent Agent (IA) ; il suo "ambiente" è il gioco, i suoi "sensori" sono funzioni programmatiche che raccolgono input, i suoi "attuatori" sono anche funzioni che emettono la tastiera / controllano i processi di gioco come input.

Per quanto ne so, se stai scrivendo una IA artigianale, un state-machine (SM) è probabilmente il modo migliore per iniziare; e probabilmente ti porterà il risultato più grande per i tuoi sforzi.

L'artigianato di un SM ti consente di codificare le priorità negli stati e / o nelle transizioni di stato. Un segnale di pericolo potrebbe causare una transizione verso uno stato di difesa, quindi quando il pericolo è stato risolto, puoi riprendere lo stato precedente. In alternativa, puoi semplicemente passare allo stato di priorità più alto successivo. Questo potrebbe lasciare un obiettivo incompiuto, ma potrebbe essere accettabile. Ad esempio, potrebbe non essere efficiente tornare indietro nel punto in cui ti trovavi se l'incontro pericoloso ha spostato la posizione della tua IA in un'altra posizione; cioè rivalutare quale stato di transizione basato sul contesto attuale è probabilmente la cosa giusta da fare.

Lavorare a mano con un agente ti porterà solo così lontano, in pratica trasferirai la tua esperienza e conoscenza all'agente. Per questo motivo potrai trasferire solo alcune delle tue conoscenze all'agente. Questo processo sarà difficile, lungo e soggetto a errori, e il tuo agente non giocherà mai "meglio" di te, dal momento che ha solo un qualche sottoinsieme delle tue conoscenze sul gioco.

L'alternativa alla gestione manuale di un agente è la creazione di un agente appreso, ovvero uno basato su Machine Learning.

Un sistema di apprendimento richiede una funzione obiettivo , anche chiamata funzione di perdita, che deve codificare molte cose:

  • obiettivi
  • sopravvivenza
  • ricompense
  • sanzioni
  • ...

Il sistema di apprendimento cercherà di massimizzare la funzione obiettivo; fondamentalmente la funzione obiettivo dice all'agente quanto sta facendo bene.

Ci sono molti algoritmi di apprendimento tra cui scegliere per eseguire il tuo sistema di apprendimento, ma ci sono solo alcune categorie:

Alcuni algoritmi di apprendimento includono:

Questi metodi non si escludono a vicenda, es. uno può implementare l'apprendimento di rinforzo con una rete neurale. E questi metodi / algoritmi devono essere utilizzati / combinati in modo non banale per creare un agente. Si potrebbe anche voler combinare una soluzione acquisita con una a mano; Ad esempio, utilizza le funzioni apprese per migliorare e / o guidare la tua soluzione artigianale, ad esempio utilizzando un classificatore per aiutare a scegliere le transizioni di stato.

Ho incluso questa sezione in modo che tu possa avere un punto di partenza per la ricerca di una soluzione appresa al tuo problema.

    
risposta data 10.07.2015 - 00:12
fonte
2

I tuoi gestori di eventi dovrebbero essere veloci, come avviare un'azione di gioco e registrarsi e il gestore di eventi fare la prossima cosa al termine di tale azione. Nessun gestore di eventi dovrebbe attendere il tempo di gioco per completare un'azione di gioco. In MineCraft quando inizi a scavare un blocco, chiedi un evento quando termina l'estrazione, e potresti ottenere un evento prima che un mostro stia attaccando. In Star Craft date a un'unità un ordine di spostare / attaccare / costruire qualcosa, e chiedere un evento quando quell'attività è completa. In attesa che si verifichi l'evento, potresti ricevere un evento diverso in base al quale la tua base è sotto attacco o un'altra unità ha completato la sua attività e ha bisogno di ulteriori ordini.

Organizzando le tue azioni di alto livello in azioni veramente a basso livello attivate da eventi, consenti agli eventi rilevanti per altre azioni di alto livello di venire a metà.

    
risposta data 09.07.2015 - 22:45
fonte

Leggi altre domande sui tag