4.10 Comparing Backtracking Algorithms

正如这项调查所表明的,回溯的许多改进已经被提出,而且有很多方法可以将这些技术结合到一个算法中。在本节中,我对回溯算法的性能进行了比较研究。本研究分为实证研究和理论研究两大类。这两种方法都有众所周知的优点和缺点。经验比较允许使用任何一对回溯算法,但是关于哪种算法更好的任何结论总是很弱,因为它必须由短语“on the instances we examined”来限定。理论比较允许对一些回溯算法的相对性能进行分类陈述,但是任何结论在所有情况下都是正确的这一要求意味着,不能对每一对算法都做陈述,而且可以做的陈述有时必须是弱的。

在比较回溯算法时,采用了几种性能指标。对于经验比较,当然可以使用运行时间runtime,尽管这需要确保比较的是底层算法,而不是实现技巧或编程语言的选择。独立于实现的三个广泛使用的性能度量是约束检查的次数、回溯次数和访问节点的数量

4.10.1 Empirical Comparisons经验比较

回溯算法的实证比较的早期工作由于缺乏现实的或困难的测试问题而受到阻碍(例如,[21,48,63,93,108,114])。实验测试床通常只包含玩具问题——无处不在的n-queens问题在1965年首次使用,20多年后[57]仍被用作测试床[125]——以及简单的随机问题。而且,通常只对具有二进制约束的csp进行实验。对简单的二进制CSP的关注有时对该领域是有害的,并导致有希望的方法被过早地抛弃。

随着相变过程中出现的硬随机问题的发现以及对csp的替代随机模型的研究(见[51]及其参考文献),这种情况有所改善。现在可以进行实验,对最困难的问题的算法进行比较,系统地探索随机问题的整个空间,看一种算法在哪里优于另一种算法(例如,[17,45,126])。不幸的是,大多数随机模型缺乏任何结构或真实性。由于认识到使用全局约束和其他非二进制约束对约束编程的重要应用程序进行建模通常是最好的,并且构造并随后广泛使用约束编程基准库[53],从而进一步改善了这种情况。

在本节的其余部分中,我将回顾两种具有代表性的实验流:一种是检查回溯算法应该执行何种级别的约束传播的实验,另一种是检查改进回溯算法的几种技术之间的交互的实验。许多其他的实验——比如那些介绍了一种新技术的作者所做的实验,然后证明了这种技术在选定的一组测试问题上效果更好——在本调查的其他地方也有报道。

Experiments on level of constraint propagation

实验研究了回溯搜索过程中应保持何种水平的局部一致性。考虑表4.2中总结的代表性实验集。Gaschnig[47]最初提出了圆弧一致性交叉回溯搜索。对该方案进行测试的早期实验得出结论,在搜索过程中保持arc一致性的算法与前向检查算法没有竞争力[48,63,93]。

这一观点维持了大约15年,直到受到萨宾和弗洛伊德的挑战。Sabin和Freuder[116]利用硬随机问题证明MAC可能比forward check好得多。近年来,随着约束规划在实践中的应用越来越受到重视,人们逐渐认识到全局约束和其他内涵表示的非二进制约束对实际问题建模的重要性。有了这些约束,就可以开发特殊目的的约束传播算法,建模人员可以选择要执行哪种级别的约束传播。目前普遍认为,约束传播水平的选择取决于应用和不同的选择,在同一CSP中可能存在不同的约束

Experiments on the interaction between improvements 关于改进之间相互作用的实验

实验研究了变序启发式算法的质量、回溯搜索过程中保持的局部一致性水平以及冲突定向回溯(CBJ)和动态回溯(DBT)等回溯技术的加入之间的相互作用。不幸的是,这三种改进回溯算法的技术并不是完全正交的。考虑表4.3中总结的代表性实验集。这些实验表明,如果变量排序是固定的,约束传播水平是正向检验的,冲突定向跳变是一种有效的技术。然而,在以往的实验工作中也可以观察到,随着回溯搜索中保持的局部一致性水平的增加,以及变量排序启发式的改进,CBJ的作用减弱[5,17,107,108]。例如,在Prosser[108]的实验中可以观察到,给定一个静态变量排序,将保持的局部一致性水平从零提高到正向检查水平,会降低CBJ的效果。通过实验,Bacchus和van Run[5]观察到,将动态变量排序(相对于静态变量排序的改进)添加到正向检查算法中会降低CBJ的效果。在他们的实验中,这些效应是如此的小以至于几乎可以忽略不计,他们提出了一个论点来说明为什么这在一般情况下是成立的。Bessi 'ere和R´egin[17]从他们的实验观察,同时增加局部一致性水平到进一步弧一致性和进一步提高动态变量排序启发式减少CBJ太多的影响,在他们的实现,维护的开销backjumping实际上减慢的数据结构算法。他们推测,当保持圆弧一致性并使用良好的变量排序启发式时,“CBJ变得无用”。上述所有实验都是在小问题上进行的——斑马问题和n蚁后问题——以及随机csp上进行的,csp没有任何结构。

