4.4 Nogood Recording

要提高CSP上回溯搜索的性能,最有效的技术之一是添加隐含约束。如果CSP的一组解在有约束和没有约束的情况下是相同的,那么就隐含了一个约束。将“正确的”隐含约束添加到CSP可以意味着从搜索树中删除许多死端,并且在更少的搜索工作之后发现其他死端。

研究了添加隐含约束的三种主要技术。一种技术是在建模阶段手工添加隐含的约束(参见第11章)。第二种技术是通过应用约束传播算法自动添加隐含约束(参见4.3节)。上述两种技术都可以在搜索过程中遇到局部不一致或死端之前排除它们。第三种技术,也是本节的主题,是在搜索中遇到局部不一致或死端后自动添加隐含的约束。由于Stallman和Sussman[124],这种技术的基础是nogood的概念。

定义4.4(nogood)。nogood是一组不符合任何解决方案的分配和分支约束。

换句话说,不存在一个解决方案——为每个满足csp所有约束的变量赋值——也不存在一个满足nogood中所有的赋值和分支约束的解决方案。如果我们使用回溯搜索来找到一个解决方案,那么每个死端对应一个nogood。因此,nogood是所有徒劳的搜索努力的原因。一旦发现死端nogood,就可以通过添加约束来排除它。当然,对于这种死循环来说已经太晚了——回溯算法已经否定了这个节点,也许付出了巨大的代价——但我们希望这种约束在未来会削减搜索空间。这种技术最初由Stallman和Sussman[124]非正式地描述,通常被称为nogood或constraint记录。

作为nogood的一个例子,考虑6后问题。赋值集合{x1 = 2, x2 = 5, x3 = 3}是一个nogood,因为它不包含在任何解决方案中(参见图4.1所示的回溯树,其中节点253是失败子树的根)。排除nogood,隐含约束¬(x1 = 2∧x2 = 5∧x3 = 3)可以被记录下来,也就是

记录的约束可以像原始约束一样进行检查和传播。特别是,由于nogoods对应的约束是子句,所以转发检查是一种合适的约束传播形式。同样,nogood也可以用于回跳(参见4.5节)。Nogood记录——或者在搜索过程中发现和记录隐含的约束——可以看作是对众所周知的向回溯搜索中添加缓存(有时称为记忆)技术的改进。其思想是缓存子问题的解决方案并重用这些解决方案,而不是重新计算它们

从理论上讲,使用约束传播算法可以先验地排除通过nogood记录而添加的约束。然而,添加隐含一元约束的约束传播算法尤其重要,而添加更高浓度约束的算法往往会添加太多没用的隐含约束,而且搜索速度越快,计算成本越高。

4.4.1 Discovering Nogoods 

Stallman和Sussman[124]发现nogoods的原始描述嵌入在基于规则的编程语言中,是描述性的和非正式的。Bruynooghe[22]非正式地将这个想法用于csp上的回溯搜索。Dechter[33]提供了第一个发现和记录nogoods的正式帐户。Dechter[34]展示了如何使用CSP的静态结构发现nogood。

Prosser[108]、Ginsberg[54]、Schiex和Verfaillie[118]都各自给出了如何在搜索过程中动态发现nogood的描述。下面的定义概括了这些建议的本质。该定义适用于回溯算法不执行任何约束传播的情况。(形容词“jumpback”的原因见4.5节。)回想一下,与搜索树中的每个节点相关联的是沿着节点路径发布的一组分支约束。对于d路分支,分支约束形式为x = a,对于某个变量x和值a;对于双向分支,分支约束形式为x = a和x\neqa;域分割,表单的分支约束x≤a和x>a。

注意,检查或传播约束的顺序直接影响发现哪个nogood。在应用上述定义时,我选择检查字典顺序递增的约束条件。例如,对于叶节点p∪{x6 = 1}, C (x2, x6)和C (x4, x6) fail-i.e皇后x2和皇后x4都攻击皇后x6 -我选择了C(x2,x6)

到目前为止,讨论的重点是回溯算法不执行任何约束传播的简单情况。一些作者帮助我们理解当回溯算法使用约束传播时,如何发现nogood。Rosiers和Bruynooghe[114]对forward check和nogood recording的结合进行了非正式描述。Schiex和Verfaillie[118]在执行前向检查的算法中提供了nogood记录的第一个正式记录。Prosser的FC-CBJ[108]和MAC-CBJ[109]可以看作是发现了回跳nogoods(参见4.5.1节)。Jussien, Debruyne, Boizumault[75]给出了一种将nogood记录与非二进制约束下的弧一致性传播相结合的算法。下面的讨论抓住了这些建议的本质。关键思想是修改约束传播算法,以便对于从某个变量域中删除的每个值,都记录一个消除解释

定义背后的意图是,expl(x \neq a)足以解释a的移除。例如,考虑图4.2a中的板子,它显示了圆弧一致性传播的结果。在节点p = {x1 = 2,x2 = 5}处,从dom(x6)中删除值1。对于这个值的消除解释是expl(x6 \neq 1) = {x2 = 5},因为{x2 = 5,x6 = 1}是一个nogood。消去解释可以看作是排除所述值的含义的左边。

