井字棋AI:如何构建树?

我在制作井字棋机器人的时候,遇到了理解“树”的巨大障碍。我理解这个概念,但我不知道如何实现它们。

有没有人可以展示一个如何为这种情况生成树的例子?或者一个关于生成树的好的教程? 我想困难的部分是生成部分树。我知道如何实现生成整棵树,但不知道如何生成部分树。


回答:

想象一下,在井字棋棋盘的任何时刻,每一个可能的走法都是一个分支。棋盘的当前状态是根。一次走法是一个分支。现在假设(一次一个),每个分支都变成当前状态。每个可能的走法都变成一个新的分支。树的叶子是做出最后一步棋并且棋盘满了的时候。

你需要一棵树的原因是,一旦它被构建,你需要找出哪个分支拥有最多的’赢’场景的叶子。你构建所有可能结果的分支,将获胜的总数加起来,然后做出最有机会最终赢得最多胜利的走法。

把树做成这样:

class Node {public:   std::list< Node > m_branches;   BoardState m_board;   int m_winCount;}std::list< Node > tree;

现在,你遍历树中的分支列表,并为每个分支,遍历它的分支。这可以用递归函数完成:

int recursiveTreeWalk( std::list< Node >& partialTree){   for each branch in tree       if node has no branches           calculate win 1/0;       else           recursiveTreeWalk( branch );   partialTree.m_winCount = sum of branch wins;}// initial callrecursiveTreeWalk( tree )

非常伪的代码。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注