Quale paradigma di programmazione pensi che funzionerebbe meglio per l'aspetto IA di un motore di scacchi?

1

Desidero scrivere una IA di scacchi che simuli il modo in cui penso sulla lavagna, usando C ++. Il mio obiettivo è scrivere gli algoritmi per scegliere le mosse (prendere decisioni), non definire la scacchiera ei pezzi. A mia conoscenza, la maggior parte dei programmi di scacchi scritti fino ad oggi sono focalizzati sull'utilizzo dei poteri di calcolo del computer (alias metodo della forza bruta). Il mio programma sarà diverso in quanto il focus sarà sull'emulazione del pensiero umano (in questo caso il mio modo di pensare che è in realtà altamente organizzato).

Sono relativamente nuovo alla programmazione. Qualche consiglio che potresti darmi su quali argomenti leggere, quali paradigmi di programmazione usare, eventuali insidie di cui ho bisogno di essere a conoscenza in anticipo, o qualsiasi altra cosa pensi che dovrei sapere sarebbe utile per me.

Il mio istinto è che la codifica, per la maggior parte, non trarrà beneficio dal paradigma OOP. Concetti come la valutazione posizionale, il riconoscimento di schemi, la valutazione di pro e contro di varie mosse, sapere quando interrompere la ricerca (potatura), definire obiettivi e trovare mezzi per raggiungerli, non assomigliano naturalmente agli oggetti ... o no? La mia ipotesi è che la programmazione procedurale (semplicemente fornendo al computer una serie di istruzioni, un algoritmo per le mosse di prelievo) o forse la programmazione funzionale (FP) sarebbe più rilevante in questo caso? Fammi sapere cosa ne pensi, grazie.

Devo aggiungere che sto cercando di rendere il programma più strong possibile, un'altra ragione per cui sospetto che l'OOP potrebbe non essere l'approccio migliore.

Un'altra domanda che mi riguarda: considerando come l'obiettivo del programma è replicare il processo di pensiero umano, dovrò ricominciare da capo o vale la pena prendere un altro programma come base?

    
posta Seeking_Truth 10.06.2017 - 21:49
fonte

5 risposte

11

I wish to write a chess AI which simulates the way I think over the board, using C++.

Impressionante!

My focus is on writing the algorithms for choosing moves (decision making), not defining the board and pieces.

Er, eh?

To my knowledge, most chess programs written to date are focused on taking advantage of the computer's calculating powers

Ebbene sì, anche se alcuni sono focalizzati su animazioni cutesy.

(aka brute force method).

Erm no, forza bruta significherebbe che il computer ti costringerebbe a sederti e giocare sempre a una partita possibile finché il sole non consumasse la terra.

My program will be different in that the focus is going to be on emulating human thinking (in this case my own way of thinking which is actually highly organized).

Ogni pezzo di software scritto da umani finisce per emulare il pensiero umano. È l'hardware che non può tenere il passo.

I am relatively new to programming. Any advice you could give me on what topics to read, what programming paradigm(s) to use, any potential pitfalls I need to be aware of beforehand, or anything else you think I should know would be useful to me.

Leggi tutto. Impara tutto La maggior parte delle insidie provengono dai tuoi stessi punti ciechi. Sono relativamente vecchio alla programmazione (letto da decenni) e sto ancora comprando libri da leggere.

My gut feeling is that the coding will, for the most part, not benefit from OOP paradigm. Concepts such as positional evaluation, pattern recognition, weighing out pros and cons of various moves, knowing when to stop the search(pruning), defining goals and finding means to reach them, don't naturally resemble objects...or do they?

Gli oggetti modellano più delle cose del mondo reale. Sono idee. Alcuni oggetti sono raccolte di stringhe. Che cosa del mondo reale fa un modello hashset ? So che alcuni insegnano ancora in questo modo, ma un oggetto può modellare più delle cose che puoi vedere e toccare.

My guess is that procedural programming (simply providing the computer with a set of instructions, an algorithm for picking moves), or perhaps functional programming (FP) would be more relevant in this case? Let me know what you think, thank you.

La programmazione procedurale è semplice. Inizia dall'inizio, procedi nel mezzo, quando arrivi alla fine, fermati. Un bel modello semplice. Sfortunatamente è molto più facile scrivere che leggere e persino più difficile da cambiare. Ma se stai scrivendo qualcosa di piccolo è un big bang per il dollaro.

La programmazione funzionale riguarda molte cose, ma soprattutto si tratta di essere formali riguardo ai compiti. Non è grande nemmeno per gli effetti collaterali, ma soprattutto lo odia quando si usa = con noncuranza.

