TicTacToe AI 做出错误的决定

2024-01-01

一点背景知识:作为在 C++ 中学习多节点树的一种方法,我决定生成所有可能的 TicTacToe 棋盘并将它们存储在树中,以便从节点开始的分支都是可以从该节点开始的所有棋盘,以及节点是一步步跟随的棋盘。之后,我认为编写一个人工智能来使用该树作为决策树来玩 TicTacToe 会很有趣。

TTT 是一个可以解决的问题,完美的玩家永远不会输,所以对于我第一次尝试人工智能来说,它似乎是一个很容易编写的人工智能。

现在,当我第一次实现人工智能时,我返回并在生成时向每个节点添加了两个字段:在该节点下的所有子节点中,X 将获胜的次数和 O 将获胜的次数。我认为最好的解决方案是简单地让我的人工智能在每次移动时选择并沿着它获胜次数最多的子树走下去。然后我发现,虽然它在大多数时候都表现得很完美,但我找到了可以击败它的方法。这不是我的代码的问题,只是我让人工智能选择路径的方式有问题。

然后我决定让它选择计算机获胜最大的树或人类损失最大的树,以较大者为准。这使得它的性能更好,但仍然不完美。我仍然可以打败它。

所以我有两个想法,希望大家能提出意见,哪个更好:

1)我不是最大化胜利或失败,而是可以为胜利指定值 1,为平局指定值 0,为失败指定 -1。然后选择具有最高值的树将是最好的移动,因为下一个节点不能是导致损失的移动。这是主板一代的一个简单更改,但它保留了相同的搜索空间和内存使用情况。或者...

2) 在棋盘生成过程中,如果有一个棋盘使得 X 或 O 在下一步行动中获胜,则只会生成阻止获胜的子棋盘。不会考虑其他子节点,之后生成将正常进行。它缩小了树的大小,但是我必须实现一种算法来确定是否有一步获胜,我认为这只能在线性时间内完成(我认为这会使棋盘生成速度慢很多?)

哪个更好,或者有更好的解决方案吗?


基于决策树实现人工智能的(通常)正确方法是使用“Minimax“ 算法:

  1. 为每个叶节点分配一个分数(+1=玩家获胜,-1=玩家失败,0=平局)
  2. 沿着树向上移动,将以下规则应用于每个节点:

    • 对于偶数深度(当玩家移动时),选择得分最高的子节点,并将该得分复制到节点。
    • 对于奇数深度(当计算机将进行移动时),选择分数最低的子节点,并将该分数复制到节点。

当然,偶数和奇数可能需要颠倒,具体取决于您决定谁先走。

您可以在以下位置阅读更多内容:

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

