COME COSTRUIRE UNA BUONA QUIESCENZA?


Questa pagina ha una gerarchia - Pagina madre:Vecchi ma interessanti post su Yahoo gruppi

Home Forum Vecchi ma interessanti post su Yahoo gruppi COME COSTRUIRE UNA BUONA QUIESCENZA?

Questo argomento contiene 0 risposte, ha 1 partecipante, ed è stato aggiornato da  Administrator 4 anni, 3 mesi fa.

Stai vedendo 1 articolo (di 1 totali)
  • Autore
    Articoli
  • #5422

    Administrator
    Moderatore

    Senza una buona quiescenza, pero’, valutazione e hash tables non
    servono assolutamente a nulla… come costruire un palazzo partendo
    dal tetto!

    Ecco qui un tipo di quiescenza molto veloce (non inventata da me). Il codice è in C senza ottimizzazioni.

    int Quiescence (int alpha, int beta)
    {
    int best, posValue, value, winLimit;

    posValue= StaticEval();
    if (posValue>=beta) return posValue;

    best= posValue; if (best>alpha) alpha= best;
    i= 0; n= GenCaptures();
    while (i // m è la mossa al indice i nella lista

    winLimit= posValue+EGain(m);
    if (winLimit>alpha) {
    make(m);

    // calcola value = min(winLimit, beta):
    if (winLimit value= winLimit;
    else
    value= beta;
    // è valido che alpha < value = min(winLimit, beta) // winLimit restringe la finestra (alpha, beta) value= -Quiescence(-value, -alpha); unmake(m[i]); } else value= winLimit; if (value>best) {
    best= value;
    if (best>alpha) alpha= best;
    };
    i= i+1;
    };
    return best;
    }

    con la funzione

    int EGain (Move m)

    che valuta lo “estimated gain” di una mossa. Qui sta incapsulata la conoscenza. Per esempio, la seguente è la più semplice e conservativa. DELTA essendo una costante che può essere anche uguale a 0. Questa costante serve a controllare il possibile aumento del valore posizionale. Si può anche farlo dipendere dalla profondità, controllando così la seletività posizionale. DELTA = 0 è naturalmente aggressivo, perche le catture che non vincono materiale, ma valore posizionale, non vengono ricercate.

    int EGain (Move m)
    {
    return PieceValue(capturedPiece(m))+PieceValue(promotionPiece(m))+DELTA;
    }

    La più sofisticata (e così anche più aggressiva):

    int EGain (Move m)
    {
    // promozione?
    if (promotionPiece(m)>0) return PieceValue(promotionPiece(m))-PieceValue(Pawn)+DELTA;

    // non è una promozione:
    return SwapOff(fromSquare(m), toSquare(m))+DELTA;
    }

    Come avevo detto una volta è più sicuro ricercare tutte le catture alla radice del “albero” della quiescenza. Perciò si aggiunge un if-statement:

    int EGain (Move m, boolean quiRoot)
    {
    // radice della quiescenza?
    if (quiRoot) return BIG_VALUE;

    // promozione?
    if (promotionPiece(m)>0) return PieceValue(promotionPiece(m))-PieceValue(Pawn)+DELTA;

    // non è una promozione:
    return SwapOff(fromSquare(m), toSquare(m))+DELTA;
    }

    Attenzione però, perche

    winLimit = posValue + EGain(m)

    e così posValue+BIG_VALUE non deve superare il valore positivo di un integer.

    quiRoot è un boolean nella nuova quiescenza:

    int Quiescence (int alpha, int beta, boolean quiRoot)
    {
    int best, posValue, value, winLimit;

    posValue= StaticEval();
    if (posValue>=beta) return posValue;

    best= posValue; if (best>alpha) alpha= best;
    i= 0; n= GenCaptures();
    while (i // m è la mossa al indice i nella lista

    winLimit= posValue+EGain(m, quiRoot);
    if (winLimit>alpha) {
    make(m);

    // calcola value= min(winLimit, beta):
    if (winLimit value= winLimit;
    else
    value= beta;
    // è valido che alpha < value = min(winLimit, beta) // winLimit restringe la finestra (alpha, beta) value= -Quiescence(-value, -alpha, false); unmake(m[i]); } else value= winLimit; if (value>best) {
    best= value;
    if (best>alpha) alpha= best;
    };
    i= i+1;
    };
    return best;
    }

    In AlphaBeta viene usata naturalmente in questo modo:

    if (orizonte) return Quiescence(alpha, beta, true);

    Intanto, per chi non ha un SEE (qui ho usato il nome SwapOff), può usare quella funzione EGain() semplice, avendo sempre una quiescenza buona!

    Buon divertimento, e…a tutta velocità!

    Alessandro

    Le faq sono nel menu principale, sotto Documentazione! 😉

Stai vedendo 1 articolo (di 1 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