修剪Tic Tac Toe Moves

时间:2009-11-24 02:46:29

标签: java algorithm tic-tac-toe

我写了一个非常好的tic tac toe代码。我也有Alpha-Beta Pruning工作。我遇到了一个我需要想法的问题,而不是代码。我怎样才能选择一场在4场比赛中获胜的动作,而在8场比赛中将获胜。我遇到的问题是从minimax / AB prunning返回最佳得分的分支可能会在8次移动中获胜,因此它可能会修剪一个将在4次移动中获胜的分支。

我遇到过一些想法,比如杀手启发式,换位表和迭代加深搜索。任何想法都会很棒

7 个答案:

答案 0 :(得分:1)

您可以采取的方式:

如果没有找到胜利,你的搜索最大深度为2,然后增加你的深度限制,直到你找到胜利。

对于井字游戏,杀手启发式,换位表,它可能有点太多,因为你可以保留所有电路板的可能性。

在我的项目中,我使用Proof-Number Search。但是你可以使用很多算法。您也可以在this site中找到想法,但即使是国际象棋,大多数想法都可以用于您的项目。

答案 1 :(得分:1)

我会更多地考虑迭代加深。这将有助于你在8场胜利之前找到4分的胜利。

答案 2 :(得分:1)

当所采取的行动较少时,您的评估应该对获胜游戏状态的评分更高。这应该很容易实现。假设您通常将所有获胜游戏状态分配给值100.对于9号棋盘,只需添加数量(9圈)即可。因此,在8回合之后获胜的棋盘将评估为101,并且在5回合之后获胜的棋盘将评估为104.

答案 3 :(得分:0)

我认为tictactoe实际上已经“解决”,因为有一种算法可以保证胜利或平局,至少形成初始状态,因此alpha-beta搜索似乎过多。 (除非你只是学习在比国际象棋或其他更简单的游戏中实现它)

答案 4 :(得分:0)

(希望将其纳入评论,但它变得过于冗长)

迭代加深可能是这个问题最简单的“修复”。只需将alpha-beta搜索粘贴到一个循环中,即稳定地增加alpha-beta的深度。您可以在循环中包含几个测试以使其提前终止(例如,找到获胜的移动)。

例如:

while (!win_found && depth < 8)
{
    alphaBetaSearch(win_found, depth);
    depth++;
}

迭代加深可能看起来很浪费,因为状态是多次产生的,但事实证明这并不是那么昂贵。这样做的原因是,在每个级别具有相同(或几乎相同的分支因子)的搜索树中,大多数节点都处于底层,因此多次生成较高级别并不重要。

答案 5 :(得分:0)

如果你用编译语言编写,你可以在第一步中搜索整个树,在不到秒的时间内搜索任何启发式(只有alpha beta和eval函数返回-1,0,+ 1),否则它不应该超过第一次移动需要5秒,其他移动则少得多。

答案 6 :(得分:0)

在alpha beta修剪功能开始时,我假设您具有以下内容:

function alphabeta(node, α, β, maximizingPlayer) is
    if node is a terminal node then
        return 100

相反,如果您在终端节点中,请计算空平方的数量并将其添加到节点的值中。

function alphabeta(node, α, β, maximizingPlayer) is
    if node is a terminal node then
        bonus = count_empty_squares(node)
        return 100 + bonus

alpha beta算法将支持最快的获胜。