我想实现游戏“连锁反应”的negascout算法。游戏由N行M列的矩阵实现,移动是一对(i,j)。
Negascout的伪码是:
function pvs(node, depth, α, β, color)
if node is a terminal node or depth = 0
return color × the heuristic value of node
for each child of node
if child is first child
score := -pvs(child, depth-1, -β, -α, -color)
else
score := -pvs(child, depth-1, -α-1, -α, -color) (* search with a null window *)
if α < score < β (* if it failed high,
score := -pvs(child, depth-1, -β, -score, -color) do a full re-search *)
α := max(α, score)
if α ≥ β
break (* beta cut-off *)
return α
现在,我希望该方法不仅返回值“a”,还返回行“i”和列“j”。
最佳答案
假设节点的顺序没有改变(没有随机洗牌)。
可以展开函数pvs以返回最佳节点索引:
function pvs(node, depth, α, β, color)
if node is a terminal node or depth = 0
return color × the heuristic value of node, 0
for each child_index, child of enumerate(node): (*cycle over nodes and their indices*)
if child is first child
score, _ := pvs(child, depth-1, -β, -α, -color)
score *= -1
else
score, _ := pvs(child, depth-1, -α-1, -α, -color) (* search with a null window *)
score *= -1
if α < score < β (* if it failed high,
score, _ := pvs(child, depth-1, -β, -score, -color) do a full re-search *)
score *= -1
α := max(α, score)
if α ≥ β
break (* beta cut-off *)
return α, node_index
使用node_索引,您可以从树的根中找到最好的子节点。
您还可以选择在每次调用pvs时返回整个子节点。
您应该能够从子节点获取行和列。
关于algorithm - Negascout的 Action ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48008638/