问题标签 [tic-tac-toe]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2277 浏览

machine-learning - 井字神经网络作为评估函数

我一直在尝试使用多层感知器和反向传播为井字游戏编写 AI。我的想法是训练神经网络成为棋盘状态的准确评估函数,但问题是即使在分析了数千场游戏之后,网络也无法输出准确的评估。

我正在使用 27 个输入神经元;3x3 板上的每个方块都与三个输入神经元相关联,这些神经元接收值 0 或 1,具体取决于方块是否有 x、o 或空白。这 27 个输入神经元向 10 个隐藏神经元发送信号(我随意选择了 10 个,但我也尝试了 5 个和 15 个)。

对于训练,我已经让程序通过使用当前评估函数与自己对战来生成一系列游戏,从而为每一方选择被认为是最佳动作的动作。生成游戏后,NN 通过将给定棋盘状态的正确输出作为跟随它的棋盘状态的值(使用评估函数)来编译训练示例(包括棋盘状态和正确输出)。游戏顺序。我认为这是 Gerald Tesauro 在编写 TD-Gammon 时所做的,但我可能误解了这篇文章。(注意:我把更新权重的具体机制放在了这篇文章的底部)。

我尝试了不同的学习率值,以及不同数量的隐藏神经元,但似乎没有任何效果。即使经过数小时的“学习”,策略也没有明显的改进,评估功能也无法接近准确。

我意识到有更简单的方法来编程井字游戏,但我想用一个多层感知器来做,这样我以后可以将它应用到连接 4。这甚至可能吗?我开始认为对于具有合理数量的隐藏神经元的井字棋棋盘来说,没有可靠的评估函数。

我向你保证,我不是在寻找一些快速代码来完成家庭作业。我已经工作了一段时间没有成功,只是想知道我做错了什么。感谢所有建议。


这是我用于 NN 的特定机制:

27 个输入神经元中的每一个都接收一个 0 或 1,它通过可微 sigmoid 函数 1/(1+e^(-x))。每个输入神经元 i 发送这个输出(i.output),乘以某个权重(i.weights[h])到每个隐藏神经元 h。这些值的总和作为隐藏神经元 h (h.input) 的输入,该输入通过 sigmoid 形成每个隐藏神经元的输出 (h.output)。我将 lastInput 表示为所有隐藏神经元的 (h.output * h.weight) 之和。然后板的输出值是 sigmoid(lastInput)。

我将学习率表示为 alpha,将 err 表示为正确输出减去实际输出。我也让 dSigmoid(x) 等于 sigmoid 在点 x 的导数。

每个隐藏神经元 h 的权重增加值: (alpha*err*dSigmoid(lastInput)*h.output) 并且从给定输入神经元 i 到给定隐藏神经元 h 的信号的权重增加值: (alpha*err*dSigmoid(lastInput)*h.weight*dSigmoid(h.input)*i.output)。

我从这个关于反向传播的讲座中得到了这些公式:http ://www.youtube.com/watch?v=UnWL2w7Fuo8 。

0 投票
1 回答
1228 浏览

machine-learning - 时间差异学习的更新

我阅读了有关 Tesauro 的 TD-Gammon 程序的信息,并且很想为井字游戏实施它,但作为一名高中生,我几乎无法获得所有信息,因为我不知道这些术语。

这里的第一个方程,http://www.stanford.edu/group/pdplab/pdphandbook/handbookch10.html#x26-1310009.2

给出了“一般监督学习范式”。它表示等式左侧的 w sub t 是时间步 t 的参数向量。“时间步长”究竟是什么意思?在设计用于输出棋盘状态值的井字游戏神经网络的框架内,时间步长是否指给定游戏中的棋子数量?例如,由字符串“xoxoxoxox”表示的棋盘将在时间步 9,而棋盘“xoxoxoxo”将在时间步 8?或者时间步长是指自训练开始以来经过的时间量?

由于 w sub t 是给定时间步的权重向量,这是否意味着每个时间步都有自己的评估函数(神经网络)?所以要评估一个只有一步棋的棋盘状态,你必须输入一个不同的神经网络,而不是用两个棋步传递棋盘状态?我想我在这里误解了一些东西,因为据我所知 Tesauro 仅使用一个 NN 来评估所有董事会状态(尽管很难找到有关 TD-Gammon 的可靠信息)。

为什么输出的梯度是关于 w 而不是 w sub t 的?

提前感谢您澄清这些想法。对于我的项目或无障碍阅读材料的建议,我将不胜感激。

0 投票
1 回答
776 浏览

tic-tac-toe - 哪些算法可用于解决井字游戏?

有哪些算法可以解决井字游戏?特别是电路板尺寸为 4 * 4 或更大而不是 3 * 3?我尝试了 4 * 4 与 Minimax 和 alpha-beta 修剪,但 pc 似乎挂起并在堆栈溢出时抛出异常。我看到了这些用 javascript 编写的源代码,但我不知道它使用哪种算法,有人可以为我澄清一下吗? http://js-x.com/page/javascripts__example.html?view=153

0 投票
1 回答
4294 浏览

java - 井字游戏的 Minimax 算法中的错误

我目前正在尝试自学 Minimax 算法,并尝试在 java 中的井字游戏中实现它。但是,我的算法中有一个错误,我无法弄清楚是什么原因造成的。

以下是完整的源代码(对不起,文字墙!):

这是我运行程序时的输出(计算机是圆圈):

正如您在第一步之后看到的那样,计算机认为无论它做出什么举动都可以平局(Score = 0)。

