Domanda

Una volta ho scritto una Tetris AI che ha giocato abbastanza bene a Tetris. L'algoritmo che ho usato ( descritto in questo documento ) è in due fasi processo.

Nel primo passaggio, il programmatore decide di tenere traccia degli input che sono "interessanti". al problema. In Tetris potremmo essere interessati a rintracciare quanti vuoti ci sono in fila perché minimizzare i vuoti potrebbe aiutare a posizionare i pezzi futuri più facilmente. Un'altra potrebbe essere l'altezza media della colonna perché potrebbe essere una cattiva idea correre rischi se stai per perdere.

Il secondo passo è determinare i pesi associati a ciascun input. Questa è la parte in cui ho usato un algoritmo genetico. Qualsiasi algoritmo di apprendimento farà qui, purché i pesi siano adeguati nel tempo in base ai risultati. L'idea è di lasciare che il computer decida in che modo l'input si collega alla soluzione.

Usando questi input e i loro pesi possiamo determinare il valore di intraprendere qualsiasi azione. Ad esempio, se inserendo la forma della linea retta nella colonna di destra si eliminano gli spazi vuoti di 4 file diverse, questa azione potrebbe ottenere un punteggio molto alto se il suo peso è alto. Allo stesso modo, posizionarlo in alto potrebbe effettivamente causare delle lacune e quindi l'azione ottiene un punteggio basso.

Mi sono sempre chiesto se esiste un modo per applicare un algoritmo di apprendimento al primo passo, dove troviamo "interessante" input potenziali. Sembra possibile scrivere un algoritmo in cui il computer prima impara quali input potrebbero essere utili, quindi applica l'apprendimento per pesare quegli input. È stato fatto qualcosa di simile prima? È già utilizzato in alcune applicazioni AI?

È stato utile?

Soluzione

Nelle reti neurali, puoi selezionare input potenziali "interessanti" trovando quelli che hanno la più forte correlazione, positiva o negativa, con le classificazioni per cui ti stai allenando. Immagino che tu possa fare lo stesso in altri contesti.

Altri suggerimenti

Penso che potrei affrontare il problema che stai descrivendo fornendo più dati primitivi a un algoritmo di apprendimento. Ad esempio, uno stato di gioco di tetris può essere descritto dall'elenco delle celle occupate. Una serie di bit che descrivono queste informazioni sarebbe un input adatto a quella fase dell'algoritmo di apprendimento. allenarsi su questo è ancora impegnativo; come fai a sapere se questi sono risultati utili. Suppongo che potresti trasformare l'intero algoritmo in un singolo BLOB, in cui l'algoritmo è alimentato con i successivi stati di gioco e l'output sarebbe solo il posizionamento dei blocchi, con algoritmi con punteggio più alto selezionati per le generazioni future.

Un'altra scelta potrebbe essere quella di utilizzare un ampio corpus di opere teatrali da altre fonti; come i giochi registrati di giocatori umani o un ai realizzato a mano, e seleziona gli algoritmi i cui risultati hanno una forte correlazione con qualche fatto interessante o un altro dal gioco futuro, come il punteggio guadagnato nelle successive 10 mosse.

Sì, c'è un modo.

Se scegli M le funzionalità selezionate ci sono 2 ^ M sottoinsiemi, quindi c'è molto da guardare. Vorrei quanto segue:

For each subset S
   run your code to optimize the weights W
   save S and the corresponding W

Quindi, per ogni coppia S-W, puoi eseguire giochi G per ogni coppia e salvare il punteggio L per ognuna. Ora hai un tavolo come questo:

feature1    feature2    feature3    featureM   subset_code game_number    scoreL
1           0           1           1           S1         1              10500
1           0           1           1           S1         2              6230
...
0           1           1           0           S2         G + 1          30120
0           1           1           0           S2         G + 2          25900

Ora puoi eseguire alcuni algoritmi di selezione dei componenti (ad esempio PCA) e decidere quali funzioni valgono per spiegare il punteggio L.

Un consiglio: quando si esegue il codice per ottimizzare W, eseguire il seeding del generatore di numeri casuali, in modo che ogni diverso "cervello in evoluzione" venga testato sulla stessa sequenza di pezzi.

Spero che sia d'aiuto in qualcosa!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top