2009-10-28 12 views
6

Una volta scrissi un AI di Tetris che suonava Tetris piuttosto bene. L'algoritmo che ho usato (described in this paper) è un processo in due fasi.Determinare quali ingressi pesare in un algoritmo evolutivo

Nel primo passaggio, il programmatore decide di tracciare gli input che sono "interessanti" per il problema. In Tetris potremmo essere interessati a tenere traccia di quante lacune ci sono in fila perché ridurre al minimo le lacune potrebbe aiutare a collocare i pezzi futuri più facilmente. Un'altra potrebbe essere l'altezza media delle colonne, perché potrebbe essere una cattiva idea correre dei rischi se stai per perdere.

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

Utilizzando questi input e i relativi pesi, è possibile determinare il valore dell'azione. Ad esempio, se posizionando la linea retta completamente nella colonna di destra si eliminano gli spazi vuoti di 4 righe diverse, questa azione potrebbe ottenere un punteggio molto alto se il suo peso è elevato. Allo stesso modo, posizionandolo in cima potrebbe effettivamente causare spazi vuoti e quindi l'azione ottiene un punteggio basso.

Mi sono sempre chiesto se c'è un modo per applicare un algoritmo di apprendimento al primo passaggio, in cui troviamo input potenziali "interessanti". Sembra possibile scrivere un algoritmo in cui il computer impara prima quali input potrebbero essere utili, quindi applica l'apprendimento per pesare tali input. Qualcosa è stato fatto prima? È già in uso in qualsiasi applicazione AI?

+1

+1 Sto cercando di iniziare in questo campo. Ho un paio di programmi dimostrativi per animali domestici ma non ancora nulla di grosso. Interessato a vedere che tipo di risposte si torna su questo. –

risposta

1

Nelle reti neurali, è possibile selezionare i potenziali input "interessanti" individuando quelli con la correlazione più forte, positiva o negativa, con le classificazioni per cui si sta formando. Immagino che tu possa fare lo stesso in altri contesti.

+0

Cosa intendi per "correlazione con le classificazioni" in questo contesto? – Kai

+0

Supponiamo che tu stia allenando una rete neurale per classificare i modelli come "la lettera A" o "non la lettera A". Hai un sacco di casi di formazione in cui hai alcuni dati e sai se si tratta o meno di un A. Puoi suddividere i dati in un numero qualsiasi di modi, ognuno dei quali è un potenziale input. I migliori input potenziali sono quelli che mostrano una forte correlazione numerica con lo stato A-or-not-A. Se un potenziale input non varia, è inutile. Se varia in modo casuale, è inutile. Se varia in coordinazione con l'A-or-An-Aness del modello, è d'oro. – chaos

+0

Ah, capisco! Non avevo pensato di usare i dati campione preesistenti (è difficile immaginarlo in Tetris). In effetti, penso che recaptcha (http://recaptcha.net/learnmore.html) fa questo. Non mi è venuto in mente finché non ho letto il tuo esempio. – Kai

0

Penso che potrei affrontare il problema che stai descrivendo inserendo più dati primitivi in ​​un algoritmo di apprendimento. Ad esempio, uno stato di gioco tetris può essere descritto dall'elenco delle celle occupate. Una stringa di bit che descrive questa informazione sarebbe un input adatto a quello stadio dell'algoritmo di apprendimento. in realtà allenarsi su questo è ancora impegnativo; come fai a sapere se questi sono risultati utili. Suppongo che potresti far rotolare l'intero algoritmo in un singolo blob, dove l'algoritmo viene alimentato con gli stati di gioco successivi e l'output sarebbe solo il posizionamento dei blocchi, con algoritmi di punteggio più alti selezionati per le generazioni future.

Un'altra scelta potrebbe essere quella di utilizzare un grande corpus di ascolti da altre fonti; come le rappresentazioni registrate da giocatori umani o un ai di mano, e selezionare gli algoritmi che hanno una forte correlazione con qualche fatto interessante o altro dal gioco futuro, come il punteggio guadagnato nelle successive 10 mosse.

+0

Penso che il primo suggerimento sia di cambiare il modello con cui viene rappresentato il problema. Potrebbe essere più facile codificarlo, ma mi chiedo se possa effettivamente aiutare con l'apprendimento. Mi piace molto l'idea di usare altre fonti però. – Kai

+0

Non sono nemmeno completamente soddisfatto della mia risposta. Se dovessi indovinare, suppongo che questo probabilmente aumenti il ​​tempo di apprendimento di circa 2 ordini di grandezza. – SingleNegationElimination

0

Sì, c'è un modo.

Se si scelgono le funzioni selezionate M ci sono sottoinsiemi 2^M, quindi c'è molto da guardare. lo farei al seguente:

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

Poi, per ogni coppia S-W, è possibile eseguire giochi G per ogni coppia e salvare il punteggio L per ciascuno di essi. Ora avete una tabella come questa:

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 è possibile eseguire alcuni algoritmo di selezione dei componenti (PCA per esempio) e decidere quali caratteristiche sono la pena di spiegare Scorel.

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

Spero che aiuti in qualcosa!

Problemi correlati