与此相反,在随后的随机和真实结构的csp实验中,人们发现反向跳转是一种有用的技术。Jussien, Debruyne, Boizumault[75]的实证结果表明,在保持arc一致性的算法中加入动态回溯可以显著提高性能。Chen和van Beek[26]给出的经验结果表明,虽然CBJ的影响可能会减弱,但是在保持圆弧一致性的回溯算法中加入CBJ仍然可以提供数量级的加速。最后,CBJ现在是解决结构化SAT问题的最佳回溯算法中的一种标准技术[83]。

4.10.2 Theoretical Comparisons理论比较

最坏情况分析和平均情况分析是理解和比较算法的两种标准理论方法。不幸的是,这两种方法都没有被证明在比较回溯算法方面是成功的。回溯算法的最坏情况界通常是指数的,很少能预测性能,回溯算法的平均情况分析必然对问题的分布做出了简化和不切实际的假设(如[63,105,110])。

基于证明复杂度的技术和基于算法访问节点属性特征构造部分顺序的方法是两种较成功的算法比较方法

Proof complexity and backtracking algorithms

回溯算法可以从反分解证明的证明复杂度来比较。可以证明的结果是一般形式的:对于任意CSP实例,具有最优变量和值排序的算法A在应用于该实例时,其访问次数不会比具有最优变量和值排序的算法B少,且访问节点的次数可以呈指数增长。最优排序与算法有关,因此A和B可能使用不同的排序。本文首先简要介绍了解决反分解证明和证明复杂性,然后对证明复杂性技术在csp回溯算法研究中的一些应用结果进行了说明。

决议推理规则以条款(A∨x)和(B∨¬x)的形式采用两个前提,并将条款(A∨B)作为结论。 这两个前提被认为是被解决,变量x被认为是被解决了。 解析两个子句x和¬x给出了空子句。 给定一组输入子句F,C语句的解析证明或推导是决议推理规则的一系列应用,使得C是最终结论,推理规则的每个应用中的每个前提都是来自F或F的条款。 先前应用推理规则得出的结论。 派生空子句的证明称为反分解证明,因为它表明条件F的输入集是不可满足的

子句C的分解证明可以看作是有向循环图(DAG)。DAG中的每个叶节点都用F中的一个子句进行标记,每个内部节点都用一个派生子句进行标记,这个派生子句是通过解析其两个父节点的子句来证明的,并且有一个节点没有后续节点,该节点的标记为c。对于我们的目的,一个就足够了。树解析证明是由推理的DAG构成树的解析证明。证明的大小是证明DAG中节点(子句)的数量。

证明复杂度是研究一种方法能够产生[28]的最小证明的大小。已知,证明一组子句F是不可满足的最小树反分解证明可以指数级地大于最小的无限制的反分解证明,且不能小于(见[13]及其引用)。要了解为什么树证明可以更大,请注意,如果希望在证明的其他地方使用派生子句,就必须重新派生它。要了解树证明为什么不能更小,请注意,每个树的分解证明也是一个无限制的分解证明。

为什么反分解证明复杂性对回溯算法的研究有意义? 将完整的回溯算法应用于不满足的CSP所产生的搜索树可以被视为反分解证明。 作为对应的一个例子,考虑将BT应用于SAT问题而产生的回溯树,该问题包括一组条款{a∨b∨c,a∨c,¬b,¬a∨c,b∨¬ C}。 每个叶节点都标有导致失败的子句,内部节点通过从叶子到根应用解析推理规则进行标记,并且根将用空子句标记。 因此,证明复杂性解决了最小可能的回溯树的大小问题; 即,如果假定最优变量和值排序启发式,则回溯树的大小。

SAT回溯算法与分解之间的联系已经被广泛观察到,基于dpl的算法在不满足的实例上对应于树的分辨率反驳证明。Baker[7]展示了当BT使用d路分支时,如何将这种对应推广到一般csp的回溯算法BT。Mitchell[100]利用de Kleer[32]的早期工作,展示了当BT使用双向分支时,如何推广这种对应关系。

Beame、Kautz和Sabharwal[13](在Beame之后)使用证明复杂性技术研究nogood记录的回溯算法。假设DPLL是SAT的一种基本回溯算法,假设DPLL+nr是DPLL,加入了一个不好的记录方案(称为FirstNewCut),假设DPLL+nr+restart是DPLL,加入了nogood记录和无限的重启。Beame结果表明,使用DPLL的最小refutation proofs比使用DPLL+nr的最小refutation proofs要长指数倍。换句话说,具有最优变量和值排序的DPLL不会比nogood记录且具有最优变量和值排序的DPLL访问更少的节点,而且访问节点的次数可以呈指数增长。Beame还表明,如果在两次重启之间保留学到的nogoods,则DPLL+nr+重启相当于不受限制的分解。DPLL+nr是等价于无限制分解,还是严格介于无限制分解与树分解证明之间,是一个有待解决的问题。

Hwang和Mitchell[71]利用证明复杂性技术研究了具有不同分支策略的回溯算法。假设pt -2路是使用2路分支的一般csp的基本回溯算法,而pt -d路是使用d路分支的回溯算法。Hwang和Mitchell的研究表明,具有最优变量和值排序的BT-d-way比具有最优变量和值排序的BT-2-way访问节点的次数更少,且访问节点的次数可以呈指数增长。

