C++ 极小极大函数

2023-12-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?*/
}

正如你所看到的,我对这个极小极大函数感到非常困惑。请至少给我一些提示来帮助我解决这个问题。

谢谢! :)


来自维基百科的该示例正在执行 NegaMax 和 Alpha/Beta 修剪

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

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

  • 懒惰的程序员将其转变为 NegaMax,一种策略性放置的方法-操作员。

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

Your playerTurn用于确定轮到谁了。在 NegaMax 中,您可以从深度(迭代)为奇数或偶数得出这一点。但使用 2 个参数(myColor、otherColor)并在每个级别切换它们会更容易。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 极小极大函数 的相关文章

  • 无法使用c#更改视频捕获分辨率

    我正在尝试使用 C 中的 DirectShowNet 更改默认网络摄像头分辨率 据我所知 我需要通过调用 windows win32 api dll 中内置的 VideoInfoHeader 类来更改它以进行 avi 捕获 我有来自 Dir
  • 如何查找给定字符串中仅出现一次的第一个字符[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 采用 std::vector 或 std::array 的模板函数

    我有一个函数 当前接受 2 个向量 其中可以包含任何普通的旧数据 template
  • 如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core

    我正在尝试编写一个控制器 该控制器接收来自 AJAX 调用的请求并通过 DBContext 对数据库执行一些调用 但是 当我发出命令时var user await GetCurrentUserAsynch 在对 DBContext 的任何调
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • Boost MPI 在监听列表时不会释放资源?

    这是一个后续问题如何释放 boost mpi request https stackoverflow com questions 44078901 how do i free a boostmpirequest 我在监听列表而不是单个项目时
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • 如何调试.NET Windows Service OnStart方法?

    我用 NET 编写的代码仅在作为 Windows 服务安装时才会失败 该故障甚至不允许服务启动 我不知道如何进入 OnStart 方法 如何 调试 Windows 服务应用程序 http msdn microsoft com en us l
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • asp.net core http 如果没有内容类型标头,则删除 `FromBody` 忽略

    我在 http 中使用 bodyDELETE要求 我知道目前删除主体是非标准的 但是允许的 使用时出现问题HttpClient它不允许删除请求的正文 我知道我可以使用SendAsync 但我宁愿让我的 API 更加灵活 我希望这个机构是可选
  • 检查两个函数或成员函数指针的签名是否相等

    我编写了一些代码来检查自由函数的签名是否等于成员函数的签名等 它比较提取的返回类型和函数参数 include
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • 如何禁用基于 ValidationRule 类的按钮?

    如何禁用基于 ValidationRule 类的 WPF 按钮 下面的代码可以很好地突出显示 TextBox
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 调试错误:在 vc++ 项目中使用 COM 时发生 所需的运行时?

    我为我的工作创建了一个 COM 组件 我也注册了该组件 在我的系统上 我有两个虚拟机工作站 在我的第一个工作站中 它运行良好 在我的第二个工作站中 它显示一个包含消息的错误框该程序需要一段时间并以不寻常的方式关闭 请联系应用程序管理员 我认
  • 如果仅使用第一个元素,是否必须为整个结构分配内存?

    我有一个结构 其中第一个元素被测试 并且根据其值 结构的其余部分将被读取或不会被读取 在第一个元素的值指示结构的其余部分不会被读取的情况下 我是否必须为整个结构或仅第一个元素分配足够的内存 struct element int x int
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有
  • 在 C# 中使用自定义千位分隔符

    在显示字符串时 我尝试不使用 字符作为千位分隔符 而是使用空格 我想我需要定义一种自定义文化 但我似乎做得不对 有什么指点吗 例如 将 1000000 显示为 1 000 000 而不是 1 000 000 no String Replac

随机推荐

  • facebook 从 cookie php 自动重新登录

    我的网站使用 Facebook connect 登录 服务器上的会话生命周期为 3600 我在用着客户端流程 javascript 重定向到login php login php检索cookie 由javascript设置 以获取访问令牌
  • 覆盖 Outlook 暗模式按钮背景

    我正在尝试向我的电子邮件模板添加对暗模式的支持 但是在 Outlook 方面遇到问题 由于某种原因 Outlook 部分覆盖了我的按钮的背景 导致其显示不正确 该按钮的 HTML 如下 td align center style font
  • WP-Query :检查帖子内容是否为空

    我正在尝试检查我的帖子是否有循环内容 目前 我在循环中添加了一个条件 if post gt post content 并将参数放入 wp query posts per page gt 8 我以为这有效 但实际上 WP query去找最后一
  • 使用 Gnome 库 (GDK) 获取键盘修饰符状态仅获取初始状态

    我正在尝试通过 gnome GDK 或 GTK 库获取当前的键盘修饰符状态 目的是实现显示该状态的可访问性 gnome shell 扩展 我知道如何使用 xlib 获取其状态 但 gnome gjs 没有完全绑定 下面的代码仅获取初始状态
  • Powershell 脚本根据修改日期复制文件以从远程位置检查最新文件

    我是 powershell 脚本编写的新手 我不明白为什么我的脚本会复制 所有文件 似乎没有检查日期 然后复制所有文件 反正 我也尝试过几天和几分钟 但我不太确定 关于如何做到这一点 任何帮助都会很棒 see my script below
  • Python 类与另一个类在同一文件中定义 - 如何访问文件中稍后定义的类?

    我对Python很陌生 我认为这个问题应该很容易回答 我的问题简化了是这样的 我在文件类 A 和类 B 中有 2 个类 类 A 在文件中首先定义 类 B 在第二个定义 class A class B 如何通过 A 类访问 B 类 class
  • 如何检索列表框中所选项目的选定值?

    我正在 WinForms 应用程序中填充列表框 如下所示 listBoxUsers DataSource ctx Users ToList listBoxUsers DisplayMember Name listBoxUsers Value
  • 检查表中是否包含列表中的值

    我有一个字符串参数列表 我想编写一个查询 返回一个字符串列表 其中包含表中存在的参数列表的值 我有以下查询 但无法获取 where 子句 List
  • 我如何在 Slick2D/LWJGL 或一般游戏编程中使用“delta”?

    我所知道的是 增量在某种程度上与适应不同的帧速率有关 但我不确定它到底代表什么以及如何在计算速度和不计算速度的数学中使用它 Delta 在哪里声明 初始化 它是如何使用的 它的值 最小值 最大值 是如何设置的 它是帧之间的毫秒数 您不想尝试
  • 如何检测 tcp 客户端与 gen_tcp 的断开连接?

    我正在尝试使用 gen tcp 模块 有服务器端代码的示例 我遇到了麻烦 First I bind server port and wait for peer connection ok Sock gen tcp listen 7890 a
  • 有没有办法防止空值被保留,同时允许其他值通过?

    我有一个现有的 JPA EclipseLink 项目 其中所需的行为是 如果在实体的字段中给出空值 则不应保留该空值 用例是我们可以从外部来源获得这些实体的一些部分更新 这些来源可能会给我们一个空值 这并不意味着 使该字段无效 而是意味着
  • Android Espresso 测试应用流程

    我使用 Espresso 来测试很多活动以及它们之间的转换 我想为这些活动编写不同的测试 并将活动意图链接到相应的测试用例 1 活动 A testActivityA 运行 2 应调用活动启动器活动B testActivity B 是否可以使
  • 如何设置禁用 DIV 元素的样式

    我可以让输入元素响应 hover and hover disable 但看起来 div 的反应不一样 btn width 99px border color 2px 787878 background color CACACA margin
  • 如何对部署在 Tomcat 上的 Jersey Web 应用程序进行单元测试?

    我正在构建部署在 Tomcat 上的 Jersey Web 应用程序 我很难理解如何对应用程序进行单元测试 通过简单地实例化我的测试中的类并调用它们的方法 这与 Jersey 或 Tomcat 无关 可以测试核心业务逻辑 非 Jersey
  • 在不同函数中使用字符串名称

    我需要使用movies list从第二个函数中的第一个函数开始 我怎么做 def movie movies list movie strip for movie in movies list movie explorer def rand
  • laravel 4 雄辩的热切加载关系计数

    我有一个具有多个定义关系的复杂模型 在这个例子中我想计算Like模型并创建一个名为likes因此它可以从 REST 服务返回 是否可以将模型计数加载到动态属性中 beat Post with array user likes gt func
  • 如何将字体与我的 .net winforms 应用程序捆绑在一起?

    我想为我的 net 3 0 Winforms 应用程序使用非标准字体 该字体可能安装在我的某些用户的计算机上 但在其他一些计算机上显然会丢失 如何将字体与我的程序一起发送 我需要安装字体吗 如果是这样 缺乏管理员权限会成为问题吗 您必须使用
  • html标签“/href”和navlink或Link之间的区别

    html标签 href 和react router提供的用于导航页面的navlink有什么区别 我可以使用两者来将页面导航到不同的 URL 那么为什么需要引入 Navlink 或 Link The href属性将触发页面刷新 从而重置应用程
  • Yii2 Pjax 和 ActiveForm beforeSubmit 重新加载后不起作用?

    我正在提交按钮上创建一个加载指示器 并使用 registerJs 函数将 开始 过程附加到 beforeSubmit 事件 第一次它可以正常工作 但是在重新加载 Pjax 容器后 再次提交表单时该事件将不会触发 我将整个视图文件包含在 Pj
  • C++ 极小极大函数

    我已经在 Google 和 Stackoverflow 上搜索了这个问题 但我仍然不明白 minimax 函数是如何工作的 我发现维基百科条目有该函数的伪代码版本 function integer minimax node depth if