Ho vinto un torneo di scacchi usando OOP funzionale (sì, entrambi insieme) contro un'intera classe. Eravamo liberi di usare qualsiasi paradigma che ci piacesse. Alcuni degli studenti più intelligenti sono andati per l'ultra ottimizzato usando bit board e libri di apertura. Non ho usato nulla di quello.

Il mio programma ha vinto, ma non principalmente a causa del mio paradigma. Ho vinto perché l'ho provato a morte . La maggior parte dei miei avversari ha perso le mosse illegali. Altri non potevano fare a meno di andare avanti nel tempo. L'altro programma che aveva persino una possibilità contro la mia aveva fatto la stessa scelta fatidica che avevo fatto. Ero conservatore con la mia profondità.

Abbiamo avuto 4 lunghi angosciosamente secondi per fare una mossa. La maggior parte non ha potuto esplorare oltre le 4 mosse. Quelli che non potevano farlo in modo affidabile e farebbero mosse stupide perché hanno smesso di guardare quando il tempo è scaduto.

Ho potato la mia ricerca di profondità fino a dove non c'era una possibile posizione della tavola che mi avrebbe fermato a metà ricerca. La gente rideva quando vedeva quanto velocemente la mia IA si muoveva. Hanno smesso di ridere quando ho iniziato a vincere.

Perché era così importante? Beh, non è stato perché i 3,5 secondi che non ho usato non avrebbero potuto essere utili. Potrebbe avere. Ma si sarebbe intromesso nella migliore delle cose che ho fatto. Ho provato MOLTO.

Nonostante abbiamo presentato solo dll, ho scritto la mia GUI che mi mostrava ogni possibile mossa per qualsiasi pezzo in qualsiasi posizione. Anche posizioni fuori bordo. Ho imparato a tenerlo sotto controllo nel modo più difficile. La mia unica perdita è stata quando una pedina che stavo per promuovere alla regina si è confusa al settimo grado e ha pensato che potesse muovere di due passi. Ho perso quando si è mosso dal tabellone. Non l'ho visto nei test. Ho bisogno di una GUI migliore.

Quindi quando dici che vuoi concentrarti sulla mente umana, io sono con te. Voglio solo consigliarti questo: Test. Perché al computer non importa cosa pensi. Fa solo quello che gli dici.

Potrei dirti di più ma ti collegherò solo alle mie precedenti battute di scacchi:

Soluzione di scacchi OOP pulita

Immutabilità e amp; scacchi

    
risposta data 11.06.2017 - 00:16
fonte
4

To my knowledge, most chess programs written to date are focused on taking advantage of the computer's calculating powers (aka brute force method). My program will be different in that the focus is going to be on emulating human thinking (in this case my own way of thinking which is actually highly organized).

Ci sono un bel po ' di possibili giochi di scacchi (10 ^ 120 - l'universo ha solo circa 10 ^ 80 atomi ) quindi è abbastanza poco pratico provare tutte le soluzioni (questo è ciò che significa backtracking).

Al contrario, la maggior parte delle soluzioni sono ispirate al pensiero umano. Un algoritmo abbastanza comune è noto come Minimax . Sono solo un giocatore di scacchi occasionale, ma per molti giochi, sembra che gli umani considerino più mosse possibili e provino a prevedere nella loro mente quale sarebbe la reazione dell'avversario su tale mossa (sostanzialmente continuando il gioco per alcune mosse nella loro capo). Minimax fa la stessa cosa: analizza le possibili mosse, ne sceglie una in modo tale che la mossa migliore dell'avversario crei il minimo vantaggio per lui. L'unica differenza è che mentre gli umani sono piuttosto limitati nel numero di mosse che possono prendere in considerazione (probabilmente sono più intelligenti nel scegliere quelli da considerare), i computer possono analizzare quasi ogni mossa e considerare ciò che l'avversario può fare. p>

Per gli scacchi, questo è ancora piuttosto complicato e ci sono modi (come potatura alfa beta ) per saltare alcune mosse.

Deep blue ha battuto Kasparov, considerato al momento per essere il migliore giocatore di scacchi. Ci sono molte risorse sul web su come funziona, ma un algoritmo Minimax è al centro, insieme a molte intelligenti ottimizzazioni e al potere di calcolo.

