Domanda

Voglio giocare Tic-tac-toe con una rete neurale artificiale. La mia configurazione per la rete è la seguente: Per ciascuna delle 9 campi, uso 2 neurone ingresso. Così ho 18 neuroni di input, naturalmente. Per ogni campo, ho 1 neurone ingresso per un pezzo di Giocatore 1 e 1 neurone del pezzo di giocatore 2. In aggiunta a ciò, ho 1 uscita neurone che fornisce una valutazione della posizione della corrente. Più alto è il valore di uscita è, migliore è la posizione per il giocatore 1. Più basso è, meglio è rivolto Player 2.

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

Output = SUM(ActivatedInputNeurons)

Queste è un buon modo di programmazione della rete? Hai un'idea migliore?

Spero che mi può aiutare. Grazie in anticipo!

È stato utile?

Soluzione

Bene, si dispone di un livello di ingresso di 18 neuroni, e uno strato di uscita di 1 neurone. Va bene. Tuttavia, è necessario dare la vostra rete neurale l'opportunità di mettere gli ingressi in rapporto. Per questo, è necessario almeno uno strato intermedio. Proporrei di utilizzare 9 neuroni nello strato intermedio. Ognuno di questi deve essere collegato ad ogni neurone ingresso, e il neurone di uscita deve essere collegato a ciascun intermedio. Ogni tale collegamento ha un peso, e ogni neurone ha un livello di attivazione.

Poi, si passa attraverso tutti i neuroni, uno strato alla volta. Lo strato ingresso viene attivato solo con lo stato scheda. Per tutti gli altri neuroni, si passa attraverso tutti i relativi collegamenti e somma sul prodotto del livello di attivazione del neurone collegato e il peso della connessione. Infine, si calcola il livello di attivazione mediante l'applicazione di una funzione sigmoide su questa somma.

Questo è il principio di funzionamento. Ora, è necessario formare questa rete per ottenere risultati migliori. Ci sono diversi algoritmi per questo, si dovrà fare un po 'googling e la lettura. Infine, si potrebbe desiderare di regolare il numero di neuroni e strati quando i risultati non ottengono convincente abbastanza veloce. Ad esempio, è possibile ridurre il livello di input a 9 neuroni e attivarli con +1 per una X e -1 per un O. Forse aggiungendo un altro strato intermedio produce risultati migliori, o aumentando il numero di neuroni di uno strato.

Altri suggerimenti

Non particolarmente capisco come si aspetta di ottenere una sintesi della situazione a bordo di un neurone di uscita. Vorrei più guardare avere:

    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. Poi formare i neuroni di output per la relativa opportunità di giocare in quella posizione.

Date un'occhiata al mio progetto Tic. Ho risolto questo problema sia con reti neurali e algoritmi genetici. Il codice sorgente è liberamente disponibile.

http://www.roncemer.com / tic-tac-toe-an-esperimento-in-di apprendimento automatico

Credo che si dovrebbe attuare una 'tradizionale' feed-forward ANN utilizzando le funzioni di trasferimento, voi come che permette di allenarsi utilizzando back-propagazione. 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)

Si tratta di un progetto di avviamento eccellente per la codifica AI, ma arrivare a una soluzione completa sarà modo di grande di una risposta per SO.

Come con la maggior parte dei software, mi consiglia di utilizzare una progettazione orientata agli oggetti. Ad esempio: Definire una classe Neuron che ha ingressi, pesi, e una funzione di uscita. Quindi, creare molti di questi oggetti Neuron al fine di costruire la vostra rete.

Si veda l'articolo di Wikipedia su reti neurali artificiali per un buon punto di partenza.

Buona fortuna con il codice! Suona come un sacco di divertimento.

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 non vi troverete una risposta alla tua domanda.

Dopo aver aggiunto i pesi, è necessario normalizzare la somma utilizzando una funzione, la gente di solito usa TANH, se si desidera consentire i numeri negativi.

modifica

Ecco implementazione di un java Perceptron a più strati che ho lavorato su un paio di anni fa. questo è stato usato per pedine, ma con meno ingressi è possibile utilizzarlo per pedine troppo.

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

Si farà risparmiare tempo se si utilizza libreria di rete neurale come FANN o Neuroph.

Un modo per codificare l'input è di 9 neuroni di input. L'uscita è buono per essere 9 neuroni. Quello che non vedo in altri replay è la dimensione dello strato nascosto. Suppongo che si intende utilizzare MLP con le tradizionali 3 strati. La dimensione dello strato nascosto è sempre mistero. Vorrei provare 10 neuroni nascosti.

Se la funzione di trasferimento è del sigma è possibile codificare in ingresso nel seguente modo:

0.0 -. Giocatore O

1.0 -. X giocatore

0.5 -. Vuoto

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

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