构造消弧线一致性传播解释的一种可能方法如下。首先在节点处,提交一个分支约束bj,并在bj上强制执行圆弧一致性。对于从变量x∈vars(bj)的域中移除的每个值a,expl(x \neq a)被设置为{bj}。下一个约束传播迭代通过约束重新建立弧一致性。考虑在此约束传播阶段从变量x的域中删除的值a。我们必须记录一份解释,说明a被移除的原因;即a在某个约束C中没有支持的原因。对于变量y∈vars(C)的每个值b,它可以用于在C中形成对a∈dom(x)的支持但已从其域中移除,将y \neq b的消除解释加到x\neqa的消除解释中; 即expl(x\neqa)←expl(x\neqa)∪expl(y\neqb)。在圆弧一致性传播称为前向检验的特殊情况下,可以看出,消除解释只是C语言中实例化变量的变量赋值。

在回溯算法执行约束传播的情况下,现在可以像下面这样定义跳转。

注意,跳转nogoods不能保证是最小的nogood或可以发现的“最好”nogood,即使nogoods在叶节点上在本地是最小的。例如,Bacchus[1]表明,用于前向检查的jumpback可能不能提供最佳的后向跳点,并提供了一种改进nogood的方法。Katsirelos和Bacchus[77]展示了如何使用FC-CBJ或MAC-CBJ在搜索过程中发现广义nogoods。标准nogoods的形式为{x1 =a1∧···∧xk= ak}; 即,每个元素的形式为xi = ai。 广义的nogoods也允许xi \neq ai形式的合取。 传播标准nogoods时,变量只能从其域中删除一个值。例如,考虑标准nogood子句x1\neq2∨x2\neq5∨x3\neq3.如果某些点的回溯算法使得赋值x1 = 2且x2 = 5,则可以从变量x3的域中删除3。只有间接地,在除一个值之外的所有值都从一个变量的域中被删除的情况下,传播nogoods才会导致变量的值被强制执行;例如,给变量赋值。广义nogoods还可以直接强制变量的值,这可能导致额外的传播。

mark - silva和Sakallah[92]表明,在SAT中,布尔约束传播(BCP或unit propagation)的效果可以通过隐含图来捕捉。蕴涵图是一个有向无环图,其中顶点表示变量赋值,有向边给出赋值的原因。一个顶点要么是正的(变量被赋值为真)要么是负的(变量被赋值为假)。决策变量和原公式中作为单位子句出现的变量没有引入边;由于BCP而赋值的其他顶点具有来自导致赋值的顶点的传入边。如果可变量既可能是正又可能是负,矛盾就产生了。Zhang等[139]研究表明,在该方案中,将所有决策顶点与矛盾分离的蕴涵图的不同切割对应于从矛盾中可以学到的不同的nogood。Zhang等人的研究表明,某些类型的削减导致的结果比其他类型的削减要小得多、效果更强。同样,nogoods不必只包含分支约束,还可以包含BCP强制的赋值。Katsirelos和Bacchus[77]将该方案推广到CSPs,并给出了一些不同子句学习方案的实验结果。

到目前为止,关于发现nogoods的讨论主要集中在与搜索过程紧密集成的方法上。此外,还提出了其他nogood发现方法。例如,许多csp包含对称,考虑对称可以改进对解决方案的搜索。Freuder和Wallace[43]观察到,一个应用于nogood的对称映射会产生另一个nogood,它可能会修剪搜索空间的其他部分。例如,6皇后问题是关于水平轴对称的,将这个对称映射应用到nogood{x1 = 2, x2 = 5, x3 = 3},得到新的nogood{x1 = 5, x2 = 2, x3 = 4}。

Junker[74]展示了如何将nogood视为独立于搜索算法的独立模块。给定一组已知不一致的约束条件,Junker给出了一种算法,用于找到约束的一个小子集,该子集足以解释这种不一致性。该算法可以利用约束传播技术,独立于回溯算法中强制的约束传播技术,但不需要对约束传播算法进行修改。例如,考虑图4.1所示的回溯树。假设回溯算法发现节点253是一个死端。与这个节点相关联的分支约束集合是{x1 = 2,x2 = 5,x3 = 3},因此这个集合是nogood。记录这些nogood是没有用的。然而,子集{x1 = 2,x2 = 5}, {x1 = 2,x3 = 3},和{x2 = 5,x3 = 3}也是nogood。所有这些都可以用电弧一致性传播来发现。此外,子集{x2 = 5}和{x3 = 3}也是nogood。这些不能仅仅使用arc一致性传播来发现,但是可以使用更高级别的本地一致性来发现。显然,在其他条件相同的情况下,较小的nogood将导致更多的修剪。在更难解决的csp上,发现这些较小的nogoods所涉及的额外工作可能会导致搜索时间的整体减少。

