我想实现游戏“连锁反应”的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/

10-10 01:44