我写了一个非常好的tic tac toe代码。我也有Alpha-Beta Pruning工作。我遇到了一个我需要想法的问题,而不是代码。我怎样才能选择一场在4场比赛中获胜的动作,而在8场比赛中将获胜。我遇到的问题是从minimax / AB prunning返回最佳得分的分支可能会在8次移动中获胜,因此它可能会修剪一个将在4次移动中获胜的分支。
我遇到过一些想法,比如杀手启发式,换位表和迭代加深搜索。任何想法都会很棒
答案 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算法将支持最快的获胜。