在第二步中,我在第 0 列第 1 行打了一个叉。由于某种原因,计算机认为有两个可能的棋步可以达到平局(得分 = 0),只有四个棋步会输(得分 = -1) . 然后它做出了错误的举动,认为它会平局。

我首先认为 hasWon 方法有问题,但是我测试了所有 8 种连续获得三个的方法,它们都返回 true。

我怀疑问题存在于 findBestMove、max 或 min 方法中的某个地方,但我无法准确找出导致它的原因。

如果有人能说出导致错误的原因或就如何更好地调试我的递归算法提供任何建议,我将不胜感激。

0 投票
3 回答
27710 浏览

python - TypeError:Python 3.2 中的“int”对象不可调用?

所以我正在用python 3.2编写一个井字游戏,我花了很多时间试图解决这个问题并检查我的代码、脚本或任何你想要调用它的东西,很多次但仍然找不到它. 我用谷歌搜索了它,所有的答案都令人困惑,或者这个人正在编写与我的井字游戏不同的脚本。请注意,我只是python的初学者。当我尝试运行它时出现错误:

这意味着什么?这是它说它有问题的代码:

如果你能帮助我,那就太重要了。这太烦人了,我一直在努力解决它。

0 投票
1 回答
1643 浏览

python - TypeError:井字游戏中的列表索引必须是整数 - Python 3.2?

所以我在制作井字游戏时遇到了多个问题,但我已经找到了大多数问题的解决方案。但现在的问题是我读错了

当我尝试运行它时。这是它遇到问题的代码:

我不知道该怎么做,我喜欢在星期四刚开始使用 python 并且对它不是很聪明。但感谢所有的帮助(:哦,我有 python 3.2.

0 投票
1 回答
242 浏览

c++ - C++ if 语句没有正确测试

我正在尝试制作井字游戏,它可以在我可以插入 X 的范围内工作,但计算机只能插入一个 O。由于这是井字游戏,我需要计算机能够插入更多比一零。如果已经有一个值为 o 的变量,则每次运行此代码时,它都不会将另一个变量更改为值 o。我认为问题在于 if 语句。很抱歉没有明确说明我的问题。如果仍然没有意义,您可以编译我的其余代码。然后你可能会明白我的意思。

是剩下的

这就是我认为的问题所在。

0 投票
3 回答
2110 浏览

c++ - tictactoe game 没有运算符 "==" 匹配这些操作数

它可能非常低效和混乱,但这是我的问题 - 它说诸如“zz == defo && zo == defo”之类的东西等于用红色下划线表示错误:没有运算符“==”匹配这些操作数,当我运行我收到一个太长的错误,无法在此处发布 - http://pastebin.com/KTEM0MZK

我究竟做错了什么?提前致谢

这是我的代码-

0 投票
1 回答
996 浏览

neural-network - 建立一个人工神经网络对井字游戏结束游戏进行分类

我很难建立一个神经网络来将井字棋棋盘状态(最终或中间)分类为“X 胜”、“O 胜”或“平局”。

我将描述我目前的解决方案和结果。任何建议表示赞赏。

* 数据集 * 数据 集 = 958 种可能的终局游戏 + 958 种随机游戏 = 1916 种棋盘状态(随机游戏可能不完整,但都是合法的。即没有两个玩家同时获胜)。

训练集 = 数据集测试集的 1600 个随机样本 = 剩余 316 个案例

在我当前的伪随机开发场景中,数据集具有以下特征。训练集: - “X” 527 胜 - “O” 264 胜 - 809 场 测试集: - “X” 104 场 - “O” 56 场 - 156 场

* 调制 * 输入层:18 个输入神经元,每个神经元对应一个棋盘位置和玩家。因此,棋盘(B=blank):xxo ox B B o X 编码为:1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0

输出层:3 个输出神经元,分别对应每个结果(X 胜、O 胜、平)。

* 建筑学 *

基于:http ://www.cs.toronto.edu/~hinton/csc321/matlab/assignment2.tar.gz

1 Single Hidden Layer 隐藏层激活函数:Logistic 输出层激活函数:Softmax 误差函数:Cross-Entropy

* 结果 *

似乎没有任何参数组合能够达到 100% 的正确分类率。一些例子:

重要 - 如果您认为我可以改进以下任何一项: - 数据集特征(训练和测试用例的来源和数量)不是最好的。- 替代问题调制更合适(输入/输出神经元的编码) - 更好的网络架构(隐藏层数、激活/错误函数等)。

假设我目前在这方面的选择,即使不是最优的,也不应该妨碍系统具有 100% 的正确分类率,我想关注其他可能的问题。

换句话说,考虑到游戏的简单性,这个数据集/调制/架构应该做到这一点,因此,我在参数方面做错了什么?

我对 ANN 没有太多经验,我的主要问题如下:使用 16 个隐藏神经元,ANN 可以学习将每个隐藏单元与“某个玩家以某种方式获胜”相关联(3 个不同的行 + 3 个不同的列 + 2 对角线)* 2 名玩家

在此设置中,“最佳”权重集非常简单:每个隐藏单元具有来自 3 个输入单元(对应于玩家的行、列或对角线)的“更大”连接权重和“更大”连接权重到其中一个输出单元(对应于该玩家的“胜利”)。

如上表所示,无论我做什么,我都无法减少测试错误的数量。

任何建议表示赞赏。

0 投票
2 回答
2338 浏览

java - java中的井字游戏重置按钮

我已经添加了一个按钮来休息游戏,但我不知道如何添加一个监听器或者当我点击按钮时如何调用一个方法。请告诉我如何让重置按钮工作。谢谢你。