Domanda

Voglio programmare un motore di scacchi, che impara a fare buone mosse e vincere contro gli altri giocatori. Ho già codificato una rappresentazione della scacchiera e una funzione che restituisce tutte le possibili mosse. Così ho bisogno solo una funzione di valutazione che dice quanto è buono una data situazione del consiglio di amministrazione è. Pertanto, desidero utilizzare una rete neurale artificiale che dovrebbero poi valutare una data posizione. L'output dovrebbe essere un valore numerico. Più alto è il valore, migliore è la posizione per il giocatore bianco.

Il mio approccio è quello di costruire una rete di 385 neuroni: Ci sono sei pezzi degli scacchi unici e 64 campi sulla scheda. Così, per ogni campo prendiamo 6 neuroni (1 per ogni pezzo). Se c'è un pezzo bianco, il valore di ingresso è 1. Se c'è un pezzo nero, il valore è -1. E se non c'è pezzo di quel genere su quel campo, il valore è 0. In aggiunta a ciò ci dovrebbe essere 1 neurone per il giocatore di muoversi. Se è il turno di Bianco, il valore di ingresso è 1 e se è il turno di nero, il valore è -1.

Credo che la configurazione della rete neurale è abbastanza buona. Ma la parte principale manca: Come posso implementare questa rete neurale in un linguaggio di codifica (ad esempio Delphi)? Credo che i pesi per ogni neurone dovrebbero essere gli stessi in principio. A seconda del risultato di una partita, i pesi devono essere regolati. Ma come? Penso che dovrei lasciare che i giocatori 2 per computer (sia utilizzando il mio motore) giocare uno contro l'altro. Se vince Bianco, nero ottiene il feedback che i suoi pesi non sono buone.

Quindi sarebbe bello se si potesse aiutarmi a realizzare la rete neurale in un linguaggio di codifica (migliore sarebbe Delphi, altrimenti pseudo-codice). Grazie in anticipo!

È stato utile?

Soluzione

Ci sono stato, fatto. Poiché non v'è continuità nel vostro problema (il valore di una posizione che non è strettamente legato ad un altra posizione con solo 1 modifica del valore di un ingresso), c'è ben poche possibilità di una NN avrebbe funzionato. E non ha mai fatto nei miei esperimenti.

avrei preferito vedere un sistema di ricottura simulata con un'euristica ad-hoc (di cui ci sono molti là fuori) per valutare il valore della posizione ...

Tuttavia, se si sono impostati utilizzando un NN, è relativamente facile da rappresentare. Una NN generale è semplicemente un grafico, con ciascun nodo essendo un neurone. Ciascun neurone ha un valore di corrente di attivazione, e una formula transizione per calcolare il valore di attivazione successivo, sulla base di valori di ingresso, cioè valori di attivazione di tutti i nodi che hanno un collegamento ad esso.

A più classico NN, cioè con uno strato di input, uno strato di output, neuroni identiche per ciascuno strato, e nessun tempo-dipendenza, può quindi essere rappresentato da una serie di nodi di ingresso, una serie di nodi di uscita, e grafico collegata di nodi di collegamento quelli. Ogni nodo possiede un valore di attivazione corrente, e una lista di nodi inoltra al. Calcolare il valore di uscita è semplicemente impostando le attivazioni dei neuroni di ingresso ai valori di ingresso, e l'iterazione attraverso ogni strato successivo, a sua volta, calcolare i valori di attivazione dallo strato precedente utilizzando la formula di transizione. Una volta raggiunto l'ultimo strato (output), si ha il risultato.

Altri suggerimenti

Nel caso in cui qualcuno scopre casualmente questa pagina. Dato quello che sappiamo ora, ciò che l'OP si propone è quasi certamente possibile. In realtà siamo riusciti a farlo per un gioco con molto più grande spazio di stato - Go ( https://deepmind.com/alpha -go ).

Non vedo il motivo per cui non si può avere una rete neurale per un valutatore statico se anche fare un po 'mini-max lookahead classico con potatura alfa-beta. Un sacco di motori di scacchi utilizzano minimax con un valutatore statica braindead che aggiunge solo i pezzi o qualcosa del genere; non importa tanto se avete abbastanza livelli di Minimax. Non so quanto di un miglioramento della rete renderebbe ma c'è poco da perdere. La formazione sarebbe difficile però. Io suggerirei di usare un motore che guarda avanti molte mosse (e prende carichi di CPU, ecc) per addestrare il valutatore per un motore che guarda avanti minor numero di mosse. In questo modo si finisce con un motore che non prende più CPU (si spera).

Quello che è necessario formare un ANN è o qualcosa di simile backpropagation apprendimento o una qualche forma di un genetica algoritmo . Ma gli scacchi sono un gioco così complesso che è unlikly che un semplice ANN imparerà a giocare -. Ancora di più se il processo di apprendimento è supervisionato

