C# 我如何创建一个测试来查看我的a.I.是否完美?
我做了一个tic tac toe a.I.给定每个板状态,我的a.I.将返回一个确切的移动位置。 我还制作了一个函数,可以循环使用a.I.制作的所有可能的剧本 这是一个递归函数,让a.I.对给定的棋盘进行移动,然后让另一个玩家进行所有可能的移动,并为每一个可能的移动调用一个新棋盘本身的递归函数 我这样做是为了当A.我先走,当另一个先走。。。把这些加在一起。我最终有418场可能的胜利,115场可能的平局,0场可能的失败C# 我如何创建一个测试来查看我的a.I.是否完美?,c#,recursion,artificial-intelligence,greedy,C#,Recursion,Artificial Intelligence,Greedy,我做了一个tic tac toe a.I.给定每个板状态,我的a.I.将返回一个确切的移动位置。 我还制作了一个函数,可以循环使用a.I.制作的所有可能的剧本 这是一个递归函数,让a.I.对给定的棋盘进行移动,然后让另一个玩家进行所有可能的移动,并为每一个可能的移动调用一个新棋盘本身的递归函数 我这样做是为了当A.我先走,当另一个先走。。。把这些加在一起。我最终有418场可能的胜利,115场可能的平局,0场可能的失败 但现在我的问题是,我如何最大限度地提高胜利的数量?我需要将这个统计数据与其他数
但现在我的问题是,我如何最大限度地提高胜利的数量?我需要将这个统计数据与其他数据进行比较,但我不知道该与什么进行比较。我的感觉是,你引用的数据已经相当不错了。两个专业的井字游戏玩家总是以平局告终,如果你的对手知道如何玩游戏,就没有办法迫使你获胜 更新
也许有一种更优雅的方法来证明你的人工智能的正确性,但最直接的方法是蛮力法。只需将所有可能的棋盘位置列为博弈树,并修剪直接导致损失的分支。然后,对于树中的每个分支,您可以计算出跟随该分支而获得胜利的概率。然后你只需要在每个板位上测试你的人工智能,确保它选择的分支具有最高的获胜概率。你所做的是比人工智能更多的线性优化……我不会在这里描述Tic Tac Toe的所有线性代数,网上有很多例子 因此,使用线性代数,你不必证明你的结果(搜索神奇的统计数据等),因为你的结果可以通过在原始方程中注入简单的解来验证 总之,有两种情况:
- 您使用的是简单的“演绎”逻辑(实际上是非形式线性代数公式):如果不查看代码,我们无法找到一种现成的方法来检查结果编辑:正如安德鲁·库珀(Andrew Cooper)所建议的,暴力可以是一种随时可用的方法,而无需查看代码
- 您正在使用正式的线性代数公式:您的结果可以通过在原始方程中注入简单的解决方案来验证
- 不能强求胜利
- 有了最佳策略,你就不会输
- 你在和整棵树比赛时确实搜索过它
- 而且你的AI是确定性的(如果它在特定阶段掷骰子,你就必须与所有的组合对抗)
如果你对赢/平/输一场比赛的机会没有先验知识,那么一个常见的策略就是坚持保留失去的位置。在下一场比赛中,你会尽量避开他们。如果你无法避免移动到丢失的位置,你会找到另一个位置。通过这种方式,你可以学会不输于某个策略(如果可能的话),或者避免策略中的错误。你应该从观察移动9始终是强制的开始:棋盘上只有一个空方块。移动也可以被认为是强制的,因为在七次移动之后,可能有三种情况:
可以在下一步中获胜,在这种情况下需要获胜O
- 将
放置在剩余的两个方格中的任何一个方格中,将赢得X
的游戏,在这种情况下,X
无论下一步如何都将失败O
没有或只有一条胜利之路,在这种情况下,X
阻塞以强制平局O
X
或O
是否已经赢了;马克以X
作为Wx获胜,以O
作为Wo获胜。其余的位置尚未确定
不要在Wx或Wo后探索位置:只需返回到上一步,由相应的一方报告胜利
到达第七步时,静态分析该位置,以确定上述三种情况是否适用,将该位置标记为Wx、Wo或平局
现在进入最重要的一步:当你回溯到玩家的移动N-1
- 如果您尝试的某个移动使下一级别的所有位置都成为Wp,则将当前位置也声明为Wp
- 如果你尝试的所有动作都导致对手获胜,那么宣布当前位置为对手获胜
- 否则,将当前位置声明为绘图,并返回t