首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的静默搜索有什么问题吗?

我的静默搜索有什么问题吗?
EN

Stack Overflow用户
提问于 2018-02-18 06:42:49
回答 1查看 422关注 0票数 2

当我尝试实现QuiesenceSearch时,我总是在基于negamax的AI中得到奇怪的行为。我基于来自here的伪代码

代码语言:javascript
复制
int Quiesce( int alpha, int beta ) {
    int stand_pat = Evaluate();
    if( stand_pat >= beta )
        return beta;
    if( alpha < stand_pat )
        alpha = stand_pat;

    until( every_capture_has_been_examined )  {
        MakeCapture();
        score = -Quiesce( -beta, -alpha );
        TakeBackMove();

        if( score >= beta )
            return beta;
        if( score > alpha )
           alpha = score;
    }
    return alpha;
}

这是我的代码:

代码语言:javascript
复制
    private double QuiescenceSearch(GameBoard gameBoard, double alpha, double beta, int color)
    {
        double standPat = color * CalculateBoardScore(gameBoard);

        if (standPat >= beta)
        {
            return beta;
        }
        else if (alpha < standPat)
        {
            alpha = standPat;
        }

        foreach (Move move in GetNoisyMoves(gameBoard))
        {
            gameBoard.TrustedPlay(move);
            double score = -1.0 * QuiescenceSearch(gameBoard, -beta, -alpha, -color);
            gameBoard.UndoLastMove();

            if (score >= beta)
            {
                return beta;
            }
            else if (score > alpha)
            {
                alpha = score;
            }
        }

        return alpha;
    }

也就是说,人工智能似乎表现得就像-如果做出绝对最糟糕的举动(杀死它自己)是可行的。

CalculateBoardScore始终从颜色== 1侧返回,因此乘以颜色。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-20 14:24:59

我重构了我的代码,现在可以正常工作了:

代码语言:javascript
复制
private double QuiescenceSearch(GameBoard gameBoard, double alpha, double beta, int color)
{
    double bestValue = color * CalculateBoardScore(gameBoard);

    alpha = Math.Max(alpha, bestValue);

    if (alpha >= beta)
    {
        return bestValue;
    }

    foreach (Move move in GetNoisyMoves(gameBoard))
    {
        gameBoard.TrustedPlay(move);
        double value = -1 * QuiescenceSearch(gameBoard, -beta, -alpha, -color);
        gameBoard.UndoLastMove();

        bestValue = Math.Max(bestValue, value);

        alpha = Math.Max(alpha, bestValue);

        if (alpha >= beta)
        {
            break;
        }
    }

    return bestValue;
}

伪代码的问题是,如果它大于beta而不是beta,它应该返回stand/score:

代码语言:javascript
复制
int Quiesce( int alpha, int beta ) {
    int stand_pat = Evaluate();
    if( stand_pat >= beta )
        return stand_pat;
    if( alpha < stand_pat )
        alpha = stand_pat;

    until( every_capture_has_been_examined )  {
        MakeCapture();
        score = -Quiesce( -beta, -alpha );
        TakeBackMove();

        if( score >= beta )
            return score;
        if( score > alpha )
           alpha = score;
    }
    return alpha;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48846642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档