Inoltre, la sua domanda non dice nulla circa il numero di strati. Si desidera utilizzare 385 neuroni di input per codificare la situazione attuale. Ma come si vuole decidere cosa fare? Su neurone per campo? Più alta vince eccitazione? Ma v'è spesso più di una possibile mossa.

Inoltre avrete bisogno di diversi strati nascosti -. Le funzioni che possono essere rappresentati con un ingresso e uno strato di uscita senza strato nascosto sono davvero limitati

Quindi non voglio impedire di provarlo, ma le probabilità per un implemenation e formazione di successo all'interno di dire un'anno o poco più di un praticamente pari a zero.

Ho cercato di costruire e formare un'ANN di giocare Tic-tac-toe quando avevo 16 anni o giù di lì ... e ho fallito. Vorrei suggerire di provare un gioco così semplice prima.

Il problema principale che vedo qui è uno di formazione. Tu dici che vuoi il tuo ANN per prendere la posizione attuale Consiglio e valutare quanto è buono per un giocatore. (Presumo si prenderà ogni possibile mossa per un giocatore, applicarla allo stato attuale consiglio, valutare attraverso l'ANN e poi prendere quello con la più alta produzione - vale a dire: hill climbing)

Le opzioni come li vedo sono:

  • sviluppare una certa funzione euristica per valutare lo stato di bordo e addestrare la rete che fuori. Ma che pone la questione del perché utilizzare un'ANN a tutti, quando si potrebbe utilizzare il vostro euristica.

  • Con un po 'di misura statistica come "Quante partite sono state vinte da bianco o nero da questa configurazione a bordo?", Che darebbe un valore di fitness tra bianco o nero. La difficoltà con che è la quantità di dati di allenamento necessari per la dimensione dello spazio di problema.

Con la seconda opzione si può sempre nutrire bordo sequenze dai giochi grandmaster e la speranza c'è abbastanza copertura per l'ANN per sviluppare una soluzione.

A causa della complessità del problema che vorrei lanciare la più grande rete (vale a dire: un sacco di nodi interni). Ad esso come ho potuto, senza rallentare la formazione troppo

E 'possibile, ma non banale con qualsiasi mezzo.

https://erikbern.com/2014/11/ 29 / deep-learning-for-scacchi /

Per addestrare il suo funzione di valutazione, ha utilizzato un sacco di potenza di calcolo per farlo.

Per riassumere in generale, si potrebbe andare a questo proposito come segue. La vostra funzione di valutazione è un NN feedforward. Lasciare che i calcoli di matrice portano ad un'uscita scalare valutando quanto bene il movimento è. Il vettore di ingresso per la rete è stato scheda rappresentato da tutti i pezzi sulla scacchiera così dire pedina bianca è 1, cavaliere bianco è 2 ... e lo spazio vuoto è 0. Un ingresso vettore di stato esempio bordo è semplicemente una sequenza di 0 di -12. Questa valutazione può essere addestrato utilizzando giochi grandmaster (disponibili a un database fics per esempio) per molti giochi, riducendo al minimo la perdita tra ciò che i parametri attuali dicono che è la valutazione più alta e quello che si muovono i grandi maestri realizzati (che dovrebbero avere la valutazione più alta). Ciò ovviamente presuppone che le mosse grandmaster sono corretti e ottimali.

Siamo venuti qui per dire quello che ha detto Silas. Utilizzando un algoritmo minimax, si può aspettare di essere in grado di guardare avanti N mosse. Utilizzando potatura alfa-beta, è possibile espandere che a teoricamente 2 * N si muove, ma più realisticamente 3 * N / 4 mosse. Le reti neurali sono davvero appropriato qui.

Forse se un algoritmo genetico potrebbe essere utilizzato.

Il vostro algoritmo di ingresso è suono - tutte le posizioni, tutti i pezzi, e entrambi i giocatori sono contabilizzati. Potrebbe essere necessario un livello di ingresso per ogni stato passato del tabellone, in modo che gli eventi passati sono utilizzati come input di nuovo.

Lo strato di output dovrebbe (in qualche forma) che invia il pezzo da muovere, e la posizione per spostarsi.

Scrivi un algoritmo genetico utilizzando un connettoma che contiene tutti i pesi dei neuroni e sinapsi punti di forza, e iniziare a molteplici piscine geni separati da un gran numero di connettoma in ciascuno.

farli giocare l'un l'altro, mantenere la migliore manciata, di crossover e mutano i migliori connettoma per ripopolare la piscina.

Leggi blondie24: http: // www. amazon.co.uk/Blondie24-Playing-Kaufmann-Artificial-Intelligence/dp/1558607838 .

Si tratta di pedine al posto degli scacchi ma i principi sono gli stessi.

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