Per quanto riguarda il paradigma da scegliere, questa è più una scelta su come raggiungere la destinazione piuttosto che scegliere la destinazione effettiva. Gli algoritmi sono (di solito) paradigm agnostici. Esistono paradigmi diversi perché i programmatori possono sfruttarli per essere in grado di sviluppare e mantenere più facilmente il software. Tutti i paradigmi hanno, con la tesi di Church-Turing, le stesse capacità computazionali.

    
risposta data 11.06.2017 - 00:34
fonte
0

I paradigmi sono fatti per le persone, non per i problemi - i problemi non gli interessano (e i computer si preoccupano ancora meno). La compilazione e l'esecuzione rimuovono il tuo programma di oggetti, funzioni, variabili, moduli, classi, ecc. Lasciando solo gli elettroni in movimento su una fetta di silicio.

Se dici cose come "sapere quando smettere di cercare" e "definire obiettivi" - e se non hai molta esperienza con la programmazione, scegli un linguaggio OO / imperativo / multipurpose tradizionale e noioso: Python o Java (a seconda se ti piace il completamento del codice o meno).

Con un'idea come la tua - è quasi certo che nei prossimi due anni fallirai molte volte e probabilmente riscriveresti comunque in un'altra lingua.

    
risposta data 10.06.2017 - 22:31
fonte
0

Considera Tecniche di apprendimento del rinforzo , come TD (lambda) o Monte Carlo per trovare uno spostamento ottimale (azione) in base all'attuale configurazione della scheda (stato).

RL è una branca dell'apprendimento automatico, che tenta di imitare il pensiero umano, usando punizioni / premi di decisioni precedenti come driver per prendere decisioni future. Dove un agente tiene traccia di ciò che è chiamato funzioni di valore, per prevedere la punizione / ricompensa prevista di un certo stato, data una certa azione.

In questo caso non inizierei con C ++ , a causa della necessità di molti algebra lineare e calcolo a più variabili

Provare a prototipare una soluzione in python , R , Matlab o Octave , quindi portarla su C ++ aiutato da alcune librerie di algebra lineare come Eigen3 per implementare la matematica di una qualsiasi gli algoritmi identificati

    
risposta data 21.08.2017 - 22:26
fonte
0

Per semplificare l'IA degli scacchi nella sua forma base, valuti tutte le possibili mosse che hai in questo turno per determinare se quella particolare mossa ti lascia in una forma migliore o peggiore. Prendi quindi la mossa che è la migliore.

Il trucco sta nel quantificare la "bontà" o "cattiveria" della mossa. Il sito IBM su Deep Blue fornisce alcune informazioni sulla funzione di valutazione: link

(FYI - Ricevo un avvertimento SSL in questo momento quando visito quel sito)

Secondo quel sito, quantificano le mosse in base a materiale, posizione, sicurezza del Re e tempo.

Successivamente si trasforma in un compito di applicare questa valutazione più e più volte. Supponiamo che tu abbia 10 mosse possibili, per ognuna di queste mosse valuti quanto ti lascia e poi valuti tutte le mosse che il tuo avversario avrà una volta che avremo fatto quella mossa. Stai cercando la mossa che puoi fare che ti lascerà nella posizione migliore lasciando l'avversario nel peggiore dei casi.

Successivamente si trasforma in ciò non solo per la prossima mossa, ma anche per la mossa successiva e, successivamente, per la profondità delle risorse di calcolo che possono andare nel tempo concesso.

Non penso che esista un paradigma di programmazione che si adatti meglio o peggiore di altri. Ovviamente hai bisogno di efficienza, e se c ++ fornisce che meglio di qualsiasi altro linguaggio di programmazione moderno è più di un dibattito religioso.

Tornando alla metodologia AI, gli scacchi sono tipicamente divisi in apertura, medio e finale. Personalmente penso che l'IA degli scacchi dovrebbe sapere in che punto è il ciclo di vita del gioco e la logica dovrebbe essere diversa. Le persone hanno studiato l'apertura degli scacchi per secoli, quindi nel gioco di apertura basta usare le aperture. Allo stesso modo con il gioco finale.

Sarebbe interessante adottare un approccio moderno e provare a costruire un sistema distribuito che collabora a sfornare l'analisi.

Va notato che questa non è una vera IA, ed è solo un algoritmo decisionale. La vera intelligenza artificiale sarebbe il programma in esecuzione con l'algoritmo di valutazione come punto di partenza, e mentre gioca dopo partita è in grado di modificare il proprio algoritmo. Se il computer perde quando il proprio algoritmo mostra le sue scelte di movimento, dovrebbe essere stato superiore, quindi analizzare dove è andato storto e modificarsi.

link

    
risposta data 22.08.2017 - 00:01
fonte

Leggi altre domande sui tag