尽管证明复杂性框架是一种强大的技术,但它的局限性是不能用来区分对基本的时间回溯算法的一些标准改进。例如,考虑添加或不添加单元传播和冲突定向回跳到DPLL的四种组合。当使用最优变量和值排序时,每个算法访问的节点数完全相同。类似的结果也适用于将冲突导向的回溯、动态回溯或前向检查添加到BT[7,26,100]。

A partial order on backtracking algorithms回溯算法的部分顺序

回溯算法可以通过构造每个回溯算法访问的搜索树节点的充要条件来进行比较。然后,可以根据两个标准性能度量(访问节点的数量和执行约束检查的数量),使用这些描述在算法上构造部分顺序(或层次结构)。

可以证明的结果是一般形式的:给定任意CSP实例以及任意变量和值排序,具有变量和值排序的算法A在应用于实例时不会比具有相同变量和值排序的算法B访问更多的节点(可能访问更少)。也就是说,当性能度量是节点访问时,算法A优于算法B。该方法的一个显著特点是,即使两种算法使用的CSP模型都是算法B认为最好的模型,即使两种算法使用的变量和值排序都是算法B认为最好的排序,结果仍然保持(A仍然优于B)。

Kondrak和van Beek[79]介绍了一般的方法,给出了描述回溯算法的技术和定义。利用该方法,对BT、BJ、CBJ、FC、FC-CBJ等几种回溯算法给出了充要条件。作为必要条件的一个例子,可以看出,如果FC访问一个节点,那么该节点的父节点就是1- consistency(见定义4.3)。作为一个充分条件的例子,可以证明,如果一个节点的父节点是1一致的,那么BJ访问该节点。然后利用必要条件和充分条件对这两种回溯算法进行排序。例如,为了证明FC在访问节点数上优于BJ,我们证明了FC访问的每个节点也被BJ访问。FC的必要条件用于推断节点的父节点是1一致的。由于节点的父节点是1一致的,那么BJ的充分条件可以用来得出BJ访问节点的结论。

Chen和van Beek[26]对回溯算法的部分排序进行了扩展,包括回溯算法和它们的CBJ混合算法,这些算法在前向检查之外保持了局部一致性的水平,包括保持弧一致性的算法。为了分析局部一致性水平对跳远的影响,Chen和van Beek采用了跳远水平的概念。通俗地说,backjump的级别是指从backjump目的地到最远的死端之间的距离,用backjump来表示。通过将反向跳转算法执行的反向跳转划分为不同的层次,将CBJ弱化为一系列执行有限级别的反向跳转算法。假设BJk是一种backjump算法,当backjump level j小于等于k时进行backjump,而当j > k时按时间顺序进行backtracks, BJn等价于CBJ, CBJ执行无限制的backjump, BJ1等价于Gaschnig的[48]BJ, Gaschnig只进行第一级backjump。回想一下,保持强k-consistency algorithm (MCk)在回溯树的每个节点上强制执行强k-consistency,其中MC1等价于FC,在二进制CSPs上MC2等价于MAC。MCk可以与backjump结合,即MCk- cbj。Chen和van Beek的研究表明,保持强k一致性的算法不会比允许在大多数k级别上进行反向跳转的反向跳转算法访问更多的节点。因此,随着回溯搜索中维护的局部一致性水平的提高,回溯的改进就越少

图4.3显示了BJk,MCk和MCk-CBJ的回溯树大小的部分顺序或层次结构。 如果在图中存在从算法A到算法B的路径,则A从不访问比B更多的节点。例如,对于所有变量排序,MCk从不访问比BJj更多的节点,因为所有j≤k。

Bacchus和Grove [3]观察到,关于受约束节点的部分排序可以扩展到关于约束检查的部分排序,或者在每个节点处执行的工作量的其他度量。 例如,在二进制CSP上,MAC算法可以在树的每个节点执行O(n2d2)工作,其中n是变量的数量,d是域的大小,而FC算法可以执行O(nd)工作。 因此,可以得出结论,在二进制CSP上,在最坏的情况下(当两个算法访问相同的节点时),MAC最多可以是O(nd)倍。 关于节点和约束检查的部分排序与文献中报告的一些经验结果一致并且解释(例如,参见表4.2和4.3中报告的实验)。

除了明确显示的关系之外,重要的是要注意层次结构中隐含的关系。 如果层次结构中没有从算法A到算法B的路径,则A和B是无法比较的。 为了显示一对算法A和B是无法比拟的,需要找到一个CSP和一个变量排序,一个A优于B,一个B优于A。已经给出了涵盖所有不可比性结果的例子[4,26,79]。 一些更令人惊讶的结果包括:CBJ和FC-CBJ是无法比拟的[79],CBJ和MCk对于任何固定的k <n是无法比拟的,因为每个都可以指数地优于其他[4],以及MAC-CBJ和FC -CBJ以及更普遍的MCk-CBJ和MCk + 1-CBJ对于任何固定的k <n都是无法比拟的,因为每个都可以指数地优于其他的[26]。

猜你喜欢

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