一个小背景:作为一种在C++中学习多节点树的方法,我决定生成所有可能的TigToTePad板并将它们存储在树中,这样从节点开始的分支都是可以从该节点跟随的板,节点的子节点是在一个移动中跟随的板。在那之后,我觉得写一个人工智能来扮演提克泰索会很有趣,用那棵树作为决策树。
TTT是一个可以解决的问题,一个完美的玩家永远不会输,所以这似乎是一个很容易的人工智能代码,我第一次尝试人工智能。
现在,当我第一次实现ai时,我返回并在每个节点上添加了两个字段:times x的值将获胜,times o的值将在该节点下的所有子节点中获胜。我想最好的解决办法就是让我的人工智能在每次移动中选择并进入它赢得最多次数的子树。后来我发现,虽然它发挥完美的大部分时间,我找到了方法,我可以击败它。这不是我的代码的问题,只是我让人工智能选择路径的方式的问题。
然后我决定让它选择一棵树,要么是计算机的最大赢家,要么是人类最大的损失。这使它表现得更好,但仍然不够完美。我仍然可以打败它。
所以我有两个想法,我希望能得到更好的建议:
1)而不是最大化赢利或损失,相反,我可以分配1的值为一个胜利,0个平局,和1的损失。然后选择具有最大值的树将是最好的移动,因为下一个节点不能是导致丢失的移动。这是一个很容易改变的董事会产生,但它保留了相同的搜索空间和内存使用。或者…
2)在棋盘生成过程中,如果有一个棋盘使X或O在下一步中获胜,则只生成阻止获胜的子棋盘。不考虑其他子节点,之后生成将正常进行。它缩小了树的大小,但之后我必须实现一个算法来确定是否有一个一招制胜,我认为这只能在线性时间内完成(我认为这会使板的生成慢很多?)
哪个更好,还是有更好的解决方案?
最佳答案
基于决策树实现人工智能(通常)的正确方法是使用“minimax”算法:
为每个叶节点分配一个分数(+1=玩家获胜,-1=玩家失败,0=平局)
沿着树向上走,对每个节点应用以下规则:
对于偶数深度(当玩家移动时),选择得分最高的子节点,并将该得分复制到节点。
对于奇数深度(当计算机移动时),选择得分最低的子节点,并将该得分复制到节点。
当然,偶数和奇数可能需要颠倒过来,这取决于你决定谁先走。
您可以在以下网址阅读更多内容:
http://ai-depot.com/articles/minimax-explained/
http://en.wikipedia.org/wiki/Minimax