Semantic Learning for Lazy Clause Generation——lazy clause generator相关论文

 

懒惰子句生成的语义学习

本文核心:

针对lazy clause generation中的冲突分析进行改进,用与SAT组件等效的语义推理方法代替它,从而从而减少SAT对高效单元传播的作用。 这使我们可以减少生成的文字数量,并加强冲突分析。试图避免为literals生成SAT表示,为此,放弃使用literals来构造蕴涵图(implication graph),并定义了一种将变量连接到分段原子约束的新方法,这些约束定义了它们在域中的变化。

Abstract

延迟子句生成(LCG)将有限域(FD)传播与布尔满意(SAT)求解,特别是子句学习的特征相结合。 在LCG求解器中,有限域传播器被视为子句生成器,它使用可变域的一些布尔编码为SAT求解器创建其行为的SAT描述。 当这些子句的单位传播触发冲突时,SAT冲突分析会学习新的(推断的)子句。 在本文中,我们建议通过在原子约束上语义推理的等效方法来取代SAT组件,从而减少SAT对高效单元传播的作用。 这使我们可以减少生成的文字数量,并加强冲突分析。 我们提供实验,探索用于实现结果的新求解器cpx的设计选择的效果。

1 Introduction

懒惰子句生成求解器[10]的原始形式在SAT求解器中嵌入了CP传播引擎。 使用布尔变量表示整数(和整数集)变量的域,并且由CP进行的每次传播都被转换为添加到SAT求解器的子句。 实际上,SAT求解器驱动整个计算,只依靠CP传播引擎来懒惰地构造表示约束的子句。

第一个完整的懒惰子句生成求解器[1]打破了体系结构,将SAT求解引擎置于CP传播引擎中。 传播引擎在域上传播,但也将这些传播记录为SAT求解器中的子句,并在那里复制传播。 一个重要的进步是能够不生成表示CP变量所需的所有布尔变量,而只是在首次需要时创建它们。

在本文中,我们描述了一种构造惰性子句生成求解器的新方法,该方法试图避免为文字生成SAT表示。 为此,我们放弃使用文字来构造蕴涵图,并定义了一种将变量连接到分段原子约束的新方法,这些约束定义了它们在域中的变化。 这减少了我们在惰性子句生成求解器的SAT组件中创建和维护所需的文字数量,并且还使我们能够构建一种更灵活,更基于语义的方法来进行冲突分析。

新求解器支持解释每个传播器的替代方法。 有三种解释方法可供选择

  •  - 子句解释:[10]和[13]的方案,其中所有传播都记录为子句。
  •  - 前向解释:在传播发生时构建蕴涵图的位置,但不记录表示蕴涵图中多边的子句。
  •  - 向后解释:在需求冲突分析期间构建隐含图的位置。

向后解释是SAT模理论求解者[8]的标准方法,在2005年的miniat 1.14中出现过。混合BDD解决程序[3]、lazy子句生成解决程序chuffed和Minion[4]的学习版本都使用了向后解释(而learning Minion也支持向前解释)。然而,请注意,向后解释不一定总是最好的,[14,15,12]的当前安排结果使用小句解释。

本文的贡献是:

 - 一种在惰性子句生成求解器中管理整数变量表示的新方法,可以扩展到大域;
 - 一种创新的冲突分析方法,使我们能够比以前的方法生产更多的一般nogood;
 - 灵活的解释架构,允许每个传播器以其选择的方式解释自己; 和
 - 显示新整数表示的效果的实验,以及新的冲突分析方法,以及解释的不同替代方案

2 Background

2.1 Propagation-based constraint solvers

基于传播的约束求解模型将约束c建模为传播器,通过移除不能参与任何解决方案的值,将变量(域)的可能值集合映射到较小的域。 这种方法的关键优势在于传播是“可组合的”,每个约束的传播器可以独立构建,并结合使用。

