我正在写一个tictactoe程序,但它不是你传统的tictactoe
首先,棋盘是4x4,获胜的方法是在连续,列或对角线上获得3个对手和1个对手。因此,以下将通过第一栏赢得“O”:
O|_|X|_
O|X|_|_
O| |_|_
X|_|_|_
我正在尝试实现一个minimax算法,以便为程序提供一个无法打败的“硬”模式。
我的问题是我不能希望创建一个具有所有可能的游戏状态的树,因此我必须提出某种功能来评估我可以生成的游戏状态。
我想我的问题是,我怎么能想出这样的功能呢?
答案 0 :(得分:4)
这场比赛对于暴力来说肯定够小。
您可以枚举所有州。有16个正方形,每个正方形有3个可能的值(X,O或空)。
3 ^ 16 = 43046721,约4300万。
这意味着一个包含一个字节的表来描述每个州的可赢性只有43兆字节。
我创建了一个函数,将每个状态映射到一个到一千四百万之间的索引(你只需要状态,而不是可能的游戏顺序),基本上将它表示为base-3中的数字,并允许你从索引创建状态。
选择每个州可以获得的4个胜利值 - 为O赢得胜利,为X赢得胜利,不可赢,不知名。
分配长度为43046721的缓冲区以存储每个游戏状态的可赢性。
遍历所有索引号,标记获胜状态。然后通过并迭代地填写每个其他州的可赢性(如果已知)(根据轮到谁来检查所有后继状态)。这将在索引集上最多进行16次迭代,因此我认为没有任何理由说暴力在这里不起作用。
有一些优化,比如利用对称性,利用n个向下的所有状态由n + 1个等的状态继承的事实,但我认为你最初不需要那些。 / p>
答案 1 :(得分:2)
游戏的启发式功能是评估游戏的给定状态的功能。在这里 - 国家基本上由两部分组成:(1)董事会本身。 (2)轮到谁了。
一些可能的启发式功能:
我认为可以想到更多的启发式方法。
您可以将不同的启发式算法组合成一个“大”启发式函数,如下所示:
a_1 * h_1(state) + a_2 * h_2(state) + ... + a_n * h_n(state)
棘手的部分是学习a_1,...,a_n的分数 - 这可以通过各种方式完成 - 其中一个是monte carlo learning - 这基本上意味着:创建各种代理{ {1}}值,在它们之间运行锦标赛,以及比赛结束时 - 根据获胜者调整权重 - 并在您还有时间时重复该过程(这是anytime algorithm)。
完成后,将学习的权重用于最终代理。
P.S。可能的游戏数量是~16! (需要确定选择的方块的顺序 - 它选择游戏的其余部分将如何结束) - 问问自己它是否“足够小”以在你的限制范围内开发 - 或者它是否太多并且确实需要一个启发式的解决方案