2009-04-17 31 views
25

Voglio giocare a Tic-tac-toe utilizzando una rete neurale artificiale. La mia configurazione per la rete è la seguente: Per ognuno dei 9 campi, utilizzo 2 neuroni di input. Quindi ho 18 neuroni di input, ovviamente. Per ogni campo, ho 1 neurone di input per un pezzo di Player 1 e 1 neurone per un pezzo di Player 2. In aggiunta a ciò, ho 1 neurone di output che fornisce una valutazione della posizione corrente della scheda. Più alto è il valore di uscita, migliore è la posizione per il Player 1. Più è basso, meglio è per il Player 2.Come codificare una rete neurale artificiale (Tic-tac-toe)?

Ma il mio problema è: come posso codificare quella rete neurale? La mia idea era di usare una matrice [1-18] per i neuroni di input. I valori di questa matrice sono i pesi di input. L'ho camminato attraverso l'array utilizzando un ciclo. Ogni volta che si attiva un neurone, aggiungo il peso al valore di uscita. Quindi il valore di uscita è la somma dei pesi dei neuroni di input attivati:

Output = SUM(ActivatedInputNeurons) 

Pensi che questo è un buon modo di programmazione della rete? Hai idee migliori?

Spero che tu possa aiutarmi. Grazie in anticipo!

+4

Odori come i compiti per me –

+14

@Binary: Solo perché è compito a casa non significa che si tratta di una domanda a cui non si dovrebbe rispondere su StackOverflow. Questo è stato discusso pesantemente sui thread SOFAQ. Potrebbe essere necessario prendere ulteriori precauzioni dal fornire una soluzione di puro codice che può essere presa e consegnata, ma è comunque possibile rispondere guidando l'OP lungo il percorso corretto. – TheTXI

+3

@Binary Worrier: No, non è compito. Non ho scienze informatiche a scuola. : p – caw

risposta

14

Bene, si dispone di uno strato di input di 18 neuroni e uno strato di uscita di 1 neurone. Va bene. Tuttavia, è necessario fornire alla rete neurale l'opportunità di mettere in relazione gli input. Per questo, hai bisogno di almeno un livello intermedio. Proporrei di utilizzare 9 neuroni nello strato intermedio. Ognuno di questi dovrebbe essere collegato a ciascun neurone di input e il neurone di uscita dovrebbe essere collegato a ciascun intermedio. Ogni connessione di questo tipo ha un peso e ogni neurone ha un livello di attivazione.

Quindi, si passa attraverso tutti i neuroni, uno strato alla volta. Il livello di input è appena attivato con lo stato della scheda. Per tutti gli altri neuroni, si passa attraverso tutte le sue rispettive connessioni e si sommano il prodotto del livello di attivazione del neurone connesso e il peso della connessione. Infine, si calcola il livello di attivazione applicando una funzione sigmoid su questa somma.

Questo è il principio di funzionamento. Ora, devi allenare questa rete per ottenere risultati migliori. Ci sono diversi algoritmi per questo, dovrai fare un po 'di googling e leggere. Infine, potresti voler regolare il numero di neuroni e livelli quando i risultati non diventano abbastanza convincenti. Ad esempio, puoi ridurre il livello di input a 9 neuroni e attivarli con +1 per X e -1 per O. Forse aggiungere un altro livello intermedio produce risultati migliori o aumenta il numero di neuroni di un livello.

0

Questo è un eccellente progetto di avvio per la codifica AI, ma arrivare a una soluzione completa sarà una grande risposta per SO.

Come con la maggior parte dei software, consiglio di utilizzare un design orientato agli oggetti. Ad esempio: definire una classe Neuron con input, pesi e una funzione di output. Quindi, crea alcuni di questi oggetti Neuron per creare la tua rete.

Vedere l'articolo di Wikipedia su artificial neural networks per un buon punto di partenza.

Buona fortuna con il codice! Sembra molto divertente.

0

Dopo aver aggiunto i pesi, è necessario normalizzare la somma utilizzando una funzione, in genere le persone utilizzano TANH se si desidera consentire numeri negativi.

