我正在写一个Connect-K简单的AI(没有修剪,只有4层)。我想知道什么是快速计算的最佳启发式。
比我的东西更好:
def eval(board, player)
connections = 0
magnitude = 0
for x in range(0, self.boardW(board)):
for y in range(0, self.boardH(board)):
if(self.get_player(board, x, y) == player): #assuming x and y are in bounds
temp = 1
# keep checking in this direction to find the max temp can be
if (magnitude < temp):
magnitude = temp
if(self.get_player(board, x, y) == player):
connection += 1
........
return connection**2 + magnitude**2
基本上这应该返回板上任何位置与其相邻点的最大连接数,以及8个方向中任意一个连续项目的数量(向上,向下,向左,向右,左上角,左下角,...... )
我的 k 将大于4;因此,我无法进行详尽的树搜索。
答案 0 :(得分:1)
min-max搜索在此方案中可能很有用,可能与简化的MCTS结合使用。基本上,更深层的递归会让你达到游戏的更多终结状态。通过分析哪个玩家在每个案例中获胜,您可以更好地理解某个行动的价值。
min-max方法对于两个玩家之间的游戏非常有用,并且广泛用于诸如此类的棋盘游戏。 MCTS可能有点矫枉过正,但总的想法是对随机,深入的搜索进行广泛搜索。例如,您可以随机选择10个分支,并使用相同的计算量进行6-7个递归步骤,而不是具有20的分支因子,并且只有5个递归级别(20 ^ 5 = 320万)。
在类似项目中获得良好结果的东西(用于检查器的AI)是在递归中进一步降低分支因子。通过定义最大分支(在递归步骤中要探索的最大分支数),让这个数字大于顶层的典型分支,并在递归时进一步减少到更小的数字(5-10到相当)很快,1-3在底部)。这样,您就可以获得两全其美的效果。您可以探索所有即将发生的动作,但您也可以获得有关它们如何影响游戏后期部分的大量信息。
快速回顾:使用MCTS和min-max,您可以找到许多终结状态。如果对手赢了,给它一个大的负分。如果你赢了,给它一个大的正分数如果两者都没有,你可以给它一个0,或者使用你在问题中显示的函数。通过利用最小 - 最大算法,让父游戏状态的得分取决于他们孩子的得分。