Conteggio nodi al secondo


Questa pagina ha una gerarchia - Pagina madre:Programmazione

Home Forum Programmazione Conteggio nodi al secondo

Questo argomento contiene 4 risposte, ha 3 partecipanti, ed è stato aggiornato da  Alessandro 10 mesi, 3 settimane fa.

Stai vedendo 5 articoli - dal 1 a 5 (di 5 totali)
  • Autore
    Articoli
  • #10827
    Luciano79
    Luciano79
    Membro

    Ciao a tutti,
    a causa di tutte le regole di valutazione del nodo orizzonte son passato con grande delusione da oltre 20.000.000 di nodi al secondo generati a circa 2.500.000.
    Hanno inciso tanto le regole di pezzi attaccati, pezzi indifesi e mobilità che mi hanno obbligato a cercare la lista di tutte le mosse possibili ai nodi orizzonte. Anzichè calcolare un valore esatto potrei calcolare un valore approssimato basandomi sulle mosse dei nodi precedenti, ci penserò bene.
    Ho però un grosso dubbio: io incremento il contatore dei nodi ogni volta che entro nel metodo Search(). Pertanto conto anche i nodi presenti al livello orizzonte che vengono solo analizzati per assegnare il valore.
    Quindi:

    
    Search()
    {
      ++nodi;
      if(IsTerminal() || etc...)
        return Eval();
      Gen();
      Search();
      TakeBack();
    }
    

    Ho visto però che Tom Kerrigan’s Simple Chess Program (TSCP) conta solo i nodi che generano dei figli, ovvero:

    
    Search()
    {
      if(IsTerminal() || etc...)
        return Eval();
      ++nodi;
      Gen();
      Search();
      TakeBack();
    }
    

    Ovviamente se mi comporto nello stesso modo la velocità espressa in nodi al secondo crolla drasticamente, tanto da mandarmi in depressione.
    Cosa contate voi? Qual’è lo standard?

    Grazie
    Luciano

    #10828

    Alessandro
    Membro

    Ciao Luciano, io conto i NPS più o meno allo stesso modo di TSCP, scartando le foglie.
    Non credo esista uno standard, poiché ciascun motore implementa l’albero di ricerca con caratteristiche proprie. Quello dei nodi al secondo è un argomento su cui ci siamo passati tutti.
    Il senso dei NPS a mio avviso è un altro. Servono per

    • Verificare che il generatore di mosse sia “bug-free”, quindi crei un tuo perft e conti i nodi.
    • Verificare miglioramenti, in termini di velocità, fra versioni differenti dello stesso motore.

    Molti motori generano mosse pseudo-legali e delegano l’albero di ricerca nell’individuare eventuali mosse illegali. TSCP, ad esempio, fa esattamente così. AdaChess, il mio motore, genera direttamente tutte le mosse legali.

    Per contare i NPS uso un sistema molto simile (direi identico) a TSCP e viaggio a circa 850.000 NPS su un portatile con intel core i7. In paragone, TSCP è più veloce. Però, se confronto il perft, sono quasi il doppio più veloce rispetto a TSCP. Tradotto: ho un generatore sicuramente più veloce ed una valutazione posizionale più corposa (inutilmente più corposa, direi, visto che tscp mi batte sempre….).

    Ma cosa succede se confronto i NPS fra versioni differenti di AdaChess? Succede che il generatore di mosse ha triplicato la sua velocità (pur portandosi dietro informazioni in più) – che non è un miglioramento da poco! L’albero di ricerca è rimasto grossomodo uguale (in termini di velocità) ma adesso ho una valutazione posizionae più corposa. In altre parole, grazie ai NPS posso dire di aver ottenuto un miglioramento generale di velocità di 3x con tutti i miglioramenti (o peggioramenti..) fatti.

    #10829
    Luciano79
    Luciano79
    Membro

    Ok grazie, ora sono ufficialmente depresso 😀
    Sono sceso quindi a 180.000 NPS se abilito la mobilità basata sulle mosse possibili, pezzi attaccati e pezzi indifesi. Con questa modalità batto TSCP a parità di MAXPLY, ma perdo sul tempo.
    Se invece non guardo le mosse possibili, i pezzi attaccati e i pezzi indifesi, ma valuto la mobilità in base alla posizione dei pezzi sulla scacchiera, allora faccio 500.000 NPS e TSCP mi batte (ed è ancora più veloce di me).
    Direi che ho ancora tanto su cui lavorare!

    #10830
    stegemma
    stegemma
    Moderatore

    Non puoi dire che il conteggio dei nodi serve per verificare il perft e poi scartare le foglie. Io conto anche le foglie, in quanto sono anch’esse dei nodi raggiunti dalla ricerca ma non conto le mosse dei nodi foglia. Per evitare confusione (che anch’io faccio!) bisognerebbe eliminare il concetto di “mossa” dal conteggio dei nodi. Se ho una mossa (legale), la eseguo e scendo poi al livello seguente => conto un nodo. Se in un nodo genero le mosse ma non le eseguo => conto solo il nodo raggiunto ma non le singole mosse.

    La prima Search di Luciano va bene, secondo me, per il conteggio dei nodi.

    #10835

    Alessandro
    Membro

    Nel perft conto anche le foglie, nella ricerca no. Il senso era di suggerire una implementazione propria del conteggio dei nodi che sia in qualche modo utile a tracciare la velocità del motore di fronte ai cambiamenti 🙂
    Non è raro trovare motori che contano separatamente i nodi della quiescenza da quelli della ricerca “standard”.

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