edit:

Here is a java multilayer perceptron implementazione che ho lavorato su un paio di anni fa. questo è stato usato per le pedine, ma con meno input puoi usarlo anche per le pedine.

Inoltre, è necessario capire probabilmente un modo per insegnare a vincere, ma questo è un altro problema

+0

Qualche possibilità che tu possa aggiornare il link?Sembra non andare dove ora. –

+0

non posso aggiornare il mio link, ho cancellato da tempo i repository. D'altra parte, ci sono un sacco di implementazioni disponibili. questo mi sembra decente: http://code.google.com/p/digitrecog/source/browse/trunk/src/backproped/JavaMLP.java?spec=svn44&r=44 – mkoryak

0

Non è una risposta diretta alla tua domanda, ma si dovrebbe avere uno sguardo al seguente quadro/strumento : SNNS o la sua controparte Java JavaNNS. Sono abbastanza sicuro che lì troverai una risposta alla tua domanda.

+0

Grazie! Entrambi sembrano essere ottimi collegamenti. Sfortunatamente, non ho né C++ né Java. Ho solo Delphi/Pascal. – caw

+0

Dovresti essere in grado di trovare esempi su come sono fatte le cose. Infine, vuoi imparare o fare smthg con ANNs, quindi la lingua è secondaria, non è vero? – paweloque

3

Penso che dovresti implementare un 'tradizionale' feed-forward ANN utilizzando le funzioni di trasferimento, in quanto ti permette di addestrarlo usando la propagazione del dorso. Il codice per questi di solito finisce per essere un paio di righe di codice, qualcosa di simile:

SetupInputs(); 
for (l = 1 .. layers.count) 
    for (i = 0 .. layers[l].count) 
     sum = 0 
     for (j = 0 .. layers[l-1].count) 
      sum += layers[l-1][j] * weights[l-1][j] 
     layers[l][i] = TransferFunction(sum) 
+0

Grazie mille. Ma quello sarebbe un codice per reti neurali multistrato, no? – caw

+0

Sì. Non sarai in grado di calcolare un punteggio utilizzabile con solo un perceptron (singolo strato). Ho fatto lo stesso problema all'università, e non ho potuto addestrare nemmeno una rete multistrato su tic-tac-toe usando la propagazione del dorso. – FryGuy

5

non particolarmente capisco come si aspetta di ottenere una sintesi della situazione a bordo di un neurone di uscita. Voglio più guardare avente:

I I I    O O O 
    I I I  x  O O O 
    I I I    O O O 
9 input neurons 9 output neurons 

in una rete completamente connessa, cioè 81 pesi.Quindi addestrare i neuroni di uscita per la relativa desiderabilità di giocare in quella posizione.

+1

Bit di follow-up: penso che tu possa usare 9 neuroni input invece di 18 perché puoi usare 0 per "non occupato", 1 per "auto occupato" e -1 per "avversario occupato". – chaos

+0

Solo 9 ingressi .... forse. Usando alcuni neuroni nascosti, saresti sicuramente in grado di estrarre le informazioni necessarie. Altrimenti, un campo non occupato sarà trattato come la media di sé occupata e occupata dall'avversario, il che suona piuttosto sbagliato. Nondimeno, per un gioco così banale può essere abbastanza buono. – maaartinus

0

Potrai risparmiare tempo se si utilizza libreria di rete neurale come FANN o Neuroph.

Un modo per codificare l'input è di 9 neuroni di input. Anche l'output è buono per essere 9 neuroni. Quello che non vedo negli altri replay è la dimensione del livello nascosto. Suppongo che userete MLP con i tradizionali 3 strati. La dimensione dello strato nascosto è sempre misteriosa. Proverò 10 neuroni nascosti.

Se la funzione di trasferimento è del sigma è possibile codificare in ingresso come segue:

0.0 - Lettore O.

1.0 - X player.

0,5 - Vuoto.

L'output di ANN sarà 9 numeri reali. In questo caso alcune delle celle saranno già occupate. È possibile cercare il valore di uscita più alto che corrisponde a una cella vuota.

Problemi correlati