Shield chess engine


Questa pagina ha una gerarchia - Pagina madre:Programmazione

Home Forum Programmazione Shield chess engine

Questo argomento contiene 22 risposte, ha 5 partecipanti, ed è stato aggiornato da  sasachess 6 giorni, 3 ore fa.

Stai vedendo 15 articoli - dal 1 a 15 (di 23 totali)
  • Autore
    Articoli
  • #9460
    Luigi
    Luigi
    Membro

    Ciao a tutti!
    Mi chiamo Luigi Marco Ripamonti e sono l’autore di due engine piuttosto vecchiotti ormai (Tamerlane e Madeleine).
    Volevo solo annunciare che, visto l’approssimarsi del Natale, ho deciso di fare un piccolo regalino al G6: il mio nuovo motore Shield!
    Non è assolutamente nulla di stratosferico per il momento (Madeleine è più forte, e questo la dice lunga!!!) ma si tratta solo di una prima versione dopotutto!!!

    L’unica particolarità è che è stato scritto in D (addio C++!!!) partendo da zero e che si basa su un file di configurazione in cui è possibile modificare praticamente tutti i parametri che possono incidere in qualche modo su come Shield ricerca o valuta una posizione (ad eccezione del valore dei pezzi … ci penserò).
    Questi parametri non sono stati assolutamente tarati in nessun modo (fino ad ora!) per cui credo che margini di miglioramento esistano e siano parecchi!
    Chiunque ne abbia voglia e si vuole sbizzarrire un po’ con la configurazione è assolutamente incoraggiato a farlo (e per favore, fatemelo sapere se riuscite a trovare dei miglioramenti, in modo tale che provvederò ad includerli nelle prossime versioni).

    Chiunque fosse interessato, può scaricare l’engine UCI dal seguente indirizzo: https://sites.google.com/site/shieldchessengine/

    Ciao e grazie!
    Luigi

    #9461
    stegemma
    stegemma
    Moderatore

    Auguri allora per il nuovo nato!

    Domanda ovvia: “perché in D”? Immagino la risposta: “perché lo conosco bene!” 😉

    #9462
    Luigi
    Luigi
    Membro

    Per diversi motivi:
    E’ già un po’ di anni che lo seguo e volevo mettermi alla prova a scrivere qualcosa di “serio” con quel linguaggio.
    Tutto sommato è molto simile al C/C++ ma ha alcune features che trovo utili:

    • unittest: mi ha facilitato molto la scrittura ed il test delle modifiche ad esempio del generatore di mosse
    • templates: credo che nessun altro linguaggio al momento abbia una gestione dei template così evoluta
    • CTFE (compile time function execution): anche se alla fine l’ho utilizzata solamente per l’inizializzazione di alcune strutture dati, nulla mi vieta in futuro di trovarne qualche altro utilizzo 🙂
    • versioning del codice: mi permette di gestire diverse “versioni” del programma pur condividendo gran parte del codice sorgente.

    Insomma, nulla tutto sommato che non esista anche in C++ o in altri linguaggi, ma personalmente preferisco la sintassi del D a quella del C++ 🙂
    Siccome poi le performance sono paragonabili … mi sono detto, perché no?

    #9463
    Luigi
    Luigi
    Membro

    ….
    ….
    ….

    E poi se non erro Madeleine è stato il primo motore UCI italiano, mi sembrava giusto che Shield fosse il primo scritto in D 🙂

    #9464

    sasachess
    Partecipante

    Complimenti Luigi! Lo proverò appena avrò un ritaglio di tempo. 😉

    #9470
    stegemma
    stegemma
    Moderatore

    Per diversi motivi:
    E’ già un po’ di anni che lo seguo e volevo mettermi alla prova a scrivere qualcosa di “serio” con quel linguaggio.
    Tutto sommato è molto simile al C/C++ ma ha alcune features che trovo utili:

    • unittest: mi ha facilitato molto la scrittura ed il test delle modifiche ad esempio del generatore di mosse
    • templates: credo che nessun altro linguaggio al momento abbia una gestione dei template così evoluta
    • CTFE (compile time function execution): anche se alla fine l’ho utilizzata solamente per l’inizializzazione di alcune strutture dati, nulla mi vieta in futuro di trovarne qualche altro utilizzo :-)
    • versioning del codice: mi permette di gestire diverse “versioni” del programma pur condividendo gran parte del codice sorgente.

    Insomma, nulla tutto sommato che non esista anche in C++ o in altri linguaggi, ma personalmente preferisco la sintassi del D a quella del C++ :-)
    Siccome poi le performance sono paragonabili … mi sono detto, perché no?

    Sì, non c’è nulla di male 😉 ma mi sembra che i vantaggi elencati siano più legati all’IDE che al linguaggio in sé. C’è chi critica l’uso del C++ invece del C e perfino chi critica l’uso del C invece dell’assembly… per cui comunque uno faccia, sbaglia sempre!

    Quando ancora non sapevo programmare ma mi interessavo di elettronica, avevo disegnato un processore per generare le mosse, usando le porte logiche (mai realizzato); oggi vorrei farlo con una FPGA e questo sarebbe il livello più basso possibile:

    porte logiche -> FPGA -> assembly -> C -> C++
    -> D
    -> pascal/delphi
    -> ADA
    -> lisp
    -> basic/VB
    -> COBOL
    -> PHP
    -> JAVA
    -> ho dimenticato qualcuno? 😉

    #9502
    Luigi
    Luigi
    Membro

    Ciao a tutti!

    Volevo solo fare sapere che, a brevissimo tempo dalla prima release di Shield, oggi ho pubblicato la versione 1.1.
    Non ci sono novità particolari per quanto riguarda la “forza” di gioco ma solo qualche piccola aggiunta in valutazione (che non dovrebbe avere comunque troppe influenze).
    Più che altro, l’ho rilasciata per fissare un bacherozzo sulla lettura dei parametri di configurazione di tipo array che era alla base di alcune allegre passeggiate del Re in apertura e soprattutto perché da questa versione Shield dispone di un proprio libro di aperture (così magari potrà partecipare in un futuro a qualche bel torneo e classificarsi primo … a classifica invertita!!!).
    E’ inoltre anche possibile procedere alla generazione di un proprio libro di aperture (lanciate Shield –help per maggiori dettagli).
    Inoltre, lanciandolo con il parametro –showbook, è possibile visualizzare il contenuto del libro di aperture (questo serviva più che altro a me per sapere che cosa avevo creato, ma male non fa comunque :-)).

    Chi fosse interessato, può scaricare il pacchetto dal solito sito: http://sites.google.com/site/shieldchessengine/

    CIAO!

    #9530
    Luigi
    Luigi
    Membro

    Ciao Stefano,
    mi avevi chiesto “perché in D”?
    Beh, ho appena finito di scrivere una funzione che mi genera il file di configurazione di Shield, e credo che sia un buon esempio di cosa puoi fare in D, in modo tutto sommato semplice … Certo, la stessa cosa si può fare in mille altri modi, ma questo mi piace di più! :-).

    Sto incominciando a giocare con il tuning e quindi sto scrivendo tutta una serie di utility/classi che mi risulteranno utili.
    Tra le altre cose, volevo avere la possibilità, man mano che il tuning “gira”, di salvare alcuni dei diversi file di configurazione relativi ai valori “calibrati” … ed inoltre mi ero un poco rotto di dover, ogni volta che volevo aggiungere/modificare un valore nel file di configurazione, modificare il file config, quindi la classe che lo gestisce etc …
    Per cui ho scritto questo pezzo di codice che mi permette di modificare unicamente la classe Configuration del mio programma: la scrittura del file config (inclusi commenti etc…) viene “a gratis” semplicemente chiamando il metodo flush …
    Magari è un esempio stupido (e sicuramente non penso di essermi spiegato benissimo), ma trovo comunque interessante che con il metodo flush aggiunto, posso cancellare, aggiungere, modificare tutti i valori che voglio senza più dovermi ricordare di aggiornare anche il relativo file di configurazione…

    La mia classe Configuration è qualche cosa del tipo:

    
    module chess.configuration;
    
    import std.algorithm;
    import std.string;
    import std.conv;
    
    import chess;
    
    private {
    	struct ConfigComment_t {
    		string text;
    	}
    }
    
    class Configuration_t {
    ...
    ...
    
    	@ConfigComment_t(r"Questo è un commento che finirà nel file di configurazione per la variabile BookRandomChoice")
    	int BookRandomChoice;
    
    	@ConfigComment_t(r"Questo è un altro commento che finirà nel file di configurazione per la variabile BookScoreValue")
    	int BookScoreValue;
    
    ...
    ...
    
    	final void flush(string filename) {
    		auto output = File(filename, "w");
    		scope(exit) output.close;
    
    		import std.traits;
    
    		void outputValue(string m)() {
    			static if(isArray!(typeof(mixin(m)))) {
    				foreach(i, v; mixin(m)) {
    					output.writef("%s", v);
    					if(i != mixin(m ~ ".length") - 1) output.write(",");
    				}
    				output.writeln;
    			}
    			else output.writefln("%s", mixin(m));
    		}
    
    		foreach(m; FieldNameTuple!Configuration_t) {
    			static if(!isAssociativeArray!(typeof(mixin(m)))) {
    				foreach(a; __traits(getAttributes, mixin(m))) output.writeln(a.text);
    
    				// Default
    				output.writef("# DEFAULT: ");
    				outputValue!m;
    
    				// Value
    				output.writef("%s = ", m);
    				outputValue!m;
    
    				output.writeln;
    			}
    		}
    	}
    

    Sostanzialmente, per ogni valore che ho all’interno del file Shield.config ho una corrispondente variabile (con lo stesso nome!!) a cui ho associato un attributo custom (ricordo che in D è tutto fatto staticamente a compile-time, non c’è reflection dinamica a run-time, ma solo a compile-time) dove vi ho inserito quello che deve essere stampato sul file di configurazione (ed inoltre mi funziona anche da “documentazione” del codice).
    Il metodo flush, sostanzialmente cicla su tutti i campi della classe (che per pigrizia ho messo pubblici, ma potevo tranquillamente avere dei getters e setters) e per ognuno cerca se ho definito dei commenti (mediante attributo) … Se sì, li va a scrivere su file, dopodiché procede a scrivere su file il relativo campo con il relativo valore (gestendo in modo molto semplice il fatto se si tratti di un campo di tipo array o meno).

    E’ un esempio semplice ma credo che riesca a fare capire le potenzialità del linguaggio, soprattutto quando si va ad usare la reflection-statica e i template (che in D sono veramente potenti!).
    Certo, non consiglierei a nessuno in questo momento di usare il D per progetti “veri” a causa di alcune mancanze dal punto di vista del supporto/tool/debugging (anche se, rispetto a qualche anno fa, si sono fatti molti passi avanti) … ma per progetti “custom” lo ritengo uno dei linguaggi più “divertenti” con cui avere a che fare (molto più di Java con cui mi tocca averci a che fare 8 ore al giorno!!!).

    Ciao.

    #9531
    stegemma
    stegemma
    Moderatore

    Problemi simili li risolvo con una classe “collection”, che non è altro che un array a cui si può accedere con una chiave stringa. In questo modo, l’accesso al file di configurazione ed il sorgente sono due cose distinte e risulta immediato aggiungere parametri. Un’alternativa è l’XML, che sto rivalutando solo perché è ormai uno standard (ovviamente ho una mia classa per gestire file XML).

    La possibilità di accedere a proprietà dei membri di una classe è interessante ma può comunque essere ottenuta con un “preprocessore” ad hoc. Io ne ho scritto uno, ad esempio, che si legge l’header di una classe e da esso crea l’header ed il codice di un’altra classe, “remotizzando” la prima. Una cosa del tipo:

    
    class pippo
    {
       public:
         virtual int f();
    };
    

    che genera circa questo:

    
    class pluto
    {
       pippo p;
       virtual int f();
    };
    
    int pluto::f()
    {
       return p.f();
    }
    

    Questo per risolvere problemi di ereditarietà multipla del Pascal di Delphi, su cui sono basate le librerie VCL… che uso in C++. L’idea è che il preprocessore si legga il sorgente di “pippo”, lo divida nelle varie sezioni e scriva la classe pluto. Nel tuo caso, un semplice programma potrebbe estrarre dal sorgente le proprietà dei parametri e generarti il config, anche senza usare il D.

    Ovviamente è più divertente farlo in D se ti piace il D ma non mi sembra che questo esempio dica molto, sulle proprietà del linguaggio.

    #9532
    Luigi
    Luigi
    Membro

    Beh, volevo semplicemente fare vedere alcune cose che si possono fare … non ho mai detto che quello che ho fatto non si possa fare in altri linguaggi, anzi 🙂

    Anche perché, a parità di “tipologia” linguaggio (statico/dinamico/reflection etc …) qualunque cosa fai con uno la puoi fare tranquillamente con gli altri (salvo casi particolarmente eccezionali) … tanto alla fine arrivi sempre al codice macchina che è sempre lo stesso x tutti, ed è quindi il denominatore/limite comune 🙂
    Alla fine, per tutti i linguaggi C-Like, è una questione di preferenze personali: se si preferisce scrivere 2 righe piuttosto che 10, se si preferisce usare puntatori a funzioni tipo C piuttosto che lambdas etc …
    La differenza tra un linguaggio ed un altro è semplicemente nei costrutti che ti vengono dati per implementare le stesse identiche cose: un linguaggio magari ti mette già a disposizione dei costrutti per ottenere un certo scopo, con un altro non li hai, ma con una libreria che ti puoi scrivere (o è già disponibile) puoi arrivare a fare le stesse cose.

    La cosa importante è: “divertirsi” nello scrivere codice !! 🙂

    ciao

    #9821
    Luigi
    Luigi
    Membro

    Ciao a tutti!

    Solo per dire che ho rilasciato la versione 1.2 di Shield.
    Non contiene novità particolari rispetto alla 1.1 se non:
    – pondering
    – un primo abbozzo di king safety (ben poco testato :-))
    – qualche miglioria sulla conoscenza di alcuni tipi di finale

    Più che altro, si tratta di una versione dove ho provato a sperimentare il tuning automatico dei parametri con una mia funzione (inclusa in Shield, attivabile tramite parametro di compilazione), anche in base ad alcune indicazioni fornite nei test scorsi.
    Non saprei dire quanto sia più forte/più debole rispetto alla 1.1 … diciamo che i risultati sono un poco contrastanti: ad esempio, contro la 1.1 è sempre risultata migliore, mentre contro altri avversari i risultati non mi sembravano molto differenti rispetto a quelli che otteneva la 1.1 (un poco migliori, ma non così tanto).

    Comunque sia, avevo necessità di rilasciarla più che altro perché volevo avere la libertà di dedicarmi ad alcune “migliorie” che potrebbero richiedere tempo e parecchie modifiche al codice esistente … speriamo ne valga la pena 🙂

    Chi fosse interessato, può scaricare il pacchetto dal solito sito: http://sites.google.com/site/shieldchessengine/

    CIAO!

    #10288
    Luigi
    Luigi
    Membro

    Ciao a tutti!
    Dopo parecchio tempo è arrivato il momento di rilasciare la versione 1.3 di Shield.

    Confesso di non aver avuto molto tempo da dedicarci ed in effetti non ci sono novità particolari in questa versione.
    Comunque sia, le modifiche introdotte sono le seguenti:
    – Eliminato il “tipo pezzo che muove” dalle mosse generate. Questo ha portato ad un notevole incremento dei nps, senza inconvenienti particolari (o quasi!).
    – Eliminate le PST (ad eccezione di quelle per il Re)
    – Siccome lo scopo principale di Shield è costruire un motore “configurabile”, ho aggiunto per quasi tutti i parametri di valutazione l’equivalente da utilizzare in fase di finale partita (anche se per alcuni ha poco senso). Anche il valore dei pezzi ad esempio può ora essere configurato per il finale (ovvero è possibile dare un valore differente ad un pezzo tra mediogioco e finale).
    – Ho aggiunto un parametro “MaterialIncidence” che può essere utilizzato per aumentare o diminuire l’importanza della valutazione materiale dei pezzi all’interno della funzione di valutazione…. Si si si …. lo so che si poteva ottenere la stessa cosa modificando semplicemente il valor dei pezzi, ma così è più veloce 🙂
    – Ho rivisto un attimo la parte di Histpry Heuristic (anche se non dovrebbe incidere granchè).

    Come forza di gioco mi sembra essere un po’ meglio della 1.2 (anche se non ho avuto tempo di fare delle prove approfondite).
    Devo dire che mi sembra essere migliorato soprattutto quando ho tolto le PST e aggiunto il parametro “MaterialIncidence” (segno probabilmente che i valori dei diversi parametri sono tutto sommato abbastanza randomici :-)).

    Per chi fosse interessato, il link è il solito: http://sites.google.com/site/shieldchessengine/

    Ciao

    #10289

    sasachess
    Partecipante

    Ottimo, lo proverò presto! 😉

    #11428
    Luigi
    Luigi
    Membro

    Ciao a tutti.
    Dopo quasi un anno – e con pochissimo tempo avuto a disposizione per lavorarci – mi trovo a rilasciare la versione 2.0 di Shield.
    Si tratta di una riscrittura completa, è un nuovo engine, dalla rappresentazione della scacchiera, funzione valutazione, ricerca … tutto!
    Credo che le linee di codice derivanti dal vecchio Shield 1.x si possano davvero contare sulle dita di una mano 🙂

    Non si tratta ancora di un lavoro completo perché ho tante idee ancora da provare e anche solo perdere un po’ di tempo nel tuning di valutazione e ricerca non sarebbe male!
    Comunque i primi test sembrano incoraggianti.

    Le novità principali sono:
    – supporto per i libri di apertura Polyglot (il vecchio formato di Shield non è più supportato al momento).
    – ricerca multi-thread fino a 16 cores (probabilmente non molto efficiente … ma fa figo lo stesso!).
    – Non è più supportato il file di configurazione con tutti i vari parametri (eventualmente lo aggiungerò in seguito dopo avere stabilizzato il tutto un poco).

    Chi fosse interessato può trovare l’engine al solito indirizzo: http://sites.google.com/site/shieldchessengine/

    #11430
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Grande Luigi,

    l’ho messo in test per il primo dicembre.
    Senti, hai qualche preferenza sul book da usare? Nel senso… che book polyglot abbino al tuo engine? Te ne sei fatto uno tu?

    LL

Stai vedendo 15 articoli - dal 1 a 15 (di 23 totali)

Devi essere loggato per rispondere a questa discussione.

© 2017 G 6 Tutti i diritti riservati - Buon divertimento!

By continuing to use the site, you agree to the use of cookies. more information

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi