SAT问题求解.docx
- 文档编号:29965074
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:19
- 大小:787.64KB
SAT问题求解.docx
《SAT问题求解.docx》由会员分享,可在线阅读,更多相关《SAT问题求解.docx(19页珍藏版)》请在冰豆网上搜索。
SAT问题求解
SAT问题研究小结
预备知识:
1.基于模型诊断的基本概念介绍:
首先我们介绍基于模型诊断的主要思想和框架结构:
基本定义:
(1)诊断系统:
一个诊断系统符号化定义即为一个三元组(SD,COMPS,OBS),其中SD为系统描述,是一阶谓词公式集合;COMPS是系统的组成部件集合,是一个有限常量集合,而OBS是一个观测集合,是一阶谓词公式的有限集合。
简而言之就是把一个相关的系统抽象成符号化的几个部分,然后把系统模型化,根据逻辑关系和相关的硬件结构抽象成模型,根据模型推理出系统正常的输出,而往往在实际系统中得到的观测和预期的结果不符,此时便需要诊断出哪些元件可能出现故障,出现故障的原因,并找到故障元件并解决,其中最主要的是故障元件集合的找出即:
诊断集合。
(2)我们把一个元件不正常工作符号化表示即为:
AB(c):
”abnormal”,AB(c)为真当且仅当c反常,其中c
COMPS。
(3)基于一致性诊断:
设组件集合
,称
为关于(SD,COMPS,OBS)的一个基于一致性诊断,如果
是可满足的。
(4)极小诊断集:
称一个关于(SD,COMPS,OBS)的一个基于一致性诊断
是极小的(MCBD),if不存在
的任何真子集也是关于(SD,COMPS,OBS)的一个基于一致性诊断。
(5)由此我们可以知道:
要想判断一个诊断集合是否是基于一致性诊断,只需要判断在这个诊断集合中的组件都是反常的(是故障的),然后剩下的组件工作正常工作和系统的相关描述以及系统在这种情况下系统的观测是否逻辑上可以解释的。
(6)命题可满足性问题(propositionalSatisfiabilityProblem,SAT)是人工智能里的一个分支,它是完全NP问题,并且人工智能中很多的NP问题都可以转化成SAT问题,然后求解,相应的基于模型诊断问题(MBD)问题也可转化为SAT问题,然后求解。
(7)集成组合电路可以转化CNF
例如与门电路:
其可转化为(
),其转化过程如下:
如果与门工作正常的情况下:
则有:
同理其它组合电路门转化为CNF如下:
一般的组合电路如下图:
其对应的CNF如下:
2.SAT问题定义
可满足问题的一些基本定义,表示如下:
定义2.1文字(literal):
对于变量集合X={x1,x2,x3,....,xn},文字li是变量xi或者否定-xi。
定义2.2子句(clause):
子句Ci是文字li的析取,
.
定义2.3.合取范式(conjunctivenormalform,CNF):
CNFF是子句的合取,
.
定义2.4赋值(assignment):
v:
X
{0,u,1},对于变量集合{x1,x2,x3,x4,...,xn}:
(1)完全赋值(completeassignment):
v(x)
{0,1},对于所有的x
X;
(2)部分赋值(partialassignment):
v(x)
{0,u,1},其中u是自由变量,其取值范围为:
0
X;
(3)对于给定的一个CNFF,SAT(F)=1,如果存在一组赋值v,使v(F)=1,类似的,对于所有的x完全赋值v,v(F)=0,此时SAT(F)=0.
SAT问题一般描述为:
对于N个布尔变量X={x1,x2,x3,....,xn},找到变量的一组赋值,满足在CNF中的每个子句都至少有一个文字取真,并且这组赋值能使所有的子句都能取真。
若找到这样一组赋值,则称该SAT问题是可满足的(SAT),如果没有任何一组变量赋值,使得SAT可满足,则称该SAT问题是不可满足的(UNSAT).
例如CNFF1:
则F1找到一组赋值x1=1,x2=0,x3=1使得F1=1,那么该SAT问题是可满足的,而CNFF2:
,F2就找不到一组赋值,使得F2=1,所以该SAT问题是不可满足的。
SAT求解器可以通过接收一个CNF描述文件调用完备算法或者不完备算法来求得这个CNF描述文件的可满足和不可满足。
在其中任何的命题公式都可以转化为CNF描述文件。
CNF描述文件的格式,如下:
Pcnf23//CNF描述文件的语法,”pcnf”是关键字;”2”代表变量的个数,”3”代表子句的个数;
10//”1”和”-1”是文字,表示变量和变量的否定,即文字;
-1-20//每一行代表一个子句,并以”0”作为子句结束表示。
20
任何的一个命题公式也都可以通过变形,转化为CNF描述文件,例如
R={-A
B,B
A,-C,-A},可以表示为CNF描述文件为:
Pcnf34
120
-230
-30
-10
我们要想验证R是否是可满足的,只需要把R转化为CNF描述文件,然后调用SAT求解器求解即可,若求解器得到的是可满足的,则说明R问题为真,否则为假。
3.可满足问题解决器及主要的算法
求解SAT问题主要有两类算法:
分别是算法和算法,其中算法被公认为主流算法。
DPLL(Davis-Putnam-Logemann-Loveland)算法,是一种完备的、以回溯为基础的算法,用于解决在合取范式(CNF)中命题逻辑的布尔可满足性问题;也就是解决CNF-SAT问题。
该算法的实质是使用深度优先搜索的分支限界(DepthFirstSearchBranch,简称DFSBranch)算法。
算法伪代码程序如下:
DPLL算法将给定的CNF的解空间(变量可能取值的空间)组织为一个如下图所示的一个二叉树形结构,树中的每个节点代表一个变量,节点的两个分支分别对应变量“真”
(1),“假”(0)两种可能的取值,从根节点搜索这棵树,如果树被遍历完了,仍没有发现使CNF为真的变量赋值,则CNF是无解的(不可满足的),否则,至少有一组变量赋值使CNF为真(即问题是可满足的)。
例如:
F1={
}
该二叉搜索树的变量选择判定是根据计算步骤如下:
首先分别计算该CNF中每个子句中都含哪些变量,例如x1,则其权重为1
:
在该子句中x1的权重为1/3,x2=1/3,x3=1/3
:
x1的权重为1/2,x6=1/2
:
x1=1/2,x4=1/2
:
x1=1/2,x5=1/2
:
x1=1/3,x2=1/3,x6=1/3
然后求x1的正负文字的总权重之和,然后按从大到小进行排序,生成下面所示的二叉搜索树:
X1的总权重:
1/3+1/2+1/2+1/2+1/3=13/6
依此类推的求总权重:
然后排序画二叉搜索树,
为什么这样做,主要是因为:
我们都知道,子句越短,其影响因子就会越大,对冲突学习的影响也就越大,所以这样可以更快的发现冲突,减小冲突的回溯层数,然后回溯的时候可以快速的剪枝掉这些冲突的,从而减小搜索空间,减少不必要的遍历搜索的过程,下面我会讲到如何寻找冲突的矛盾变量,并生成冲突子句,然后剪枝,加快求解的速度。
,如果我让在上面的二叉搜索树上,先预处理把使F不满足的都剪掉,然后再利用DPLL算法进行可满足性求解,就减少了很多无解的空间了。
把a=0分支剪掉
A=1并且b=1的也剪掉
A=1并且c=1的剪掉
在搜索树中的每一个节点,进行如下操作:
1)变量决策:
选择一个变量并给它赋值0或1;
2)逻辑约束推导(BooleanConstraintPropagation,简称BCP):
根据布尔逻辑约束更新受赋值变量影响的子句;
3)冲突分析与回溯(ConflictAnalysisandBacktracking):
分析由于本次赋值导致矛盾的子句,并根据情况恢复本次赋值前的状态;
实际上,大部分基于DPLL算法都是对上面提到的三个方面进行改进和提高,以加快问题的解决。
下面分别介绍这三个方面的研究情况。
1)变量决策。
变量分支决策一般基于启发式策略,由解决器根据问题的实际情况来选择,对于不同的类别的CNF,需要采用具有针对性的启发式方法,总的来说,选择的变量分支在二叉树中所处的层次越高,被减除的搜索空间就越多,越有助于问题的解决。
2)BCP过程。
假设变量X被选中进行赋值测试,且首先给x赋值1(真),那么所有包含文字X的子句都将得到满足,从而可以将这些子句从原来的CNF移除,这有可能导致出现新的一元子句,由于一元子句必须得到满足,因此X的赋值将推导出新的变量赋值。
这个过程不断重复,直至:
a.找到使CNF得到满足的解;b.当前没有一元子句出现;c.发现2个互为矛盾的一元子句。
其中的一个发生。
3)冲突分析与回溯。
当发生冲突时,必须进行回溯至最近导致冲突发生的根源状态,取消相应的操作,然后选择另一个分支。
例如,在上面的例子中,如果最近的赋值X=1导致冲突,则因X=1产生的操作都将被撤销以恢复到赋值前的状态,然后选择X=0赋值进行测试;如果X=0仍然导致冲突,则继续从选择X分支处回溯。
这种最简单的回溯方式称为同步回溯,效率不高,如果在BCP过程中加入矛盾分析,有可能发现与赋值甚至变量选择无关的原CNF固有的逻辑关系或者逻辑赋值,显然,在回溯时,这些固有的逻辑关系和赋值是不需要撤销的,这种回溯方式称为非同步回溯,通常采用对唯一蕴含点(UniqueImplicationPoint,简称UIP是指所有形成冲突的本次推理都经过的节点,如图下图所示:
)
此外,在BCP过程中如果能尽快找到失败性的文字(FailedLiteral,简称FL,指那些使某个子句不满足的文字的赋值),那么FL的反相位赋值必然是强制文字(ForceLiteral),这意味侄儿在对该文字而言,赋值时不需要分支决策。
由于失败性文字检查(FailedLiteralDetection,简称FLD)需要对每个未赋值的变量进行,花费代价过大,所以一般我们只选择二元子句中出现最多的变量进行检查,这样可能导致大量的一元子句的产生,容易产生矛盾,可以加快问题的分析和解决。
冲突分析和学习机制:
不同的cut代表不同的学习模式:
Cut1=v1’+v3’+v5+v17+v19’(可以作为冲突子句加入到子句库中)
Cut2=v2+v4’+v8’+v17+v19’(可以作为冲突子句加入到子句库中)
Cut3=(v11’+v6+v13+v4’+v8’+v17+v19)
再者如已存在子句库中的子句(v16’+v12+v2’),我们可以用先辈子句文字替换掉该子句中的相应文字将v16’和v12替换成先辈文字即(v2’+v6+v11’+v13)可以让学习机制更有效,但是也有例外的情况下,就是该上面的蕴含图要是个树结构,则学习到的这些子句本来就是原子句,将起不到作用,还白回溯寻找先辈文字,浪费时间,所以有的学者想到了一种叫做随机重启的方法,其做法就是周期的取消所有赋值,然后将搜索过程恢复到最初的原始状态。
我们会考虑重启不会破坏求解过程吗?
其实不会因为被搜索过的解空间得到的信息已经被学习子句记录下来了。
4.基于优化冲突集提高下界的MAXSAT完备算法
最大可满足性问题(MaximumSatisfiabilityProblem,MAXSAT)是SAT问题的一个重要扩展,其目标是找到一组真值指派使得合取范式中满足的子句数最多。
SAT问题可以看做是MAXSAT问题的一个特例,若MAXSAT问题求得的最优解与合取范式所含的子句数相等,则表示所有子句满足,那么SAT问题的解就为“是”,否则为“否”。
MAXSAT问题在现实生活中有着广泛的应用,因为很多实际问题求解更多时候需要一个最优解而不仅仅是“是”或者是“否”的判断,如对于组合拍卖问题,每个买家会挑选若干个商品并给出自己的价格,在每件商品不能同时卖给两个以上买家的约束条件下,相比是否能满足所有买家的需求,拍卖这更关心如何获得最大收益。
一般的SAT算法一旦找到一个当前赋值下不满足的子句,即回溯,但对于MAX3SAT问题,仅当不可满足子句数大于等于当前最少不可满足子句数时才回溯。
MAXSAT问题可分为4类:
(1)不加权MAXSAT,每个子句权重为1.
(2)加权MAXSAT,每个子句可有不同的权重。
(3)偏MAXSAT,合取范式中必须被满足的子句称为硬子句,不一定被满足的子句称为软子句,偏硬子句条件下,使得满足的软子句数最多。
(4)加权偏MAXSAT,在偏MAXSAT基础上,软子句可有不同的权重。
目前,MAXSAT完备算法主要分为两类,一类是基于SAT不可满足的内核(Unsatfiablilitycores),利用SAT问题求解技术,如冲突子句学习,非时间序列回溯来寻找不可满足的内核,如subsat,Qmaxsat,Wbol.6等,另一类是基于深度优先的分支限界方法,在当前分支点,若不可满足子句数的下界大于等于当前不可满足子句数的上界,则可以提前剪枝。
如Incwmaxsatz,Akmaxsat等,前一类算法在工业算例和构造算例上有很大的优势。
该文作者在Li等人提出的Maxsatz的基础上,通过使用推理规则优先,单子句排序以及进一步失败文字检测3个优化冲突集的策略,提出了改进的算法Maxsatz2013。
5.Maxsatz算法框架
本节给出该算法的基本概念和其算法框架
有些基本概念在前面已经介绍了,我在此就介绍一些还没介绍的,首先我要介绍的是MAXSAT问题。
MAXSAT问题定义:
给定命题变元集合V和子句集C,寻找一组关于V的真值指派使得C中满足子句数最多。
单子句传播,单子句满足唯一可能性是单子句中的文字为真。
单子句传播(UnitPropagation,UP)是指令某个单子句满足,简化合取范式F的过程,具体操作如下:
过程1,单子句传播.
Input:
单子句ci
Output:
空子句或化简之后的F
1.令单子句ci中的文字l为真;
2.检查其余子句,对形如
含有文字L的子句,移除整个子句,因为该子句已经满足;
3.对形如
含有
的子句,删除文字
,简化子句为
,特别地,当子句只含有一个文字
,该子句简化为空子句;
4.若有空子句产生或无新的单子句产生,单子句传播结束,否则,对步骤3产生的新的单子句重复以上步骤。
5.冲突集。
对任意一组V上的真值指派,若子句集C至少有一个子句不可满足,则称C为冲突集,记为
,如两个冲突集的交为空,则称它们是相互独立的。
6.极小冲突集。
若从冲突集
中移除任意一个子句后,其余的子句均可满足,则称
为极小冲突集。
7.寻找冲突集的方法:
通常利用单子句传播来寻找冲突集。
例1.设F1=
{
}
子句x1的单子句传播过程是:
定义9合取范式的等价性,MAXSAT问题中,F1与F2两个合取范式是等价的当且仅当F1与F2对每一组真值指派都有相等的不可满足子句数。
定义10失败文字,若令文字L为真,进行单子句传播,可推导出一个空子句,则称L为失败文字。
MAXSAT完备算法求解目标由求解最多满足子句数可等价转换为求解最少不满足子句数,对于一个长度为K的子句来说,有2的k次方种真值指派,仅当子句中所有文字都为假时,该子句不满足,而对于其余的2的K次方-1种真值指派,该子句都满足,在未得到变元完整的真值指派情况下,算法利用检测冲突集方法可计算出合取范式中至少有多少子句不可满足。
因为此求解最少不满足子句数比求解最多满足子句数要方便好求非常多。
算法中的上界(UP)是在当前最优的一组完整真值指派下,合取范式F的不满足子句数,其初始值为F的所有子句数。
下界(LP)是在当前分支点,F不可满足子句的一个下界,其初始值为0。
下界的保守估计:
对下界进行估计时,算法需要保证CNF的等价性,在MAXSATz算法中,下界值得估计工作主要包含两个部分,UP检测和失败文字检测两个方法
1)UP检测是依次对合取范式F中的单子句进行单子句传播,以便找到由该单子句传播导致的冲突集。
这部分主要运用了以下6个规则。
利用下面这六条规则进行进一步推理产生空子句,从而得到冲突集和极小冲突集。
2)单子句排序:
效率高的分支限界算法要求有好的分支变元选择策略和有效的冲突集检测方法,本文采用的是将变元的正负文字在一元子句集,二元子句集和三元子句集中出现次数之和作为该变元的分数,即:
Score(x)=|C|
(x)+8*|C|
(x)+|C|
(x)+|C|
(
)+|C|
(
)+|C|
(
)
3)进一步失败文字检测:
进一步失败文字检测是在变元xi为真或为假,
不能都产生空子句时,继续向前一步检测的方法.其
原理下图所示.
进一步失败文字检测原理
如图表示在进行失败文字检测时,令xi=1进行up可以产生空子句,xi=0进行up未产生空子句,失败文字检测寻找冲突集不成功.Maxsatz2013在由xi=0赋值简化后的CNF’中,继续检测变元xj,若xj=0和xj=1进行up均产生了空子句,则从xi出发到3个空子句路径上出现的子句,构成的集合是一个冲突集,下界加1.进一步失败文字因搜索空间大,所以计算成本高且找到的冲突集规模大.但实验显示进一步失败文字检测仍有助于提高算法下界,缩短运行时间.该函数表述如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SAT 问题 求解