domain D \ integer valuation \ vars \ constraint c 上一篇文章均有说明,不再翻译

当f(D)= D \neq D时,传播器f创建的域的变化可以分解成组件,我们称之为原子约束。 如果D'是假域,那么生成的唯一原子约束是假的。 否则,我们可以分别检查每个变量x∈V。 我们可以将更改分类为:

设AC(D',D)是描述域D到域D'变化的原子约束的集合。我们将滥用符号,并使用原子约束a作为传播器,使约束保持不变。

我们可以使用原子约束来表示具有域Dinit(x)= [l..u]的整数变量x的所有可能的变化。其他原子约束可以被认为是对这些的否定的缩写。

增量传播解算器(incremental propagation solver)isolv(Fo,Fn,D,lvl)采用两组传播器Fo和Fn以及域D和决策级lvl,并且找到比所有传播器f ∈ Fo ∪Fn的D强的最大相互连接点, 假设Fo中的那些是在x点处,即图1给出了isolv的伪代码。 该算法保持传播器的队列Q运行,选择一个,并作为结果计算D0新域。 域中的所有新原子约束更改都被跟踪(使用传播器使它们成为真实且级别附加)。假设此时trail(a,f,level)被简单地定义为TR:= [(a,f,level)] ++ TR,其中TR记录全局trail。然后,任何可能不在定点的传播器都被new添加到Q中。

我们描述的路径是高度抽象的。 实际上,路径条目存储域的旧值,以便重建旧域,但我们可以使用它来重建原子约束a。 每个轨迹条目的级别是笔记存储的,但是根据记录每个选择的轨迹长度的标记计算。 对于非学习CP求解器,不需要存储原因f。在实践中,传播求解器isolv经过精心设计,以考虑哪些传播器必须位于不动点且不需要重新考虑(new函数)。它还将包括传播器上的优先级,以便在昂贵的传播器之前执行廉价的传播器。有关详细信息,请参见[11]。

传播解算器用于搜索上下文,如图2所示。执行传播引擎isolv返回D.如果检测到错误域,则搜索返回false。 如果D不是单身域,我们需要做出搜索决定a。 出于本文的目的,我们将决策限制为原子约束。 这不是严格的限制。 在做出选择之后,搜索继续递归,如果失败,我们解开所有更改并断言决策的反向。 如果所有变量都固定,则求解器返回true,因为D代表一个解。

2.2 SAT solvers

基于传播的(DPLL)SAT求解器[7]是一种传播求解器的专用形式,只有布尔变量,形式c≡l1∨l2∨...∨ln的子句约束,其中li是文字(布尔变量或其 否定)。 我们将布尔变量b视为具有初始域Dinit(b)= {0,1}的变量,其中false≡0和ture≡1。我们将域D扩展为映射文字,如下所示:

SAT的传播只是单位传播,它检测除了一个文字(lj)之外的所有句子都是假的子句c,然后修改域,使剩余的文字lj为真。 如果子句c中的所有文字都为false,则检测到失败。 SAT求解器可以使用专门的数据结构非常有效地执行单位传播。

每次检测到故障时都会触发冲突分析。冲突分析是SAT解决方案中的关键步骤。确定一个可重用的强nogood对于学习解决方案优于不学习解决方案的优势至关重要。解决程序检查存储在跟踪中的隐含图,记录哪些文字使每个传播的文字为真,并确定一个全局有效的nogood来解释和记录失败

主要思想是由图3中的函数 1uip_confict 捕获的,当一个子句(传播者)f≡c在isolv期间返回一个假域时调用(见图1)。 它需要当前的决策级别,以及失败A的初始解释并返回一个nogood。 它使用untrail展开跟踪。每次调用untrail()都会从TR中删除并返回第一个三元组,并将域D重置为trail条目之前的状态。当展开在当前的nogood中为文字l找到一个条目(l,r,lvl)时,它使用原因r替换它,原因r始终是子句C,其中表示子句C。这样一直持续到最后一层只有一个文本(创建1UIP nogood[7])。请注意,我们只对最后一个决策级别的文本进行untrail(将搜索保留为对任何剩余的文本进行untrail)。

冲突生成的最后一步是尝试使用冲突最小化来简化nogood(如simplify所示)。给定一个nogood ,求解器检查a是否移除lj,如果移除lj。这个检查是部分的,它通过在隐含图中跟踪lj的解释来检查是否只会导致解释中已经出现的文字。请注意,冲突最小化需要检查最后一个决策级别之上的跟踪条目,这将是以后的问题。

SAT solver使用nogood来确定第一个决策级别,其中nogood将传播到比backjump更高的级别。SAT求解器维持在冲突分析期间看到的变量的活动。 使用的搜索启发式优先考虑最近冲突中涉及最多的布尔变量。 这允许他们使用冲突驱动或基于活动的搜索[7]。 我们在本文中省略了对这些重要特征的进一步考虑。

3 Semantic Learning

懒惰子句生成系统的核心是它的冲突学习系统。 冲突学习需要两件事:记录解决过程中发生的所有推论,以及确定每个推理产生原因的能力。 我们使用求解器跟踪来捕获此信息

3.1 Propagator Explanations

为了能够确定每个原子约束推断的原因,惰性子句生成求解器要求扩展每个传播器f以解释它所做的所有原子约束传播。 如果f(D)\neq D,那么我们将要求f得到每个a∈AC(D',D)的原因。 我们假设reason(a, f)在当前域中返回一组原子约束L true,使得L∧c→a,其中c是f实现的约束。 我们更喜欢reason(a, f)为a返回最强的解释。

3.2 Atomic Constraints, Boolean Literals and Integers

在基于传播的约束中,求解器的推论是形式为<x = v>,<x \neq v>,<x ≥ v>,<x ≤ v>的原子约束。 这些原子约束中的每一个都对所涉及的变量的域具有直接解释。 LCG求解器的一个关键要求是将作为推论记录的原子约束与它们描述的整数变量域相连接,并将它们连接到SAT求解器记录nogoods和其他推论中的子句。

在lcg和lazyfd中,每个原子约束<a>由SAT求解器中的布尔文字[a]表示。 SAT求解器中的布尔变量附加到它们的含义,例如, 变量b = [x≥v]附加到信息x≥v。当通过单位传播将变量b设置为真或假时,域D(x)被适当地改变。

对于信息流的反向,用于表示关于x的信息的所有布尔变量都附加到变量。 在lcg中,所有与变量x相关的布尔文字都在初始化时急切地创建并存储在两个数组中,一个用于等式文字,另一个用于边界文字

lazyfd支持像lcg这样的文字的热切创作,但也允许它们懒惰地创建。 在这种情况下,到目前为止创建的x的布尔变量[x = v],[x≥v]存储在由附加到x的v排序的双向链表中。 我们缓存一个指向当前下限和上限的指针,以便快速检索边界。

对D(x)的更改将所有布尔文字添加到SAT传播引擎的队列中,已知这些布尔文字为真。 对于新的上限或下限,这需要从当前边界扫描数组或双向链表。 对于打孔,它需要数组查找或扫描从当前下限到当前上限的双向链表。

与同一整数x相关的布尔变量之间的关系也直接用子句编码在SAT求解程序中,例如,用对边界文字和相等文字之间的关系进行编码。当我们有惰性的文字创建时,这些关系子句是动态添加的(有关详细信息,请参见[1])。

虽然lazyfd可以懒惰地创建布尔变量来表示整数变量,但是一旦我们使用前向解释,在传播期间出现的许多原子约束将永远不会在SAT求解器中结束。 因此,为传播期间出现的每个原子约束创建布尔变量是浪费的

对lcg和lazyfd的一个重要改进是将蕴涵图的实现从使用布尔文字转移到使用原子约束。 原子约束带有它们的含义,因此它们不需要查找过程来确定它们的含义。 更重要的是,原子约束不需要支持监视列表,以及布尔文字所需的其他辅助数据结构,如活动计数。 只有当一个原子约束出现在一个nogood(或存储的解释,如果使用clausal解释)时,我们创建相应的布尔文字[a]并将两者连接在一起。

整数变量数据结构成为从域信息到原子约束的映射机制,反之亦然。 x的域被实现为从值v到<x≥v>和<x = v>的有序映射。 我们缓存当前的上限和下限,但不缓存它们在地图中的位置。 对D(x)的更改需要遍历地图以确定哪些原子约束变为真。 具有附加布尔文字的那些原子约束将该文字添加到SAT传播引擎的队列中。

目前cpx不支持eager变量,其中在初始化时创建了一个原子约束数组,尽管我们计划添加它们以便更有效地表示小域。

3.3 Conflict analysis

冲突分析是惰性子句生成(或SAT和SMT)求解器中的关键步骤。 确定一个可重复使用的强nogood对于学习求解器优于那些不学习的求解器来说是至关重要的。 这个想法是由图3中的函数1uip confict捕获的,虽然最初是为SAT描述的,但是它被写成支持任意传播器。

产生冲突的起点是一个初始的不良原因(false,f)→false,其中f是检测到失败的传播器。继续进行冲突,直到从当前决策级别产生一个只有一个文字的nogood。 冲突生成算法走上了追踪原子约束的轨迹,直到它在当前的nogood L→false中找到一个l∈L。 然后用reason(l,r)确定它变为真的原因取代l。 cpx的一个新特点是每个传播器都可以选择它如何解释,每个传播都会产生不同类型的理由r

我们在2.2节中已经解释了如果r是子句C,则reason(l,r)如何工作,以及在3.1节中,如果r是传播器,reason(l,r)如何工作。 如果r是一组原子约束,则只返回它们

函数trail(l,f,lvl)根据传播器f的不同解释样式而不同地工作,将不同种类的原因r附加到传播器推断的文字上。

所以f创建一个原因作为一组原子约束转换为子句C,它存储在子句数据库中,然后作为a的原因添加到跟踪中。 注意当使用与其他类型混合的子句解释时,我们有时会默默地将布尔文字强制转换为相应的原子约束。

因此,在踪迹条目中a的原因仅仅是一组原因约束L0,它是由reason返回的

因此reason仅在冲突分析期间调用传播器f的解释方法以确定解释l的原子约束集,其被返回。

使用clasual解释reasons总是子句的形式,对于前向解释,它们总是原子约束集,而对于向后解释,它们是传播器本身。

Semantic nogood simplification (语义nogood简化)使用原子约束而不是隐含图中的文字,以及因此,冲突分析过程的一个直接优势是我们可以利用约束的语义来简化创建的nogood。

请注意,[5]的多值SAT解决程序的工作原理非常类似。在传播和冲突分析期间,它跟踪应用于单个变量的所有文本,并将它们视为单个文本。但是多值SAT求解器[5]缺少边界文字,这意味着许多域的表示非常大。我们发现语义nogood简化的大部分优点是去除冗余边界

Lifted conflict analysis 如果传播器使用向后解释,那么在定义解释时就有很大的自由度。因为解算器状态一直保持在传播器实际传播时的状态,所以我们现在可以要求传播器f在冲突分析期间只解释文字l。很明显,这导致了解释的减少。它也有一些辅助的好处:

  • -解释可以考虑L,当前的nogood,决定如何最好地解释l;
  • -解释不需要使用与原来推断相同的传播器,即我们可以使用更强的传播算法,希望它能产生更好的解释;和
  • -我们可以用以前从未出现过的原子约束来解释,使解释更加一般化。我们称之为提升解释。

鉴于f可能有多种选择可以解释原子约束l,我们可以使用当前的nogood L做出更好的选择,这可能会导致更强大,更可重复使用的nogoods。

由于解释完全脱离传播,因此在解释过程中不需要使用相同的传播算法

虽然这个更大且强度无与伦比,但它可能更为可取。 这些原子约束中的一些可能已经存在于冲突中,或者更好的一些或所有这些原子约束可能在先前的决策水平上是真实的,这可能更快地解释。

请注意,我们必须使用至少与传播算法一样强的解释算法,否则我们可能会找到无法用较弱的解释算法解释的文字l,然后冲突分析失败

当我们结合惰性原子约束生成和强有力的解释时,我们可以创建一个解释,利用以前从未出现过的原子约束。 例如,在先前的计算中,示例3中的<x2≤6>可能永远不会出现为x2的上界。 然后,我们将不可避免地面临寻找原子约束的解释的问题,该解释从未实际传播过,因此不会出现在踪迹中。 处理此问题的最简单方法是简单地解开,直到不再存在。 最后一个未被描述的原子约束l必须暗示a。 我们可以简单地用l的解释来解释一个。 这种方法是正确的,但消除了语义冲突分析的许多好处,因为我们可能会产生更强的解释,但如果它们依赖于在最后决策层也成为现实的原子约束,那么它们就会削弱它们。

如果使得l为真的传播器使用了子句或前向解释,那么我们唯一能做的就是使用l的解释作为a的解释。 注意这两种方法,使用强有力的解释仍然是有利的,因为如果a在先前的决策水平上是真的,那么我们不需要解释它,我们产生更强的nogood。

但是如果我们支持解释提升,使用向后解释,我们可以做得比这更好。 当我们检测到原子约束时,在我们当前的解释中,在解开(l,f,lvl)后我们可以要求传播器f直接解释a而不是l。 鉴于f可以解释更强的l,它可以解释一个,在最坏的情况下与l相同的解释。 但它可能会做得更好。

       

修订版的冲突分析如图4所示。当我们解开项目时,我们可能会发现nogood中的一组原子约束N,它们不再适用于当前域。 我们使用lifted_reason使用传播器f找到这些nogoods的解释L0。 然后,我们将这些原子约束与L-N结合,利用原子约束的语义,使用函数conjoin简化结果nogood。 函数lifted_reason(l,f,N,L-N)返回一组当前为真的原子约束,并解释N中的每个文字。如果r是一个子句或一组原子约束,则只返回,否则 传播器f≡r确定当前域中N可以得到的最佳解释,同时考虑到其余的nogood L-N。

解释提升与后处理[6]中描述的隐含图的提议密切相关。在这种方法中,假设传播器有能力提升解释,则在冲突分析期间使用隐含图来替换仍然会导致失败的较弱的文本。与解释提升法集成到冲突分析中,确实可以构建一个完全不同形状的蕴涵图不同,[6]定义了一个不改变蕴涵图形状的后处理,尽管他们确实提到它应该像我们一样集成到冲突确定中。将[6]的解算器与LCG解算器进行比较是很有趣的,因为在不增加显著开销的情况下实现解释提升是一项具有挑战性的任务,不幸的是,他们的解算器不可用,并且在执行实验时,他们没有与LCG解算器lazyfd进行比较。

函数conjoin通过重复应用重写规则将原子约束连接在一起以形成更简单的原子约束

注意,它利用了nogood中的原子约束是可以相互满足的这一事实。注意,实际的实现比重写系统要有效得多。

最后值得一提的是向后解释的弱点。 冲突最小化需要检查最后决策级别之上的跟踪条目。 如果它们是通过分句或前向解释创建的,则没有问题,但是不能使用向后解释,因为我们无法将求解器状态返回到路径条目的状态。 相反,我们将原子约束视为没有理由(如选择)限制了最小化可以达到的目标。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值