Satana steps


Questa pagina ha una gerarchia - Pagina madre:Programmazione

Home Forum Programmazione Satana steps

Questo argomento contiene 243 risposte, ha 6 partecipanti, ed è stato aggiornato da stegemma stegemma 10 mesi, 3 settimane fa.

Stai vedendo 15 articoli - dal 196 a 210 (di 244 totali)
  • Autore
    Articoli
  • #9888
    stegemma
    stegemma
    Moderatore

    Ed ecco il log del torneo multi-thread, con 4 partite contemporanee:

    Primo satana-tourney multi-thread

    Filtrando la colonna “game” si può vedere il log di ogni singola partita. Se si lascia senza filtri, si vede come vengono giocate in contemporanea fino a 4 partite. Il 4 è ovviamente un parametro nell’xml di configurazione.

    Come ho detto, lanciando più comandi \tourney dalla console di satana, si può anche eseguire lo stesso torneo più volte, sempre contemporaneamente e in modo asincrono (anche se non credo che abbia molto senso farlo). Ha più senso lanciare più tornei con diversi controlli del tempo oppure avere più partite in contemporanea di un unico torneo. Ad esempio, si possono lanciare un torneo a 5 minuti ed uno a 15, ciascuno con 4 partite in contemporanea, per un totale di 8 core impegnati.

    Sembra anche stabile… basta non interromperlo 😉

    Manca ancora il salvataggio del pgn ma non ci vorrà molto…

    #9898
    stegemma
    stegemma
    Moderatore

    Ho rilasciato Satana 2.3.18 con la modalità torneo:

    Satana 2.3.18 “tourney”

    Il programma è ovviamente funzionante anche come motore, in cui ho attivato la transposition table e la quiescenza.

    #9919
    stegemma
    stegemma
    Moderatore

    Ho modificato la quiescenza e migliorato (negli ultimi giorni) la gestione dei tornei. Ora sto implementando il salvataggio dei risultati in XML. L’idea è di rendere Satana adatto all’automazione del tuning dei parametri (o di ogni altra cosa), sia essa genetica, neurale o con altro sistema. Immaginate di poter creare un programma che faccia più o meno così:

    
    inizia ciclo
      lancia un torneo
      attendi la fine del torneo
      leggi i risultati
      ...algoritmo genetico, rete neurale...
      aggiorna i parametri
    ripeti ciclo
    

    il vostro engine dovrebbe solo, all’inizio, fare questo:

    
    carica parametri
    

    In questo modo, si avrebbe l’automazione completa del ciclo di “tuning” dell’engine. Siccome Satana usa un XML per la configurazione del torneo, il programma che lo chiama può impostarlo come vuole, ad esempio scegliendo i motori contro cui fare il tuning, in base alla fase del tuning stesso. Nel caso di algoritmi genetici o reti neurali, spesso si usa infatti una popolazione di tuning ed una di verifica, per evitare che l’algoritmo “ricordi” invece di “imparare”. En passant, questo è il limite maggiore del NeuroLearning di Neurone (per come penso sia realizzato), che funziona ottimamente contro Satana ma non contro motori più forti.

    Siccome vorrei che il lavoro fatto su Satana-tourney servisse ai membri del G6, se avete suggerimenti o richieste particolari, per poterlo implementare ed usare effettivamente: scrivete!

    #9931
    stegemma
    stegemma
    Moderatore

    Ho provato l’ultima versione di Pedone e, stranamente, si pianta con satana-tourney ma non con Arena. Non è satana che si pianta ma proprio Pedone_w64. Allego il log (anche se non dice molto) per capire cos’è che sbaglio:

    
    -	new match: 'satana.2.4.19' vs 'pedone'
    W	waiting for 'satana.2.4.19' initialization...
    W	--->	xboard
    W	--->	protover 2
    W	--->	new
    W	--->	post
    B	waiting for 'pedone' initialization...
    B	--->	uci
    B	<---	id name Pedone 1.4.1
    B	<---	id author Fabio Gobbato
    B	<---	option name Hash type spin default 256 min 1 max 1048576
    B	<---	option name Ponder type check default true
    B	<---	option name DrawScore type spin default 0 min -500 max 500
    B	<---	option name OwnBook type check default false
    B	<---	option name BookFile type string default ./book.bin
    B	<---	option name BookRandom type check default false
    B	<---	option name Strength type spin default 100 min 1 max 100
    B	<---	option name Threads type spin default 1 min 1 max 64
    B	<---	option name SyzygyPath type string default <empty>
    B	<---	option name SyzygyProbeLimit type spin default 6 min 0 max 6
    B	<---	uciok
    B	--->	ucinewgame
    W	--->	time 1500
    W	--->	otim 1500
    W	--->	go
    W	<---	# I awakened the soul of 
    W	<---	# filling hash
    W	<---	# TT 2097152 entries - 128 MiB
    W	<---	# Satana 2.4.19 (c) 2012-2016 Stefano Gemma
    W	<---	# zlib (c) 1995-2011 Mark Adler
    W	<---	# xorshift (c) George Marsaglia
    W	<---	# TT 2097152 entries - 128 MiB
    W	<---	feature ping=1 setboard=1 done=1 san=0 usermove=1 time=1 draw=1 sigint=0 sigterm=0 reuse=1 analyze=0 myname="Satana 2.4.19" colors=0 ics=1 name=1 nps=0 debug=1 memory=1 smp=1
    W	--->	ping 1
    W	<---	# TT 2097152 entries - 128 MiB
    W	<---	# moves 1/0 - time 373/15000 ms
    W	<---	6 6  38 287762 Pa2-a4
    W	<---	# 397 ms 724 Knps, TT hits: 28244 9.82%
    W	<---	move a2a4
    W	move a2a4
    B	--->	position startpos moves a2a4 
    B	--->	go wtime 14693 btime 15000 winc 100 binc 100
    B	<---	info depth 1 time 0 nodes 30 nps 30000 tbhits 0 score cp 187 pv b1c3 
    B	<---	info depth 2 time 0 nodes 120 nps 120000 tbhits 0 score cp 139 pv e2e3 b7b5 
    B	<---	info depth 3 time 0 nodes 306 nps 306000 tbhits 0 score cp 221 pv e2e3 b7b5 d1h5 
    B	<---	info depth 4 time 0 nodes 1122 nps 1122000 tbhits 0 score cp 139 pv g2g4 b7b5 h2h4 c8b7 
    B	<---	info depth 5 time 0 nodes 2218 nps 2218000 tbhits 0 score cp 156 pv g2g4 d7d5 e2e3 d8d7 d1f3 d7g4 f3d5 
    B	pedone forfeits on time (15001>15000)
    -	'satana.2.4.19' result 2 score 4
    -	'pedone' result 0 score 0
    W	--->	quit
    B	--->	quit
    

    L’interfaccia segnala “forfeit” solo perché non ho ancora messo l’intercettazione della terminazione prematura dell’engine esterno (pedone). In questa fase, sembra che l’interfaccia non faccia altro che ricevere “info”, per cui non capisco cosa possa essere.

    Ho provato sia con due partite contemporanee che con una sola ed ottengo sempre lo stesso risultato. Non ho provato altre versioni di Pedone (ma con Arena va… quindi non è un problema di pocnt disponibile o meno, che poi sull’i7 c’è).

    PS: la stessa sessione, se lanciata da console, non fa piantare Pedone:

    
    uci
    id name Pedone 1.4.1
    id author Fabio Gobbato
    option name Hash type spin default 256 min 1 max 1048576
    option name Ponder type check default true
    option name DrawScore type spin default 0 min -500 max 500
    option name OwnBook type check default false
    option name BookFile type string default ./book.bin
    option name BookRandom type check default false
    option name Strength type spin default 100 min 1 max 100
    option name Threads type spin default 1 min 1 max 64
    option name SyzygyPath type string default <empty>
    option name SyzygyProbeLimit type spin default 6 min 0 max 6
    uciok
    ucinewgame
    position startpos moves a2a4
    go wtime 14693 btime 15000 winc 100 binc 100
    info depth 1 time 0 nodes 25 nps 25000 tbhits 0 score cp 45 pv g8f6
    info depth 2 time 1 nodes 86 nps 43000 tbhits 0 score cp 5 pv g8f6 g1f3
    info depth 3 time 1 nodes 181 nps 90500 tbhits 0 score cp 44 pv g8f6 g1f3 b8c6
    info depth 4 time 2 nodes 459 nps 153000 tbhits 0 score cp 8 pv g8f6 g1f3 b8c6 b1c3
    info depth 5 time 3 nodes 762 nps 190500 tbhits 0 score cp 39 pv g8f6 g1f3 b8c6 b1c3 e7e6
    info depth 6 time 5 nodes 3232 nps 538666 tbhits 0 score cp 8 pv g8f6 g1f3 b8c6 b1c3 e7e6 d2d4
    info depth 7 time 6 nodes 4776 nps 682285 tbhits 0 score cp 31 pv g8f6 g1f3 b8c6 b1c3 e7e6 d2d3 f8b4
    info depth 8 time 8 nodes 8228 nps 914222 tbhits 0 score cp 26 pv g8f6 g1f3 b8c6 b1c3 d7d5 e2e3 d5d4 e3d4 c6d4
    info depth 9 time 10 nodes 11445 nps 1040454 tbhits 0 score cp 26 pv g8f6 g1f3 b8c6 b1c3 d7d5 e2e3 d5d4 e3d4 c6d4
    info depth 10 time 15 nodes 21172 nps 1323250 tbhits 0 score cp 20 pv g8f6 g1f3 b8c6 b1c3 d7d5 e2e3 e7e5 d2d4 e5e4 f3e5
    info depth 11 time 46 nodes 58474 nps 1244127 tbhits 0 score cp 30 pv g8f6 g1f3 e7e6 b1c3 d7d5 e2e3 b8c6 f1b5 f8d6 b5c6 b7c6 d2d4
    info depth 12 time 87 nodes 120508 nps 1369409 tbhits 0 score cp 22 pv g8f6 g1f3 e7e6 b1c3 d7d5 e2e3 b8c6 f1b5 f8d6 e1g1 a7a6 b5c6 b7c6
    info depth 13 time 104 nodes 159702 nps 1520971 tbhits 0 score cp 27 pv g8f6 g1f3 e7e6 b1c3 d7d5 e2e3 b8c6 f1b5 f8d6 b5c6 b7c6 e1g1 e8g8 d2d4
    info depth 14 time 210 nodes 389081 nps 1843985 tbhits 0 score cp 21 pv g8f6 g1f3 c7c5 e2e3 b8c6 b2b3 d7d5 c1b2 c8f5 f1e2 e7e6 e1g1 f8d6 b1c3
    info depth 15 time 325 nodes 672503 nps 2062892 tbhits 0 score cp 25 pv g8f6 g1f3 c7c5 b2b3 b8c6 c1b2 d7d5 e2e3 e7e6 b1a3 f8e7 f1d3 e8g8 e1g1 f6e4
    info depth 16 time 638 nodes 1394966 nps 2183045 tbhits 0 score cp 19 pv g8f6 g1f3 e7e6 e2e3 d7d5 d2d4 f8d6 b1c3 e8g8 f1d3 b8c6 e1g1 e6e5 d4e5 c6e5 f3e5 d6e5
    bestmove g8f6 ponder g1f3
    

    Credo che ci sia qualche problema di buffering sull’output di Pedone, quando satana-tourney cerca di leggerlo. Forse si verifica una qualche forma di “interferenza” o di concorrenza tra scrittura di Pedone sullo std::out e lettura dalla pipe da parte di satana-tourney, come se satana bloccasse la scrittura o chissà che…

    #9950
    stegemma
    stegemma
    Moderatore

    Forse ho trovato il problema principale delle Transposition Tables: c’erano delle chiavi coincidenti tra posizioni niente meno che di colori diversi! Calcolavo la hash facendo un banale xor del colore, che vale da 0 a 1. Ora sono passato a questa semplice formula, che sembrerebbe essere più affidabile:

    
    inline uint64_t GetHash() { return boHash ^ boAllPieces ^ -boCastlings ^ -(boEnpPawn ^ color); }
    

    L’xor con “all pieces” risolve parecchi problemi ma ancora non ci siamo…

    #9961
    stegemma
    stegemma
    Moderatore

    Ed ecco un finale “incredibile” di LarsenVB-Satana:

    #9998
    stegemma
    stegemma
    Moderatore

    Come ho scritto su talkchess, sto provando un’idea molto semplice: salvare la configurazione dei pedoni direttamente nel nodo corrente, così da non doverla rivalutare, se non cambia. Di fatto, per tutte le mosse che non coinvolgono pedoni non è necessario chiedersi ogni volta se ce n’è uno doppiato/passato ecc., almeno nel nodo corrente. Questa “cosa” ha un’alta percentuale di successi (di “hit”), che supera normalmente il 50%, aumenta in posizioni chiuse (i normali medio-gioco) ma arriva fino ad oltre il 90%, nei finali con pochi pedoni (dove le mosse dei pezzi sono in misura nettamente superiore, come numero). Ovviamente senza pedoni si è al 100%.

    Intendo migliorare questa tecnica, usando, ad esempio, uno stack di posizioni dei pedoni, invece di salvarle nel nodo corrente ed estendendola ad altri parametri. Lo so che esistono già le hash pedonali ma calcolare il valore hash ha comunque un costo. mentre questa “cosa” viene quasi gratis ed è semplicissima da implementare.

    #10037
    stegemma
    stegemma
    Moderatore

    Disattivando le TT e la QS, con una piccola modifica all’ordine di generazione delle mosse, Satana è tornato ad essere Satana, in questo mini-torneo gauntlet a 15 minuti:

    
    1	68	0	0	-	        [(|) (|)]       "IN MOTO L'OROLOGIO DEL BIANCO!"
    1	80	0	0	-	_________________________
    1	991793	1	1	-	result	1-0	resign	satana.2.4.19	neurone	C:\Ligs\Satana\gauntlet.15m.026.T1.R0.G1.pgn
    1	1472988	1	2	-	result	1-0	mate	satana.2.4.19	larsenvb	C:\Ligs\Satana\gauntlet.15m.026.T1.R0.G2.pgn
    1	1554709	1	5	-	result	0-1	resign	neurone	satana.2.4.19	C:\Ligs\Satana\gauntlet.15m.026.T1.R0.G5.pgn
    1	1557746	1	4	-	result	1/2-1/2	triple repetition	satana.2.4.19	satana.2.1.14	C:\Ligs\Satana\gauntlet.15m.026.T1.R0.G4.pgn
    1	1675672	1	3	-	result	1-0	forfeit	satana.2.4.19	piranha	C:\Ligs\Satana\gauntlet.15m.026.T1.R0.G3.pgn
    1	2817020	1	8	-	result	1/2-1/2	triple repetition	satana.2.1.14	satana.2.4.19	C:\Ligs\Satana\gauntlet.15m.026.T1.R0.G8.pgn
    1	2839164	1	7	-	result	1-0	mate	piranha	satana.2.4.19	C:\Ligs\Satana\gauntlet.15m.026.T1.R0.G7.pgn
    1	2919769	1	6	-	result	1-0	mate	larsenvb	satana.2.4.19	C:\Ligs\Satana\gauntlet.15m.026.T1.R0.G6.pgn
    1	2920793	1	0	-	----------------- tournament has finished
    1	2920796	1	0	-	satana.2.4.19: 10
    1	2920798	1	0	-	neurone: 0
    1	2920801	1	0	-	larsenvb: 2
    1	2920803	1	0	-	piranha: 2
    1	2920805	1	0	-	satana.2.1.14: 2
    1	2920808	1	0	-	-----------------
    
    #10039
    stegemma
    stegemma
    Moderatore

    La beta di Satana.2.4.19 è qui:

    Satana 2.4.19 beta

    Ha sicuramente un problema nella nuova micro-cache della struttura pedonale, perché tende a farsi impedonare, ma la gestione dei tornei è migliorata, rispetto al 2.3.18.

    #10040
    stegemma
    stegemma
    Moderatore

    Ed ora Satana sa dare matto di Re Cavallo e Alfiere contro Re solo ed anche Re e due Alfieri contro Re!

    #10042
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Ed ora Satana sa dare matto di Re Cavallo e Alfiere contro Re solo ed anche Re e due Alfieri contro Re!

    Hai un tablebase interna o usi qualche algoritmo particolare per questo?

    Bye!

    LL

    #10043
    stegemma
    stegemma
    Moderatore

    Niente TB e niente algoritmi veri e proprio; semplicemente assegno un peso alle case in cui si trova il Re solo, in modo da spingerlo nell’angolo del colore giusto. In difesa cerca di portarsi verso l’angolo opposto:

    PS: in questa prova, Satana non ha giocato al meglio, come difesa

    #10044
    stegemma
    stegemma
    Moderatore

    Questo è il codice “beta” che gestisce i finali di “re solo”:

    
    	if(boOtherKing == board.boEnemies) // re nemico solo
    	{
    		if(boMyKing == board.boFriends) return 0; // solo i due re
    
    		uint64_t boNoKings = board.boAllPieces ^ board.boKings;
    		uint64_t boFirstPiece = FirstBit(boNoKings);
    		// c'è un solo pezzo oltre ai Re -> ed è un cavallo o un alfiere
    		//if(boNoKings==boFirstPiece && (boNoKings == (board.boKnights | board.boBishops))) return 0;
    		if(((boNoKings ^ boFirstPiece) |  (boNoKings ^ (board.boKnights | board.boBishops)))==boEmpty) return 0;
    		// TODO: alfieri di colore contrario / due cavalli / due alfieri stesso colore
    
    		eval = valKing / 2;
    		if(boOtherKing & (BOARD_BORDER)) eval += valPawn * 2;
    		uint64_t boMyBishops = board.boBishops & board.boFriends;
    		if(boMyBishops & BOARD_WHITE_SQUARES)
    		{
    			if(boOtherKing & BOARD_WHITE_CORNERS) eval += valPawn;
    		} else // if(boMyBishops & BOARD_BLACK_SQUARES) <- senza il test, spinge il re in un angolo anche con la torre
    		{
    			if(boOtherKing & BOARD_BLACK_CORNERS) eval += valPawn;
    		}
    		return eval;
    	} else if(boMyKing == board.boFriends) // re amico solo
    	{
    		uint64_t boNoKings = board.boAllPieces ^ board.boKings;
    		uint64_t boFirstPiece = FirstBit(boNoKings);
    		// c'è un solo pezzo oltre ai Re -> ed è un cavallo o un alfiere
    		//if(boNoKings==boFirstPiece && (boNoKings == (board.boKnights | board.boBishops))) return 0;
    		if(((boNoKings ^ boFirstPiece) | (boNoKings ^ (board.boKnights | board.boBishops))) == boEmpty) return 0;
    		// TODO: alfieri di colore contrario / due cavalli / due alfieri stesso colore
    
    		eval = -valKing / 2;
    		if(boMyKing & (BOARD_BORDER)) eval -= valPawn * 2;
    		uint64_t boOtherBishops = board.boBishops & board.boEnemies;
    		if(boOtherBishops & BOARD_WHITE_SQUARES)
    		{
    			if(boMyKing & BOARD_WHITE_CORNERS) eval -= valPawn;
    		} else // if(boOtherBishops & BOARD_BLACK_SQUARES)
    		{
    			if(boMyKing & BOARD_BLACK_CORNERS) eval -= valPawn;
    		}
    		return eval;
    	}
    

    Messa all’inizio della Eval() (ma richiamabile anche nei nodi intermedi, se si vuole).

    #10045

    marco belli
    Membro

    Ciao stefano, di solito funziona meglio il seguente codice per i finali re cavallo e alfiere contro re:ù
    bonus per se il re nemico si avvicina all’angolo in cui verrà mattato e bonus per re vicini perchè senza il re cavallo e alfiere da soli non mattano 🙂

    ciao e in bocca al lupo

    #10046
    stegemma
    stegemma
    Moderatore

    Sì, ma senza il Re non è possibile spingere il Re nell’angolo, per cui la vicinanza dei Re è una condizione che non è necessario verificare. Anche con solo RC o RA (e l’altro pezzo fermo) non si può mandare il Re nell’angolo, per cui di fatto devono cooperare tutti e tre i pezzi. La funzione comunque è ancora piuttosto “rozza” ma ha funzionato subito… guai a toccarla!!! 🙂

Stai vedendo 15 articoli - dal 196 a 210 (di 244 totali)

Devi essere loggato per rispondere a questa discussione.

© 2018 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