当前位置: 首页 > 知识库问答 >
问题:

MiniMax到Alpha Beta搜索转换问题

闻人英韶
2023-03-14

好的,我的问题对于任何玩过棋盘游戏编程的人来说都应该很熟悉,所以这里是:

  • 我实现了MiniMax算法的一种变体(返回移动而不是最小/最大值)
  • 我还尝试将其设置为alpha beta版,尽管最终完全失败

这是我的极大极小码:

Move* Board::miniMax(int depth)
{
    return this->maxMove(1, depth);
}

Move* Board::maxMove(int ply, int depth)
{
    vector<Move*> moves = this->possibleMoves();
    int movesSize = moves.size();

    Move* maxMove = new Move(MINUS_INF);

    for (int i=0; i<movesSize; i++)
    {
        Move* move = moves[i];
        HASHMAKE(move,this);

        move->value = (ply<depth) ? (this->minMove(ply+1, depth))->value 
                                  : this->eval();

        maxMove = MAXMOVE(maxMove,move);

        UNHASHMAKE(move,this);
    }

    return maxMove;
}

Move* Board::minMove(int ply, int depth)
{
    vector<Move*> moves = this->possibleMoves();
    int movesSize = moves.size();

    Move* minMove = new Move(PLUS_INF);

    for (int i=0; i<movesSize; i++)
    {
        Move* move = moves[i];
        HASHMAKE(move,this);

        move->value = (ply<depth) ? (this->maxMove(ply+1, depth))->value 
                                  : this->eval();

        minMove = MINMOVE(minMove,move);

        UNHASHMAKE(move,this);
    }

    return minMove;
}

有什么想法吗?如何调整上述内容,使其成为Alpha Beta搜索?

下面是我尝试的Alpha-Beta转换(失败得很惨):

Move* Board::alphaBeta(int depth)
{
    return this->alphaMax(1,depth,MINUS_INF,PLUS_INF);
}

Move* Board::alphaMax(int ply, int depth, int a, int b)
{
    vector<Move*> moves = this->possibleMoves();
    int movesSize = moves.size();

    Move* maxMove = new Move(MINUS_INF);

    for (int i=0; i<movesSize; i++)
    {
        Move* move = moves[i];
        HASHMAKE(move,this);

        move->value = (ply<depth) ? (this->alphaMin(ply+1, depth,a,b))->value 
                                  : this->eval();

        maxMove = MAXMOVE(maxMove,move);
        if (maxMove->value>=b) return maxMove;
        a = MAXVAL(a,maxMove->value);

        UNHASHMAKE(move,this);
    }

    return maxMove;
}

Move* Board::alphaMin(int ply, int depth, int a, int b)
{
    vector<Move*> moves = this->possibleMoves();
    int movesSize = moves.size();

    Move* minMove = new Move(PLUS_INF);

    for (int i=0; i<movesSize; i++)
    {
        Move* move = moves[i];
        HASHMAKE(move,this);

        move->value = (ply<depth) ? (this->alphaMax(ply+1, depth,a,b))->value 
                                  : this->eval();

        minMove = MINMOVE(minMove,move);
        if (minMove->value<=a) return minMove;
        b = MINVAL(b,minMove->value);

        UNHASHMAKE(move,this);
    }

    return minMove;
}

提示(以避免任何误解):

>

  • 此-

    减INF加INF分别被定义为一些任意大小的值。

    这不像是一个家庭作业或任何东西(如果是的话,我很可能从来没有任何兴趣玩这样的东西…哈哈)

    移动是一个简单的类,包含移动的详细信息以及相应的值(由eval函数指定)。

    HASHMAKEUNHASHMAKE只是2个move-(un)制作和move-(un)散列宏,应该不会有太大区别。

    定义MAXMOVE如下:\define MAXMOVE(A,B)((A)-


  • 共有1个答案

    凌照
    2023-03-14

    不确定是不是这样,但我认为在alphaMin

    if (minMove->value<=a) return minMove;
    b = MINVAL(b,minMove->value);
    UNHASHMAKE(move,this);
    

    应该是

    UNHASHMAKE(move,this);
    if (minMove->value<=a) return minMove;
    b = MINVAL(b,minMove->value);
    

    以及alphaMax中的类似变化。

     类似资料:
    • 我有以下奥赛罗(reversi)游戏的阿尔法-贝塔极小值的实现。我已经修复了这个线程中的一些问题。这一次我想改进这个函数的性能。MAX_DEPTH=8需要很长的时间。在保持AI有点体面的同时,可以做些什么来加快性能? } 实用功能:

    • 我正在制作一个奥赛罗播放器,实现了一个带有alpha-beta剪枝的极大极小算法。然后,我在网上对最好的算法做了一些研究,并不断听到他们都使用的“negamax”算法。好像大部分人都觉得negamax比minimax快(我觉得是因为它不在min和max播放器之间切换?),所以我想把我的minimax算法变成negamax,如果那不是太难的话。 我想知道人们是否有任何洞察力,有多少更快地使用Niga

    • 这个问题是在最近的一次编码采访中被问到的。 问:给定一个二叉树,写一个程序把它转换成双链表。双链表中的节点按zig-zag级顺序遍历形成的序列排列

    • 在我的解决方案中,我遇到了一个“None's not have.val”的问题。。。我想知道如何调试它。。。 以下是描述 将BST转换为已排序的循环双链接列表。将左指针和右指针视为双链接列表中上一个和下一个指针的同义词。] 让我们以下面的BST为例,它可能会帮助您更好地理解这个问题:我们希望将这个BST转换为一个循环双链接列表。双链表中的每个节点都有一个前导节点和后继节点。对于循环双链表,第一个元

    • 按下 / 键,编辑器底部会出现 / 符号,接着输入字符串,便可以进行搜索 / 向下搜索 ? 向上搜索 n 搜索下一个 N 搜索上一个 :s/源字符串/目标字符串 将源字符串替换为目标字符串 :s/源字符串/目标字符串/g 替换当前行中所有符合条件的字符串 :行号1,行号2s/源字符串/目标字符串/g 在指定行中进行替换 :%s/源字符串/目标字符串/g 全文替换

    • 我有一个使用spring数据elasticsearch库的项目。我的系统返回了结果,但我想知道如何以域POJO类的形式获得结果。 我没有看到太多关于如何实现这一点的文档,但我不知道应该在谷歌上搜索什么正确的问题。 目前,我的代码是这样的,在我的测试中,它检索正确的结果,但不是作为POJO。 非常感谢您的帮助。