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 6 mesi, 2 settimane fa.

Stai vedendo 15 articoli - dal 211 a 225 (di 244 totali)
  • Autore
    Articoli
  • #10061
    stegemma
    stegemma
    Moderatore

    Togli metti togli metti… finalmente un risultato incoraggiante con TT e QS attivati:

    
    1	0	0	0	-	tourney gauntlet.15m.61
    1	274	0	0	-	engine 1	satana.2.4.19	D:\A\LIGS\workspaces\vs\LIGS\exe\x64\Release\Satana.exe
    1	291	0	0	-	engine 7	neurone	D:\Arena\Engines\Neurone_XXIII\Neurone_XXIII.exe
    1	298	0	0	-	engine 8	larsenvb	D:\Arena\Engines\LarsenVB\LarsenVB.exe
    1	302	0	0	-	engine 10	satana.2.1.14	D:\A\LIGS\workspaces\vs\LIGS\exe\x64\Release\Satana.2.1.14.w64.exe
    1	322	0	0	-	creating games
    1	363	0	0	-	6 games created
    1	365	0	0	-	          -   _
    1	368	0	0	-	        [(|) (|)]       "IN MOTO L'OROLOGIO DEL BIANCO!"
    1	386	0	0	-	_________________________
    1	556711	1	1	-	result	1-0	illegal move	satana.2.4.19	neurone	C:\Ligs\Satana\gauntlet.15m.61.T1.R0.G1.pgn
    1	836699	1	4	-	result	0-1	resign	neurone	satana.2.4.19	C:\Ligs\Satana\gauntlet.15m.61.T1.R0.G4.pgn
    1	858919	1	3	-	result	0-1	mate	satana.2.4.19	satana.2.1.14	C:\Ligs\Satana\gauntlet.15m.61.T1.R0.G3.pgn
    1	1158857	1	2	-	result	1-0	mate	satana.2.4.19	larsenvb	C:\Ligs\Satana\gauntlet.15m.61.T1.R0.G2.pgn
    1	1678207	1	5	-	result	1/2-1/2		larsenvb	satana.2.4.19	C:\Ligs\Satana\gauntlet.15m.61.T1.R0.G5.pgn
    1	1714401	1	6	-	result	1/2-1/2	triple repetition	satana.2.1.14	satana.2.4.19	C:\Ligs\Satana\gauntlet.15m.61.T1.R0.G6.pgn
    1	1715414	1	0	-	----------------- tournament has finished
    1	1715418	1	0	-	satana.2.4.19: 8
    1	1715421	1	0	-	neurone: 0
    1	1715424	1	0	-	larsenvb: 1
    1	1715427	1	0	-	satana.2.1.14: 3
    1	1715430	1	0	-	-----------------
    

    la patta per ripetizione con LVB è altrettanto incoraggiante, vista la posizione:

    [FEN]8/8/6b1/2pk2P1/5K2/8/1B6/8 w – – 32 97[/FEN]

    La vittoria contro LVB invece è netta ma… imbaraXante!!!

    #10166
    stegemma
    stegemma
    Moderatore

    Stasera si lavora al book. L’ho impostato in modo semplice (e non necessariamente efficiente), come un albero binario che contiene la hash delle posizioni ed il numero di vittorie/patte. Lo scopo non è tanto quello di avere un libro “da torneo” ma quanto quello di poter fare test più estesi, visto che col libro posso evitare ceh Satana giochi sempre le stesse mosse.

    Vi farò sapere…

    #10172
    stegemma
    stegemma
    Moderatore

    Dunque: dopo aver lavorato una decina di ore o poco più, Satana ha creato il suo primo libro di aperture. tutto soddisfatto noto che sono circa 800.000 posizioni, in circa 9 Mb di file e che vengono caricate in un attimo. Bene, passo alla ricerca delle mosse nel book e mi accorgo che… è tutto da buttare!!!

    Da pirla, ancor prima di aver finito la ricerca delle mosse mi accorgo che ho usato la hash inizializzata in modo random!!! Mi ritrovo così con un libro di valori hash praticamente casuali! 🙂

    “Riprova, sarai più fortunato!”

    #10187
    stegemma
    stegemma
    Moderatore

    Primo risultato (da verificare) del mega-book di Satana:

    
    \loadbook
    # book d:\satana\satana.sbk loaded with 40400939 positions
    \listbook
    # 26B24248B0B213A7 Ng1-h3 3 1
    # A6F5BE14996CE34B Ng1-f3 141781 105371
    # A9CD43D265BB27C1 Nb1-c3 8670 8386
    # A2D57A5C5D03A1B4 Nb1-a3 ???
    # A65545D9385B5A3B Ph2-h3 2 0
    # A9D5495D9934AFB0 Pg2-g3 4782 3596
    # A6CABC12D080A7CD Pf2-f3 2 0
    # A6CB76195BE75793 Pe2-e3 33 59
    # B6D55CBAA963D796 Pd2-d3 40 32
    # B6CD5B84A78F4849 Pc2-c3 32 32
    # 46D5AEC46E7F602A Pb2-b3 11436 11100
    # E6B53D23459CEBA5 Pa2-a3 ???
    # A9CAD276EA8D1A6F Ph2-h4 ???
    # B64CA25EC4A02E9F Pg2-g4 ???
    # A7D782D77060A1BE Pf2-f4 ???
    # A6A9C39E176723B9 Pe2-e4 6 0
    # B6DC447114838FBB Pd2-d4 2 4
    # 47E3458C69175F84 Pc2-c4 2 0
    # 71314AE631FFC838 Pb2-b4 ???
    # C8ED75B5A8BE4FA1 Pa2-a4 ???
    

    Il primo valore è la hash, gli ultimi due numeri sono i punti ottenuti dal bianco e dal nero (mi sembrano bassini, devo verificarli bene).

    PS: rivedendolo dopo cena, c’è sicuramente un mega-baco nel mega-book; non è possibile che ci siano solo 6 partite con e4!!!!

    #10188
    stegemma
    stegemma
    Moderatore

    Finalmente ho ottenuto dei valori sensati:

    
    \loadbook
    # book D:\satana\satana.sbk loaded with 38537625 positions
    \listbook
    # 26B24248B0B213A7 Ng1-h3 3 1
    # A6F5BE14996CE34B Ng1-f3 141781 105371
    # A9CD43D265BB27C1 Nb1-c3 8670 8386
    # A2D57A5C5D03A1B4 Nb1-a3 ???
    # A65545D9385B5A3B Ph2-h3 2 0
    # A9D5495D9934AFB0 Pg2-g3 4782 3596
    # A6CABC12D080A7CD Pf2-f3 2 0
    # A6CB76195BE75793 Pe2-e3 33 59
    # B6D55CBAA963D796 Pd2-d3 40 32
    # B6CD5B84A78F4849 Pc2-c3 32 32
    # 46D5AEC46E7F602A Pb2-b3 11438 11100
    # E6B53D23459CEBA5 Pa2-a3 ???
    # 9FCA61F1E64C0CF0 Ph2-h4 ???
    # 804C915C8920E580 Pg2-g4 ???
    # 9DD7B0A819627060 Pf2-f4 13996 15814
    # 98A8776C1A9B3E65 Pe2-e4 1271385 1108327
    # 80DCEC6D58853A63 Pd2-d4 686201 550747
    # 9DE3F5BD01E05A54 Pc2-c4 198730 162554
    # 9B31EA80413BAD98 Pb2-b4 3965 4551
    # 9EEDB481C8A96A61 Pa2-a4 ???
    

    I due valori sono sempre i punteggi del bianco e del nero. Ad esempio, per e4: il bianco ha totalizzato 1.271.385 punti contro i 1.108.327 del nero. Le posizioni (non partite) totali sono 38.537.625, estratte dalle prime 40 semi-mosse di una tonnellata di partite. Il libro finale è di circa 376 Mb (zippato 270 Mb) e richiede circa 6 secondi per essere caricato.

    L’unico problema è che caricato in memoria richiede 1,7 Gb di RAM!

    Limitando il book alle posizioni con somma dei punteggi con vari limiti si ottiene:

    
    >100: 66713 posizioni 3 Mb RAM
    >50: 131018 posizioni 5 Mb RAM
    >30: 215860 posizioni 9 Mb RAM
    >20: 321997 posizioni 14 Mb RAM
    >10: 641862 posizioni 28 Mb RAM
    >5: 1687394 posizioni 68 Mb RAM
    >4: 1687394 posizioni 68 Mb RAM
    >3: 4526037 posizioni 203 MB RAM
    >2: 4526037 posizioni 203 MB RAM
    =2: 34006197 posizioni 1,5 Gb RAM
    

    Per 4 e 5 i risultati sono uguali perché la somma dei punteggi è ovviamente un multiplo di 2 (2+0 1+1 0+2).

    Il dato interessante è che la maggior parte delle posizioni sono state raggiunte una sola volta (punteggio =2) e possono perciò essere eliminate. Trattandosi di partite fino a ply 40, di fatto sono già posizioni da medio-gioco, più che d’apertura.

    Ora devo agganciare il book alla ricerca…

    #10189
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    stefano 38.537.625 –> 6 sec (270 mb) in memoria 1.700 mb
    luca 140.000 –> 0,5 sec (3 mb) in memoria 30 mb

    Prove moooolto spannometriche:

    secondi di caricamento:
    140.000:0,5=38.537.625:x
    x=137 sec –> ok

    dimensioni:
    140.000:3=38.537.625:x
    x=825mb –> ok

    occupazione in ram
    140.000:30mb=38.537.625:x
    x=8.258mb –> ok

    Stefano il tuo libro è sicuramente più performante del mio sotto ogni punto di vista, non che il mio sia un riferimento assoluto (anzi), però è già un termine di paragone.

    Io, con soli 30 mb di peso in memoria non mi sono fatto il problema, ma tu, potresti caricare tanti dati in memoria fino ad un tuo limite stabilito, ad esempio: ram totale della macchina \ 2.
    Oppure potresti far 3 libri (ridicolo, normale e cazzuto) lasciando così la scelta all’utente.

    Vedi tu. In qualunque caso ti consiglio di strutturarlo in modo che la manutenibilità del libro sia efficiente, nel senso… togli questa linea, metti questa linea, aumenta punti, diminuisci punti.

    Bye!

    LL

    #10190
    stegemma
    stegemma
    Moderatore

    Per quanto riguarda le performance, non ho ancora ottimizzato nulla. I book >2 e >4 sono i più promettenti, perché contengono linee giocate almeno 2 volte (il resto è probabilmente solo “rumore”).

    In satana ho questi comandi essenziali:

    
    \buildbook pgn_folder plyes
    \mergebooks pgn_folder
    \loadbook file.sbk
    \listbook sbk_folder merge.sbk
    

    Con buildbook, Satana legge tutti i PGN (multi-game, ovviamente) e li converte nel corrispondente .sbk.

    Con mergebooks, vengono “fusi” tutti i file .sbk presenti nella cartella e salvati in un unico file .sbk (quest’ultimo viene escluso, se nella stessa cartella).

    Con loadbook, carica il book indicato.

    Con listbook, Satana mostra l’elenco delle mosse nella posizione corrente ed il valore della corrispondente “entry” nel book caricato.

    Per poter gestire le linee di apertura, si potrebbe al momento aggiungerle come file PGN ma dovrei prevedere un parametro fittizio, per forzarne il peso; qualcosa del tipo:

    [pgn]
    ...
    [wscore="1500"]
    [bscore="1200"]
    ...

    In alternativa, si dovrebbero caricare PGN della linea voluta, con un numero rilevante di partite.

    La struttura del book è comunque banale:

    
    header (con informazioni varie)
    serie di entry:
      wscore (integer x bit)
      bscore (integer x bit)
      hash (integer 64 bit)
      ...
    footer
    

    In memoria, viene caricato in una specie di array dinamico, che è simile alle Collection del VB o agli std::vector del C++. Siccome il file contiene le entry già ordinate per hash, nel caricamento devo solo accodarle. La funzione "mergebooks" unisce i file due a due (in oggetti di tipo clsBook) prendendo le hash in modo intelligente, così da accodarle sempre. Non è il modo più efficiente (perché uso tre oggetti book invece di uno solo) ma è comunque velocissima. Siccome il codice può essere usato come spunto, lo riporto:

    
    clsBook *clsBook::MergeBooks(const clsBook &BookA, const clsBook &BookB)
    {
    	clsBook *pBook = new clsBook;
    	int a = 0, b = 0;
    	clsBookEntry *pa = BookA.GetItem(a);
    	clsBookEntry *pb = BookB.GetItem(b);
    	while(pa || pb)
    	{
    		#define PUSH_A { p->Merge(pa); pa = BookA.GetItem(++a); }
    		#define PUSH_B { p->Merge(pb); pb = BookB.GetItem(++b); }
    		#define PUSH_AB { p->Merge(pa); p->Merge(pb); pa = BookA.GetItem(++a); pb = BookB.GetItem(++b); }
    
    		clsBookEntry *p = new clsBookEntry();
    		if(pa && pb)
    		{
    			if(*pa > *pb) PUSH_B
    			else if(*pb > *pa) PUSH_A
    			else PUSH_AB;
    		}else if(pa) PUSH_A else PUSH_B
    		pBook->Add(p);
    	}
    	return pBook;
    }
    

    In sintesi, carico i due book BookA e BookB (nella funzione chiamante, non riportata) e qui aggiungo continuamente al terzo book l'elemento minore dei due ed incremento il puntatore corrispondente.

    Le entry hanno una funzione Merge che somma i wscore/bscore, così da fondere eventuali posizioni presenti in entrambi i book da unire. I book non hanno mai posizioni duplicate.

    La ricerca di una posizione a questo punto si fa con una semplice ricerca binaria ma si potrebbe anche farla con una hash-table. La ricerca binaria richiede mediamente una decina di confronti (max 23), per il book da 203 Mb, che sono nulla, in apertura. Vorrei provarlo anche nella ricerca a ply seguenti la root, per prevedere varianti che rientrano nel book.

    Per armonizzare il book con alfabeta, si dovrebbe convertire wscore/bscore in una valore posizionale... e questa sarebbe tutta un'altra storia, degna di un thread a parte.

    #10191
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Ah, una cosa; una roba che non so se l’ho fatta nella XXIV ma che sicuramente nella prossima XXV c’è… ossia il caricamento ‘intelligente’ delle informazioni.
    Se siamo in apertura, e fino ad un finale particolarmente scarico di pezzi, non carico la tb. Viceversa, se mi trovo in finale, non carico il libro.
    Giusto per tenere più ram disponibile.

    Bye!

    LL

    #10203
    stegemma
    stegemma
    Moderatore

    Ho creato un book di sole 10 mosse e poi ho eseguito (manualmente) le mosse più giocate. Dopo tanti tentativi, finalmente qualcosa che funziona!

    Di fatto, questa è la prima partita del libro di aperture di Satana:

    #10204
    stegemma
    stegemma
    Moderatore

    Seconda partita, stavolta col mega-book ridotto alle sole posizioni occorse almeno 10 volte. Qui è interessante perché in alcune mosse si è portato in posizioni giocate poche volte, per poi rientrare in posizioni più giocate.

    La posizione finale simmetrica si spiega facilmente, visto che Satana gioca sia col bianco che col nero, preferendo le mosse con maggiore probabilità di successo, in entrambi i casi:

    PS: questo book ha 359373 posizioni

    #10205
    stegemma
    stegemma
    Moderatore

    Un primo test esteso col book. Satana vs LarsenVB, partite da 60s + 100ms, 10 col bianco e 10 col nero:

    
    	NULLA	BK	TT
    NULLA	2	16	11
    BK	16	*	9
    TT	11	9	*
    

    Satana senza TT e senza book totalizza solo 2 miseri punti. Con il solo book ne totalizza 16. Con le sole TT ne totalizza 11 mentre TT + book ne fa 9.

    Mi sembra che questo test confermi che le TT di Satana hanno problemi ma sono sempre meglio di niente. Il libro di aperture migliora decisamente i risultati ma viene “frenato” se unito alle TT.

    Il libro usato è quello ridotto alle posizioni occorse almeno 4 volte:

    
    # book d:\satana\satana_4.sbk loaded with 1084751 positions
    

    l’algoritmo usato è quello pubblicato su TC, con una piccola correzione:

    
    clsPCollection<clsBookEntryExt> cllBookEntries;
    if(int nBookMoves = GetBookEntries(cllBookEntries, true))
    {
    	double squareSum = 0;
    
    	for(int e = 0; e < cllBookEntries.Count(); e++)
    		if(clsBookEntryExt *pEntry = cllBookEntries[e])
    		{
    			squareSum += sqrt(pEntry->myScore + pEntry->otherScore);
    			sfout.Push("# book move: " + pEntry->sMove);
    		}
    
    	for(int e = cllBookEntries.Count(); e >= 0; e--)
    		if(clsBookEntryExt *pEntry = cllBookEntries[e])
    			if(sqrt(pEntry->myScore + pEntry->otherScore) / squareSum < 0.02)
    			{
    				sfout.Push("# book move: " + pEntry->sMove + " removed");
    				cllBookEntries.Remove(e, true);
    			}
    
    	nBookMoves = cllBookEntries.Count();
    
    	if(clsBookEntryExt *pEntry = cllBookEntries[Rand(nBookMoves)])
    	{
    		FOR_MOVES
    		{
    			if(GetUserMove(pLoopMove, true) == pEntry->sMove)
    			{
    				UserSetBestMove(pLoopMove);
    				sfout.Push("# book move " + pEntry->sMove);
    				return 0;
    			}
    		}
    	}
    }
    

    Come si vede, la mossa viene scelta casualmente tra quelle oltre la soglia del 2% ma sarebbe opportuno preferire le mosse con maggiori probabilità. Le partite del libro sono però tra giocatori di valore superiore a Satana, per cui va abbastanza bene (non ci dovrebbero essere mosse assurde).

    Prima di ottimizzare il libro, ora è opportuno sistemare le TT. Col libro posso far giocare più partite e fare finalmente un’ottimizzazione seria.

    #10216
    stegemma
    stegemma
    Moderatore

    Ed ora Satana riconosce anche la triplice ripetizione, sia quando è in vantaggio che quando sta perdendo.

    #10217
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Nooooooooooooo !!!!!

    LL

    #10220
    stegemma
    stegemma
    Moderatore

    Il difficile è farlo funzionare, come sempre. Sembra comunque che vada bene, anche in posizioni in cui ho messo un’ “esca”, che il programma farebbe bene a non catturare:

    #10221
    stegemma
    stegemma
    Moderatore

    Questa posizione forse è migliore:

Stai vedendo 15 articoli - dal 211 a 225 (di 244 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