1

我想在python中写一个国际象棋引擎,我可以找到给定位置的最佳举动,但我努力从该位置收集主要变化,以下是我所到目前为止已经试过:收集和检索从alphabeta框架的主要变化

def alphabeta(board, alpha, beta, depth, pvtable): 

    if depth == 0: 
     return evaluate.eval(board) 

    for move in board.legal_moves: 
     board.push(move) 
     score = -alphabeta(board, -beta, -alpha, depth - 1, pvtable) 
     board.pop() 
     if score >= beta: 
      return beta 
     if score > alpha: 
      alpha = score 
      pvtable[depth-1] = str(move) 
    return alpha 

我使用pvtable[depth - 1] = str(move)追加移动,但最后我发现,pvtable包含随机非连贯的动作,像['g1h3', 'g8h6', 'h3g5', 'd8g5']的起始位置的事情。

我知道类似的问题已经被问到,但我仍然没有弄清楚我能如何解决这个问题。

回答

0

我认为当搜索再次达到相同的深度时(在游戏树的不同分支中),您的动作将被覆盖。

这个网站解释相当不错如何检索的主要变化:https://web.archive.org/web/20071031100114/http://www.brucemo.com:80/compchess/programming/pv.htm

应用到你的代码示例,它应该是这样的(我没有测试):

def alphabeta(board, alpha, beta, depth, pline): 

    line = [] 
    if depth == 0: 
     return evaluate.eval(board) 

    for move in board.legal_moves: 
     board.push(move) 
     score = -alphabeta(board, -beta, -alpha, depth - 1, line) 
     board.pop() 
     if score >= beta: 
      return beta 
     if score > alpha: 
      alpha = score 
     pline[:] = [str(move)] + line 

    return alpha 
+0

谢谢,我已经阅读了这个页面,这很有趣,但是我不能将它翻译成Python代码,因为我的C背景是0,你能给我一个例子吗? – Hedwig

+0

我编辑了我的答案,让我知道这是否有效。 – ZzetT

+0

非常感谢你,我刚刚编辑过'if score> alpha:alpha = score pline [:] = [str(move)] + line',它看起来不错,但仍不确定是否是正确的方法 – Hedwig