虽然在SAT求解器中nogood是标准的,但目前还没有广泛用于求解一般的csp。也许主要原因是在许多CSP模型中存在全局约束,并且经常在这些约束上保持某种形式的arc一致性。如果将全局约束视为一个黑盒,那么用于确定nogoods的标准方法将很快导致饱和nogoods,其中所有或几乎所有变量都处于nogood中。饱和nogood对记录和回弹都没有什么用处。解决方案是根据每个全局约束的语义更仔细地构造消除解释。Katsirelos和Bacchus[77]提出了从全局约束的弧一致性传播中学习小广义nogoods的初步工作。Rochart、Jussien和Laburthe[113]展示了如何构造两个重要的全局约束的解释:all-different约束和stretch约束。

4.4.2 Nogood Database Management 

在nogood记录中出现的一个重要问题是更新和查询nogoods数据库的成本。Stallman和Sussman[124]建议在搜索过程中的每个deadend记录一个nogood。但是,如果数据库变得太大、太昂贵而无法查询,那么它所带来的搜索减少可能在总体上没有好处。降低成本的一种方法是限制数据库的大小,只包含最有可能有用的nogood。提出了两种方案:一种是对最初记录的nogoods进行限制,另一种是对长期保存的nogoods进行限制。

Dechter[33,34]提出了 ith-order size-bounded nogood recording。在这种方案中,只有当nogood最多包含i个变量时,才记录nogood。重要的特殊情况为零序,其中nogoods用于确定回跳点(见4.5节),但没有记录;和1阶和2阶,其中记录的nogoods是分别由弧线一致性和路径一致性传播强制执行的nogoods的子集。早期关于有大小限制的nogood记录的实验仅限于0-、1-和2阶,因为这些可以在不超越二进制约束的情况下进行容纳。Dechter[33,34]研究表明,2阶是最佳选择,显著改善了BJ对斑马问题的影响。Schiex和Verfaillie[118]研究表明,2阶是最佳选择,显著改善了斑马和随机二元问题的CBJ和FC-CBJ。Frost和Dechter[44]描述了nogood记录的第一个非二进制实现,并将CBJ与不受限制的nogood记录和2-、3-和4阶大小限制的nogood记录进行了比较。在对随机二进制问题的实验中,他们发现,既不是无限制的,也不是有大小限制的,但是添加任何一种记录方法都不会带来显著的整体改进。

与限制已记录的nogoods相反,Ginsberg[54]建议记录所有的nogoods,然后删除那些被认为不再相关的nogoods。假设是d路分支策略,其中所有分支约束都是一个赋值给变量,回想一下,nogood可以写成这种形式,

金斯伯格的动态回溯算法(DBT)总是将最近被赋值的变量放在隐含含义的右边,并且只保留当前左边为真的nogood(见表4.1)。nogood被认为是不相关的,一旦含义的左边包含了一个以上的变量值对,而该变量对没有出现在当前的赋值集中,就会被删除。当所有分支约束都是x = a形式时,对于某个变量x和值a, DBT可以使用O(n2d)空间实现,其中n是变量的数量,d是域的大小。数据结构为每个变量和值对维护一个nogood,每个nogood的长度为O(n)。

Bayardo和Miranker[10]将金斯伯格的建议推广到第i阶相关性有界的nogood record。在他们的方案中,一旦nogood包含超过i个变量值对,而这些变量对不在当前的赋值集中出现,nogood就会被删除。随后的实验比较了不受限制的、有大小限制的和有相关性限制的nogood记录。所有人都得出结论,不受限制的nogood是太昂贵的,但在大小有界还是相关性有界更好的问题上存在分歧。Baker[7]在关于随机二进制问题的实验中得出结论,具有2阶大小有界的CBJ nogood记录是最好的折衷。Bayardo和Schrag[11,12]在对各种真实和随机SAT实例的实验中得出结论,dpl - cbj具有4阶相关性有界的nogood记录总体上是最好的。marque - silva和Sakallah[92]在真实SAT实例的实验中得出结论,dpl - cbj在20阶大小有界的nogood记录是赢家。

除了限制数据库的大小之外,还提出了其他技术来降低更新和查询数据库的成本。其中最重要的是watch literals103]。给定一组赋值,nogood数据库必须告诉回溯搜索算法是否与任何nogood相矛盾,以及是否可以从变量的域中删除任何值。watch literals是一种数据结构,可以大大减少回答这些查询时必须检查的nogoods数量,并降低检查大型nogoods的成本。

随着watch literals数据结构的发现,记录非常大的nogood可以显著减少搜索时间。Moskewicz等[103]研究表明,在实际的大型SAT实例中,100和200个订单相关的nogood记录,以及重新启动和基于记录的nogoods的可变订单,明显快于dpl - cbj。Katsirelos和Bacchus[77]表明,从计划、填字游戏和日程安排等各种CSP实例来看,不受限制的广义nogood表头记录明显快于MAC和MAC- cbj单独记录。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值