回溯中是否有 do -> recurse -> undo 模式的名称?

问题描述

backtracking中,即用于解决n皇后问题的算法,基本上有两种方法可以进行递归调用

  1. 复制父板制作子板,通过放置新皇后修改子板,然后对子板进行递归调用
  2. 直接修改板子,递归调用,然后撤销修改

首选第二种,因为它避免了昂贵的复制。

这种选择也存在于其他算法中,例如游戏中的极小极大。

模式 2 是否有与模式 1 相对的名称

解决方法

在约束编程和 SAT-Solving(您的 n-queens 示例通常来自)中,我认为这些概念被描述为:

  • 基于副本
  • 基于跟踪(ing)

参见示例:

Reischuk,Raphael M.,et al. "Maintaining state in propagation solvers." International Conference on Principles and Practice of Constraint Programming. Springer,Berlin,Heidelberg,2009.

Schulte,Christian. "Comparing Trailing and Copying for Constraint Programming." ICLP. Vol. 99. 1999.

前文摘录:

约束传播求解器将传播交错,从变量域中删除不可能的值,并进行搜索。求解器状态在传播过程中被修改。但是搜索需要求解器返回到之前的状态。因此,传播求解器必须确定如何在传播以及前向和后向搜索期间保持状态。 [...] 本文还首次对状态恢复中的跟踪与复制进行了实际比较。

两者各有优缺点,参考文献分析。

请记住,跟踪通常不仅与存储您的决定(棋盘放置)有关,而且还发生了传播(由于all不同 传播:这些效果也必须恢复!)。有关此类实现的概述,请参阅:MiniCP

,

我想说两者是相同的算法,只是有一个可变不可变板。

我还要说,对于 n-queens 的特定情况,副本根本不贵,因为您可以仅使用 64 位来表示一个板...远远超过调用堆栈的每一级:)

,

与此相关的主题是面向对象编程中的一种设计模式,称为 "command-pattern"。它有助于根据命令堆栈撤消最近的命令。