chess - Negamax 截止返回值?
问题描述
我的 Negamax 算法有问题,希望有人能帮助我。
我正在用 Cython 写它
我的搜索方法如下:
cdef _search(self, object game_state, int depth, long alpha, long beta, int max_depth):
if depth == max_depth or game_state.is_terminated:
value = self.evaluator.evaluate(game_state) evaluates based on current player
return value, []
moves = self.prepare_moves(depth, game_state) # getting moves and sorting
max_value = LONG_MIN
for move in moves:
new_board = game_state.make_move(move)
value, pv_moves = self._search(new_board, depth + 1, -beta, -alpha, max_depth, event)
value = -value
if max_value < value:
max_value = value
best_move = move
best_pv_moves = pv_moves
if alpha < max_value:
alpha = max_value
if max_value >= beta:
return LONG_MAX, []
best_pv_moves.insert(0, best_move)
return alpha, best_pv_moves
在许多示例中,您在检测到截止后中断,但是当我这样做时,算法找不到最佳解决方案。我正在测试一些国际象棋谜题,我想知道为什么会这样。如果我在检测到截止后返回最大数量它工作正常但我需要很长时间(深度 6 为 252 秒)......
速度:节点前秒:21550.33203125
或者,如果您有其他改进,请告诉我(我使用转置表、pvs 和杀手启发式)
解决方案
原来我使用了c限制
cdef extern from "limits.h":
cdef long LONG_MAX
cdef long LONG_MIN
当你尝试反转 LONG_MIN 时,使用 -LONG_MIN 你会得到 LONG_MIN,因为溢出?
推荐阅读
- swift - downloadURL 函数返回 nil (Swift 5)
- javascript - Chart.js - generateLegend 不是一个函数
- c - 是否将 int 作为 unsigned long 未定义行为访问?
- java - Android Studio 从回收站视图和列表中删除项目
- c# - 运行所选代码生成器时出错:“未找到主键。”
- python - 如何用python读取素数文件;转换为列表
- python - 如何使用 .query() 通过时间戳函数过滤 Pandas 数据帧
- javascript - Python 运行 JavaScript 3.8
- google-apps-script - 仅备份值或在备份后将公式转换为值
- java - 当您使用朴素贝叶斯算法拼错单词时,获取字典(数据库)的接近单词