Luigi

Risposte al Forum Create

Stai vedendo 15 articoli - dal 1 a 15 (di 15 totali)
  • Autore
    Articoli
  • in risposta a: Shield chess engine #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/

    in risposta a: Shield chess engine #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

    in risposta a: Shield chess engine #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!

    in risposta a: Alcuni risultati con LazySMP #9815
    Luigi
    Luigi
    Membro

    Così, giusto ad intuito, il fatto di prendere il risultato solo dal thread principale, piuttosto che di considerare buono quello del primo thread che finisce, nella pratica non penso che possa portare a grandi differenze.
    Il vantaggio del 2° approccio è solo quello di iniziare l’iterazione successiva prima – non appena un thread termina – mentre il 1° attende in ogni caso l’esito del primo thread (che potrebbe essere il primo a terminare – e non ci sarebbero differenze – oppure l’ultimo) …
    Tenendo in considerazione inoltre che generalmente i thread vengono lanciati a profondità X e X+1, i tempi di terminazione tra uno e l’altro (considerando inoltre tutto il guadagno che si ha con il riempimento della Hash), credo che siano – sempre nella pratica – trascurabili.

    Credo che affinché il 1° approccio sia sempre necessariamente peggiore del 2° sia imputabile solamente …. alla sfiga 🙂

    Chiaramente, il tutto detto da uno che non ha mai implementato (né ci ha mai provato) un algoritmo PVS multithread!! 🙂 … ma sono abbastanza fiducioso del mio intuito, a meno che la sfiga sopra menzionata non ci voglia mettere lo zampino!!!!

    Ciao

    Luigi

    in risposta a: History Heuristic #9814
    Luigi
    Luigi
    Membro

    Grazie,
    anche io ordino le mosse con:
    1. hash.
    2. Catture con See >= 0 (ordinate in base al guadagno)
    3. Killer 1
    4. Killer 2
    5. Contromossa
    3. Catture con See < 0 (in 1.1 questa viene dopo il punto 4. Con la versione corrente l’ho spostata prima).
    4. Mosse “quiete”

    … però la domanda era più del tipo: “volendo rimuovere la History Heuristc” – che conta solo le mosse quiete – in base a quale criterio si potrebbero ordinare le mosse quiete per selezionare prima le più promettenti?”.
    Se tolgo la HH – che serve per darmi appunto un minimo criterio di “bontà” su una mossa – non vedo molti altri criteri che possono essere utili per un ordinamento di queste mosse …
    Insomma, per le catture c’è sempre l’See che può essere utilizzato, ma per le quiete?

    Io ho provato con diverse possibilità:
    – see mossa – in modo da dare un valore negativo alle mosse che mettono in cattura pezzi per nulla – ma mi risulta essere troppo pesante.
    – tipo di pezzo che muove (ha poco senso di per sé).
    – tabella[a] – tabella[da] (usando le stesse della valutazione) …
    – Nessun ordinamento (nell’ordine in cui vengono generate …)

    Però, nessuna di queste alternative era molto soddisfacente …
    Va beh, mi sa che le conserverò per un bel po’ 🙂

    Luigi

    in risposta a: gogobello says hello world! #9813
    Luigi
    Luigi
    Membro

    Ottimo! Complimenti.
    Shield freme per un match!

    Anche io mi sono messo in testa l’idea di provarci con il multithreading …
    Non sarà la 1.2 di Shield (che credo rilascerò a brevissimo, giusto per “frizzare” alcuni cambiamenti e rendermi libero di “buttare in aria tutto” in preparazione del MT) … ma speriamo sia la 1.3 …

    Anche se questa storia del MT so già che mi causerà più di un mal di testa 🙂

    Ciao!

    in risposta a: History Heuristic #9799
    Luigi
    Luigi
    Membro

    OK,
    ma allora come ordinate le mosse?
    Io sostanzialmente faccio più o meno una cosa del genere (tenendo presente che genero le mosse a step):
    – Promozioni: Valore promozione – Valore pedone + see(from, to)
    – Catture: see(from, to)
    – Arrocco corto e lungo: valori fissi
    – Mosse quiete: history(pezzo, to)

    Se non si utilizza l’history (o simili), in base a che cosa si può ordinare le mosse quiete? Nulla? Così come sono generate?
    Io ho provato a togliere l’history ma ho visto solo peggioramenti: il vantaggio in velocità non era tantissimo, ma il numero di nodi ricercati, a parità di profondità era nettamente superiore …

    in risposta a: IGWT III EDITION #9605
    Luigi
    Luigi
    Membro

    In ritardo ma comunque complimenti a Chiron!!!
    E’ davvero una gran bella “bestia” 🙂

    Paura!!!!

    in risposta a: Commento su png #9602
    Luigi
    Luigi
    Membro

    Se non si trattasse di una partita tra due engines, oserei dire che il bianco è dotato di un gran perfido senso dell’umorismo 🙂
    Mi sembra molto una mossa da “sfottò” 🙂

    Difficile dire … di certo, in quella posizione praticamente ogni mossa porta ad un matto più o meno lungo … magari analizzando per prima quella mossa Rybka ha trovato un matto in X e si è semplicemente limitato ad eseguirla senza considerare il resto … Mah.

    Di certo, io se fossi stato il nero mi sarei arrabbiato 🙂

    in risposta a: Arena 3.5.1 #9600
    Luigi
    Luigi
    Membro

    Ciao,
    anche io ho trovato alcuni problemi con Arena 3.5.1 per quanto riguarda il ponder (magari si tratta della tua stessa condizione, o forse no …).
    Siccome ho implementato il ponder in Shield, nel testarlo mi sono accorto di parecchie partite perse per il tempo … mi sono accorto che ricadevano tutte nella stessa situazione: alla seconda ripetizione di posizione, praticamente alla mossa prima della triplice ripetizione con patta, semplicemente Arena smette di spedire comandi all’engine, che quindi resta in attesa fino a quando il suo tempo non scade e Arena assegna la vittoria all’avversario!!!
    Prima ho pensato di avere fatto male qualche cosa ma poi ho visto che succede anche con altri engine (ad esempio Senpaj) … attivando la finestra di log engine si vede proprio che Arena non spedisce più nulla e segnala il seguente “errore”

    engine.StartCalc:DOUBLE ENGINE START CALC AVOIDED!—yy

    GG

    in risposta a: Shield chess engine #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

    in risposta a: Shield chess engine #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.

    in risposta a: Shield chess engine #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!

    in risposta a: Shield chess engine #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 🙂

    in risposta a: Shield chess engine #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?

Stai vedendo 15 articoli - dal 1 a 15 (di 15 totali)
© 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