2.2.4 Search: Backtracking

2.2.4 Search: Backtracking
Backtrack是约束满足问题的基本“完整”搜索方法,在某种意义上保证找到解决方案(如果存在的话)。 即使在1965年,Golomb和Baumert在一篇名为“Backtrack编程”[34]的JACM论文中,也能够观察到该方法已被多次独立“发现”。 Golomb和Baumert认为他们的论文是“完全普遍性地制定回溯编程的范围和方法的第一次尝试”,同时承认Walker [78]早在五年前给出的“相当普遍的阐述”。

实际上,Golomb和Baumert的公式对于我们的目的而言几乎过于笼统,因为它被表示为优化问题,其目标是最大化变量的函数。 可以说,Golomb和Baumert正在呈现“分支和绑定编程”,其中搜索中任何可能或可取的内部的上限和下限可以提供对搜索的额外修剪。 我们现在称之为经典CSP,即8皇后问题,它们通过指定一个函数来制定,当皇后不相互攻击时,其值为0,否则为1。 值得注意的是,在这种优化环境中,即使在1965年,Golomb和Baumert也承认存在“学习计划和爬山计划”,这些计划汇集在相对最大值上。 他们干脆地观察到,虽然“回溯算法缺乏学习和进步这样的迷人品质,但它具有更为平庸的美德”。

基本的回溯搜索通过选择变量的值直到达到死胡同来构建部分解决方案,其中部分解决方案无法一致地扩展。当它达到死胡同时,它会撤消它最后的选择并尝试另一个选择。这是以系统的方式完成的,保证将尝试所有可能性。它通过强力简单地枚举和测试所有候选解决方案得到改进,因为它在每次做出新选择时检查约束是否满足,而不是等到产生包含所有变量的值的完整解决方案候选者。回溯搜索过程通常表示为搜索树,其中每个节点(在根下面)表示对变量的值的选择,并且每个分支表示候选部分解。发现部分解决方案无法扩展然后对应于从考虑中修剪子树。关于回溯的其他值得注意的早期论文包括Bitner和Reingold的“Backtrack编程技术”[2]以及Fillmore和Williamson的“回溯:算法的组合描述”[24],它使用群论来解决对称性问题。

从人工智能的早期开始,对支持通用问题解决范式的启发式搜索方法进行了深入研究,并且回溯在状态空间,问题简化图和游戏树的深度搜索中发挥了作用[61]。 在20世纪70年代,由于约束满足作为其自身的范式出现,因此,在人工智能文献中突出了重要性,因此,在人工智能文献中获得了突出地位,导致在1980年的哈拉克和埃利奥特的“提高树木搜索效率以解决约束满足问题”[38]中的人工智能的出版。 这篇备受推崇的论文提供了对于重新定位回溯搜索的主要方法进行特别彻底的统计和实验评估的内容。

在改进回溯的早期工作中有两个主要主题:控制搜索和交织推理(约束传播)。 这两个主题都再次证明了Golomb和Baumert。 他们认为“在所有其他条件相同的情况下,用更少的元素从集合[域]中做出下一个选择是更有效的”,Haralick和Elliott称之为“失败的第一原则”,他们讨论“排除” ,其中一个变量的选择排除了其他变量的不一致选择,Haralick和Elliott称之为“前瞻”的形式,他们将其表示为“前向检查”。 当然,排除和最小域启发式很好地相互补充。

一般来说,人们可以寻找有效的方法来管理“前进”和“后退”搜索。 当我们向前推进,扩展部分解决方案时,我们会考虑变量,值和约束的顺序。 这个顺序可以对我们必须完成的工作量产生巨大的影响。 当我们在遇到死胡同之后向后移动时,我们不必通过简单地撤消我们做出的最后选择来按时间顺序执行此操作。 我们可以更聪明。 通常,约束传播,最常见的是部分或完整的弧一致性的形式,可以在搜索之前和/或期间执行,以试图修剪搜索空间。

Haralick和Elliott比较了几种形式的前瞻,在选择价值之后进行不同程度的部分一致性传播。 奇怪的是,“全面向前看”仍然没有保持完整的弧度一致性。 然而,早在1974年Gaschnig就已经提出了在选择值后恢复全弧一致性,并且McGregor甚至已经尝试过将路径一致性与搜索进行交互[59]。 Mackworth观察到,人们可以推广约束操纵和案例分析的交替,并提出了通过将可变域分成两半然后在子问题上恢复弧一致性来分解问题的算法[53]。

基本的回溯搜索按时间顺序回溯以撤消最后的选择并尝试其他方法。 这可能导致愚蠢的行为,其中算法尝试替代选择,这些选择明显与引起回溯的失败无关。 在电路分析的背景下,Stallman和Sussman的“依赖性导向回溯”[67],Gaschnig的“反向跳跃”[33]和Bruynooghe的“智能回溯”[8]都解决了这个问题。 从某种意义上说,这些方法会记住失败的原因,以便回溯合法的“罪魁祸首”。 Stallman和Sussman进一步通过“学习”失败的新约束(“nogoods”),这可以用来修剪进一步的搜索。 Gaschnig在他的“反标记”算法中使用了另一种形式的记忆,以避免在回溯时冗余检查一致性[32]。

猜你喜欢

转载自blog.csdn.net/weixin_38354912/article/details/83217360