TicTacToe AI 做出错误的决定 的相关文章

  • 实时跟踪每分钟/小时/天的前 100 个 Twitter 单词

    我最近遇到这样一个面试问题 Given a continuous twitter feed design an algorithm to return the 100 most frequent words used at this min
  • 用于检索编辑距离接近的字符串的数据结构

    例如 从一组英语单词开始 是否有一种结构 算法允许使用单词 right 作为查询来快速检索诸如 light 和 tight 之类的字符串 即 我想检索与查询字符串编辑距离较小的字符串 The BK tree http blog notdot
  • 创建横幅交换算法来轮播广告

    我正在构建广告横幅轮播脚本基于印象整个月均匀地显示广告 每次请求显示广告时都会进行计算 所以这将是即时完成的 广告应显示为一个接一个轮流播放 而不是仅显示一个广告 1000 次展示 然后显示另一个广告 1000 次展示 大多数情况下 它应该
  • 最大流量算法的修改

    我试图解决一个关于最大流量问题 http en wikipedia org wiki Maximum flow problem 我有一个源和两个接收器 我需要找到该网络中的最大流量 这部分是一般的最大流量 然而 在这个特殊版本的最大流量问题
  • 我怎样才能找到圆的所有点? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 给定半径和圆心坐标 如何找到圆的所有
  • Java中的马尔可夫模型决策过程

    我正在用 Java 编写辅助学习算法 我遇到了一个我可能可以解决的数学问题 但由于处理量很大 我需要一个最佳解决方案 话虽这么说 如果有人知道一个优化的库 那就太棒了 但语言是 Java 所以需要考虑到这一点 这个想法相当简单 对象将存储变
  • 如何修复错误嵌套/未闭合的 HTML 标签?

    我需要通过使用正确的嵌套顺序关闭任何打开的标签来清理用户提交的 HTML 我一直在寻找一种算法或Python代码来做到这一点 但除了PHP等中的一些半生不熟的实现之外 还没有找到任何东西 例如 类似的东西 p p ul li Foo bec
  • 在 C 中打印字符串的所有排列

    我正在学习回溯和递归 并且我陷入了打印字符串所有排列的算法 我用以下方法解决了它贝尔算法 http programminggeeks com bell algorithm for permutation 用于排列 但我无法理解递归方法 我在
  • 如何在从左到右、从上到下排序的二维数组中搜索数字?

    我最近收到了这个面试问题 我很好奇有什么好的解决方案 假设我有一个二维数组 其中所有 数组中的数字在增加 从左到右 从上到下的顺序 底部 搜索和搜索的最佳方式是什么 判断目标号码是否在 大批 现在 我的第一个倾向是使用二分搜索 因为我的数据
  • 如何在代码生成过程中简化包含变量的 C 风格算术表达式?

    我正在尝试优化编译器中的表达式求值 算术表达式都是C风格的 并且它们可以包含变量 我希望尽可能简化表达 例如 3 100 A B 100 3 100可以简化为409 300 A B 主要取决于分配律 结合律和交换律 我遇到的主要困难是如何将
  • 无痛“算法分析”培训? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在大学时曾有过一次关于 算法分析 课程的痛苦经历 但最近发现在大学中需要它真实世界 无论如何 我正在
  • 如何最小化两个子多边形的最大纵横比?

    我想使用直线将凸多边形切成给定面积比的两部分 以使两个子多边形的较大纵横比最小化 目前我的方法包括选择一个随机起点 计算将多边形分割成目标区域的适当终点 然后计算两个纵横比中较大的一个 然后重复这个很多次 直到我足够接近最小值 多边形 A
  • 获取无平方数的列表

    获得该值的一种方法是自然数 1 n 我们对每个因子进行因式分解 看看它们是否有重复的质因数 但这对于大的情况来说会花费很多时间n 那么有没有更好的方法从 1 中获取无平方数n 您可以使用埃拉托斯特尼筛法的修改版本 取一个布尔数组 1 n 预
  • 如何修复:AttributeError:模块“neat”没有属性“config”

    我正在浏览使用发现的 NEAT 神经网络 API 玩 flappybird 的 AI 的指南 当我运行从 Github 下载的代码时 出现错误 Traceback most recent call last File test py lin
  • 以一定角度遍历二维数组

    通常我们按行或列遍历数组 但这里我想以角度遍历它 我会尝试解释我的意思 因此 假设角度是 45 度 那么它会搜索为 0 0 then 0 1 1 0 then 0 2 1 1 2 0 等等 抱歉 无法上传图像 因为我是新用户 不允许这样做
  • 用于插入/删除/排名/选择查询的最佳数据结构/算法

    到目前为止 我知道像AVL树和红黑树这样的自平衡BST可以在O log n 次内完成这些操作 然而 要使用这些结构 我们必须自己实现AVL树或RB树 我听说有一个算法 实现这四个操作而不使用自平衡 BST 有了我们自己定义的结构 我们就需要
  • 如何计算两个ip之间的主机数量? C#

    我有两个ip 1 1 1 1 1 2 4 4 4 4 显然这只是一个例子 这是一个动态计算器 如果子网掩码不相关 我如何计算所述 ip 之间的主机数量 要计算 理论 IP 地址的数量 您需要将每个 IP 地址转换为其 32 位整数格式 这实
  • 如何在Scala中实现尾递归快速排序

    我写了一个递归版本 def quickSort T xs List T p T T gt Boolean List T xs match case Nil gt Nil case gt val x xs head val left righ
  • 哪种数据聚类算法适合检测时间序列事件中未知数量的聚类?

    这是我的场景 考虑在不同地点和时间发生的一组事件 例如 考虑有人在高空记录暴风雨期间城市中的雷击 就我的目的而言 闪电是瞬时的 只能击中某些位置 例如高层建筑 还可以想象每次雷击都有一个唯一的 ID 以便以后可以参考该雷击 这个城市大约有1
  • 合并字符数组中的最小重复次数

    假设我有两个数组 我想合并它们 以便合并后的数组具有最小重复次数 例如 x x 是重复 arr1 x d d m f m arr2 d d x f f m 唯一的条件是在合并数组中 元素来自arr1 and arr2必须出现在各自的订单中a

随机推荐