Mi presento


Questa pagina ha una gerarchia - Pagina madre:Programmazione

Home Forum Programmazione Mi presento

Questo argomento contiene 18 risposte, ha 6 partecipanti, ed è stato aggiornato da stegemma stegemma 1 anno fa.

Stai vedendo 15 articoli - dal 1 a 15 (di 19 totali)
  • Autore
    Articoli
  • #10592
    Luciano79
    Luciano79
    Membro

    Ciao a tutti,
    mi chiamo Luciano, ho 37 anni, mi sono appena iscritto. Sono un programmatore C# ed ex scacchista, ho smesso di giocare a 18 anni (strano ma vero, ho smesso il giorno in cui son diventato candidato), al massimo faccio qualche blitz.
    Come passatempo ho provato per ben 3 volte a fare un chess engine.
    – La prima volta parecchi anni fa in VB6 e nel giro di pochi giorni ho capito di aver sbagliato linguaggio.
    – La seconda volta due anni fa in C#, ma ho utilizzato classi pesanti, quindi per attendere una mossa con una profondità di 5 mezze mosse bisognava aspettare anche fino a 5 minuti.
    – Allora anzichè improvvisare ho studiato un po’, ed ora è uscito qualcosa di decente. Sempre in C#, ma utilizzando le bitboard. In realtà già mi piacerebbe rifarlo in C++, almeno posso gestire la memoria nei minimi dettagli, ho la sensazione che il framework ci metta del suo per non farlo troppo veloce.
    Funziona da solo una settimana, per ora non uso database di apertura o di finali e le regole di valutazione delle posizioni sono ancora poche, ma metà delle volte mi batte. Mi piacerebbe pensare che abbia già il mio equivalente elo blitz, ma credo che nella maggior parte dei casi le vittorie siano dovute per di più a miei grossi errori causati dal fatto che non ho una vera e propria interfaccia grafica, uso ancora il prompt dei comandi e faccio fatica a vedere le diagonali.
    E’ monotask, utilizzo la ricerca AlphaBeta cut-off, nonostante questo mi sembra ancora molto lento.
    Per testarlo in genere valuto da 5 a 10 mezzemosse, albero a orizzonte variabile, se la quinta mossa è una presa vado avanti fino a quando non c’è più una presa e al max fino al livello 10. I tempi medi di risposta sono di circa 4 o 5 secondi. Voi che avete già esperienza, quanto ci impiegano mediamente i programmi fai da te per valutare questo numero di mosse? E’ vero che può variare da pc a pc, ma un qualcosa di indicativo…
    Grazie
    Luciano

    #10594

    marco belli
    Membro

    Ciao Luciano e benvenuto,

    un programma ben scritto ad arrivare a profondità 10 ci mette generalmente meno di 1 secondo, in genere qualcosa come 100 ms.

    Come ti ho già detto benvenuto e in bocca al lupo con il tuo nuovo divertimento/ossessione 🙂

    #10595
    calimero22
    calimero22
    Membro

    Ciao Luciano.
    Benvenuto e complimenti.
    Sicuramente il tuo engine battera’ il mio Acqua, l’engine piu’ scarso al mondo 🙂
    A presto. Ciao
    Giovanni

    #10596
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Ciao Luciano,

    se mi dici come si chiama posso crearti la relativa paginetta ed inserirlo con gli altri. Poi, se vorrai, potrai modificarla a tuo piacimento.

    Bye!

    LL

    #10597
    Luciano79
    Luciano79
    Membro

    Grazie a tutti!
    @MArco, mi hai buttato giù di morale, ho dormito male dopo aver letto il tuo messaggio 🙂
    Spero che tu parli di programmi top tipo Fritz o altri e che profondità 10 intendi “profondità massima” e non minima… altrimenti sono ancora lontano anni luce dal fare qualcosa di decente.

    @Calimero, ho dato un occhio al tuo sito, bello, complimenti!

    @Luca, ancora non ho pensato ad un nome. Inoltre questa è la prima versione “debole” perchè l’intenzione è quella di creare una pagina web per poterci giocare contro, quindi non potrò sfruttare il tempo avversario per pensare, dovrò sempre ripartire da una posizione come se fosse sempre una nuova partita (perdendo quindi i calcoli pregressi) e resterà mono task, quindi la considero una versione “temporanea” che userò per fare esperienza, ma che non ho intenzione di portare troppo avanti. Appena mi viene in mente un nome te lo comunico!

    Intanto vorrei sottoporvi alcuni punti sui quali son perplesso e sui quali spero di poter migliorare.

    Sto cercando di renderlo più veloce, ho eliminato ogni calcolo (son rimaste poche somme) sostituendolo con array di costanti o operazione binarie.
    Per esempio:
    avevo bisogno di avere N bit a 1 consecutivi con N che va da 1 a 7. Inizialmente facevo 2^(N-1), poi ho sostituito il calcolo con array popolato all’avvio del programma, ovvero: da 1 a 7 => b[N-1]=2^[N-1]. Con questa semplice operazione i tempi si sono ridotti di un quarto.

    Per trovare il primo bit di una bitboard utilizzo questo (trovato sul web):

    public int GetFirst1Bit(ulong ul)
            {
                ulong n = ul;
                int result = -1;
                if ((n & (ulong)18446744069414584320) > 0) { result += 32; n >>= 32; };
                if ((n & (ulong)4294901760) > 0) { result += 16; n >>= 16; };
                if ((n & (ulong)65280) > 0) { result += 8; n >>= 8; };
                if ((n & (ulong)240) > 0) { result += 4; n >>= 4; };
                if ((n & (ulong)12) > 0) { result += 2; n >>= 2; };
                if ((n & (ulong)2) > 0) { result += 1; n >>= 1; };
                return 63 - (result + (int)n);
            }

    Sempre meglio che un ciclo… conoscete di meglio? La uso tante volte, sarebbe bello trovare qualcosa di più veloce. Peraltro ho il sospetto che per i pedoni (soprattutto per i bianchi a inizio partita) sia meglio un ciclo, sia perchè son tanti, sia perchè sono in una zona più ristretta.

    In oltre, su quali “grossi” punti si può velocizzare la ricerca? Per ora mi sono limitato a:
    – CutOff
    – Ordine mosse per Presa e TipoPezzoMosso

    Un’idea che ho, ma che non so se può funzionare davvero, è quella di arrotondare il risultato del calcolo del valore di ogni posizione alla prima cifra decimale, in modo da avere più valori uguali e sfruttare meglio il cutOff. Bhooo…

    #10598

    marco belli
    Membro

    Se tu usassi c o c++ la ricerca del bit la puoi fare con una funzione intrinseca che esegue in pochi cicli di clock.
    Ma non credo sia un problema anche il c# ti può dare soddisfazioni

    Da quello che ho capito dal poco che hai scritto mi pare che tu non utilizzi iterative deepening. Secondo me studiando un semplice engine come tscp, oppure la engine x studiare che trovi qui sul sito puoi capire molti concetti.
    Tscp ha bisogno di meno di un secondo x arrivare a 5 ply. 15 secondi x arrivare a 8 e più di 2 minuti x arrivare a 9

    #10599
    Luciano79
    Luciano79
    Membro

    Mi son scaricato Tscp e ho dato una sbirciatina, bello e semplice da capire!
    Mi fermo qui col programma, studio ancora e riparto nuovamente da zero…
    Sicuramente avrò bisogno ancora di vostri consigli.
    Grazie!!!

    #10600

    marco belli
    Membro

    Un Bocca Al Lupo. Non è detto che tu debba ripartire da 0. Studialo, non è forte ma implementa le idee base.

    Un bel reference in inglese è un blog di nome winger write a chess program in 99 step

    #10601

    marco belli
    Membro

    Ho sbagliato. Non è winger ma winglet…
    Il telefono continua a correggere i miei messaggi

    #10602
    Luciano79
    Luciano79
    Membro

    In realtà mi interessa tanto il tempo di risposta, poi la forza si può incrementare man mano aggiungendo corrette regole di valutazioni e database di posizioni simili, corretto?
    Vedo che non utilizza le bitboard, ma una sola (furba) scacchiera di dimensione 10×12 fatta di int. Pensavo di aver capito che le bitboard fossero l’evoluzione delle scacchiere fatte di char o int e che queste ultime fossero superate. E’ realmente così? Oggi qual’è la tendenza?

    #10603

    marco belli
    Membro

    La moda credo sia usare bit board, ma se lo scrivi bene anche con le 10 x 12 funziona benissimo

    #10604
    Luciano79
    Luciano79
    Membro

    Intanto prendendo spunto da tcsp ho già fatto un passo da gigante in avanti. Con una modifica banale ho più che dimezzato i tempi, passando da circa 4 secondi di media per ply5 (variabile da 5 a 10) a 1 o 2 secondi: ho modificato il valore della posizione da Double a Int (moltiplicando tutti i valori x 100).

    Per i curiosi, questa è una partita di test. Scusate se non è in png, devo ancora adattarmi allo standard:

    Cc3 – d5
    d4 – e6
    Cf3 – c5
    e4 – d:e
    C:e4 – c:d
    C:d4 – Ae7
    Af4 – a6
    Cf3 – Db6
    Dd4 – Cd7 //cerca di scambiare le donne perchè la mia ha troppo movimento
    D:b6 – C:b6
    Ad3 – Cf6
    0-0 – Cbd5
    Ae5 – 0-0
    Te1 – Ad7
    b2b3 – Tfd8
    C:f6 – A:f6
    c4 – A:e5
    T:e5 // errore, sembra quasi un bug – Ce7
    Td1 – Ac6
    Cg5 //la forchetta non funziona – h6
    Ah7+ – Rf8
    C:e6 // il crollo. Qui si è dato un vantaggio di un pezzo leggero. Chissà cosa ha visto. Credo che l’errore sia nel non vedere il matto in d1. Non esiste ancora il concetto di matto, per ora ho solo dato valore 1000 al re. Si accorge chè è matto solo dopo che ha perso il re, quindi con 2 semimosse in più rispetto al matto vero e proprio – f:e
    Tde1 – Td6
    T:e6 – T:e6
    T:e6 – Rf7
    Te5 – g6
    b4 – Th8
    A:g6+ – C:g6
    Ta5 – Th8
    h3 – Td4
    b5 – a:d
    c:d – Td5
    a4 – Ce5
    Ta7 – A:b5
    a:b – T:b5
    Ta1 – Tb2
    Tc1 – b5
    Tc7+ – Rg6
    f3 – b4
    Ta7 – b3
    Tb7 – Cd3
    Tb5 – Cc1
    Tb4 – Td2
    Tb6+ – Rg5
    Tb5+ – Rf4
    Tb4+ – Re3
    Te4+ – Rd3
    Tb4 – b2
    T:b2 – T:b2
    Rf1 – Re3
    Rg1 – Rf4
    Rf1 – Rg3
    Re1 – R:g2
    f4 – Cd3+ abbandona (valore inferiore a -100)

    #10605

    marco belli
    Membro

    Ok in generale usa gli in. Si usano i centesimi di pedone o altre scalature ma sempre int, float è troppo lento

    #10640
    Luciano79
    Luciano79
    Membro

    Ieri sera ho letto qua e là qualche pagina del gruppo g-sei, mi piace davvero molto… Belli i tornei, spero di poter partecipare il prossimo anno!
    Intanto sto riscrivendo il programma in C perchè mi sembra di aver capito che lavorando sui bit è molto più performante. Con le ultime modifiche fatte su quello in C# (ho introdotto il concetto di Takeback, nella versione precedente istanziavo le bitboard ad ogni iterazione) ora ho la media di 2 secondi per fare da 6 a 11 ply, ma conto di poter fare di meglio rivedendo l’algoritmo di ricerca e cercando di eliminare i pesanti e inutili rami giocati con il re sotto scacco (ancora non riesco a sapere in maniera snella se il re è sotto scacco).
    Una volta finita e consolidata la versione C lo rifarò ancora in C# utilizzando dll scritte in C (compilate con GCC) per essere performante sulle ricerche binarie. Ho la sensazione di complicarmi molto la vita con le bitboard, in compenso sto imparando molte cose sulla programmazione che prima non conoscevo, quindi continuerò così.
    Purtroppo non ho molto tempo, solo un’ora al giorno in pausa pranzo, la sera devo fare i conti con una bimba di 20 mesi che ha capito da poco che il papà può essere usato come un giocattolo, quindi vado un po’ a rilento.
    Ho partorito il nome: Sofia (la mia pupetta)

    Ciaoooo

    #10644
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Ieri sera ho letto qua e là qualche pagina del gruppo g-sei, mi piace davvero molto… Belli i tornei, spero di poter partecipare il prossimo anno!

    Saresti benvenuto 🙂

    ora ho la media di 2 secondi per fare da 6 a 11 ply

    Ottimo! Grande inizio!

    ancora non riesco a sapere in maniera snella se il re è sotto scacco

    E’ un cruccio di molti

    Una volta finita e consolidata la versione C lo rifarò ancora in C#

    Perchè?

    Ho partorito il nome: Sofia (la mia pupetta)

    Ti ho creato una paginetta tutta tua, che quando vuoi, potrai personalizzare (adesso hai i privilegi di autore).

    Bye!

    LL

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