当前位置: 首页 > 面试题库 >

C ++ minimax函数

锺离玮
2023-03-14
问题内容

我已经在Google和Stackoverflow上搜索了此问题,但我仍然不了解minimax函数的工作原理

我发现维基百科条目具有该功能的伪代码版本:

function integer minimax(node, depth)
    if node is a terminal node or depth <= 0:
        return the heuristic value of node
    α = -∞
    for child in node:                       # evaluation is identical for both players 
        α = max(α, -minimax(child, depth-1))
    return α

我在Google上发现的其他几个minimax函数基本上是同一件事。我正在尝试用C ++实现,这是我到目前为止提出的:

double miniMax(Board eval, int iterations)
{
    //I evaluate the board from both players' point of view and subtract the difference
    if(iterations == 0)
        return boardEval(eval, playerNumber) - boardEval(eval, opponentSide());

    /*Here, playerTurn tells the findPossibleMoves function whose turn it is;
    I mean, how do you generate a list of possible moves if you don't even know
    whose turn it's supposed to be? But the problem is, I don't see where I can
    get playerTurn from, as there are only 2 parameters in all the examples of
    minimax I've seen*/
    vector<int> moves = eval.findPossibleMoves(playerTurn);

    //I'm assuming -∞ in the wikipedia article means a very low number?
    int result = -999999999;

    //Now I run this loop to evaluate each possible move
    /*Also, the Lua example in the wiki article has
      alpha = node.player==1 and math.max(alpha,score) or math.min(alpha,score)
      Is alpha a boolean there?!*/
    for(int i = 0; i * 2 < moves.size(); i++)
    {
        //I make a copy of the board...
        Board temp = eval;

        /*and make the next possible move... once again playerTurn crops up, and I
        don't know where I can get that variable from*/
        temp.putPiece(moves[i * 2], moves[i * 2 + 1], playerTurn);

        /*So do I create a function max that returns the bigger of two doubles?*/
        result = max(result, -miniMax(temp, iterations - 1));
    }

    return result;
    /*So now I've returned the maximum score from all possible moves within a certain
    # of moves; so how do I know which move to make? I have the score; how do I know
    which sequence of moves that score belongs to?*/
}

如您所见,我对这个minimax函数感到很困惑。请至少给我一些提示,以帮助我解决这个问题。

谢谢!:)


问题答案:

来自Wikipedia的样本正在 使用Alpha / Beta修剪 进行NegaMax 。

直接命名可能会有所帮助:

  • 基础是MiniMax,一个字面实现将涉及2个轮流(相互递归)的方法,每侧1个。

  • 懒惰的程序员将其转换为NegaMax,这是一种策略性地放置-运算符的方法。

  • Alpha / Beta修剪正在跟踪最佳移动窗口(跨越多个深度)以检测死枝。

playerTurn用于确定轮到谁。在NegaMax中,您可以从奇数或偶数的深度(迭代次数)中得出。但是使用2个参数(myColor,otherColor)并在每个级别进行切换会更容易。



 类似资料:
  • 太!!!!!!难!!!!!!!了!!!!!!啊!!!!!!! 书接上回,上次把minimax二面拒绝后才知道实习工资很高,我太爱钱了。所以卑微跪舔回二面,被拷打得体无完肤。 :你说你对自动化测试感兴趣,说说理解。 :pytest和junit挑一个讲你的理解 :你提到CI我很感兴趣,CI和pytest怎么结合的呢? :在百度上搜索检索列表这个过程用数据库网络等计算机相关知识解释 (我使用网络层解释之

  • 函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。 函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。 C++ 标准库提供了大量的程序可以调用的内置函

  • 我正试图为一个双人8×8棋盘游戏创造一个人工智能对手。经过研究,我发现极大极小算法足够方便地完成这项工作。我创造的人工智能对手将与另一个人工智能对手或人类对战。 我对理解最小最大值算法有疑问。 我试图只创建一个AI对手,但在网络上找到的解释说我需要为两个玩家(最小玩家和最大玩家)编写代码,正如我从下面的伪代码中了解的那样。 我可以进一步理解,最大玩家将是我将要开发的AI,最小玩家是对手。 我的问题

  • 一面 深挖组件和 hook 的实现 不同文件在浏览器中存放形式 VueX 实现原理 VueX是在哪个阶段挂载到 vue 实例上的 其它忘记了 输出题,讲原理 两道手撕 Promise.all 二叉树层序遍历,每隔一层取反 面试官小姐姐人美技术强,可惜摆烂一个月,知识负增长,除了手撕其它答的都很拉,被拷打,遗憾 #前端#

  • 一面8.7 1.自我介绍 2.问实习经历 3.项目拷打 4.从浏览器输入URL到页面展示发生了哪些步骤 5.http响应状态码有哪些 6.http和HTTPS有什么区别 7.用例设计:一个身份证号输入框,一个查询按钮 8.一道sql 9.一道手撕:给一个数组,一个target,输出数组两个数和为target的二维数组 二面8.9 1.自我介绍 2.实习经历 主要聊大模型批改的批改逻辑,以及这个过程

  • 问实习 问遇到的最有意义的bug 问jmeter如何压测 写测试用例 写算法【浪费了一些时间 】 无八股无项目 反问 时长50多分钟 这几天状态一直都不好 感冒 上火脑袋懵懵的 算法题明明都做过 还是懵 求求给一个offer 这几天压力巨大

  • 本文向大家介绍C / C ++中的mbsrtowcs()函数,包括了C / C ++中的mbsrtowcs()函数的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将讨论C ++ STL中std::mbsrtowcs()函数的工作,语法和示例。 什么是std::mbsrtowcs()? std::mbsrtowcs()函数是C ++ STL中的内置函数,在<cwchar>头文件中定义。表示将

  • 本文向大家介绍C / C ++中的putwchar()函数,包括了C / C ++中的putwchar()函数的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将讨论C ++ STL中putwchar()函数的工作,语法和示例。 什么是putwchar()? putwchar()函数是C ++ STL中的内置函数,在<cwchar>头文件中定义。putwchar()函数用于在标准输出设备上写