|||
前言:本文投给《中国科技论文在线》后说我已经在科学网上发表了。前在博客中发表的不够正规专业,因此将正规一些的再用博文发表一次,供数学计算机专业的人士讨论。
3-SAT分段子句消去法
姜咏江
摘要:本文给出了3-SAT分段消去子句的求解算法。证明了可以在多项式时间求出3-SAT的解。从而证实斯提芬.库克定义下的NP-complete问题就是一个P类问题。
关键词:NP-complete;P/NP问题;子句消去法
中图分类号:O158
The 3-SAT Algorithm by Sections
JiangYongjiang
Abstract: In this paper,I gave the remove clausemethed to get answer of the 3-SAT proplem. This is a polynomial time algorithm.It is proved the problem of NP-complete is a P class problem.
Key words: NP-complete;P/NP problem; The clause remove method
1. 引言
P/NP问题曾于2000年被美国克雷数学所定为世界头号难题[1],更有甚者说其挑战了人类智慧。所谓P/NP问题的定义是这样给出的:
复杂度类P包含所有那些可以由一个确定型图灵机在多项式表达的时间内解决的问题;类NP由所有其肯定解可以在给定正确信息的多项式时间内验证的决定问题组成,或者等效的说,那些解可以在非确定图灵机上在多项式时间内找出的问题的集合。
实际上这个定义有很多歧义。这涉及到人们对确定型图灵机、非确定型图灵机、多项式时间、问题、决定问题、肯定解、给定正确信息、验证等一系列概念的统一认识,因而很难形成统一的见解。
1971年斯提芬.库克 (Stephen A. Cook) 发表了《The Complexity of Theorem Proving Procedures》[2]才把P之外的问题归结为三大类,即 NP、NPC及 NPH。库克的分类得到了学术界的认可。库克给出的P、NP、NPC、NPH问题的定义如下:
可以在多项式时间内求出解的问题,叫P问题(Polynomial problem)。
可以在多项式的时间里验证一个解的问题,叫NP问题(Non-deterministic polynomial)。
如果所有的NP问题都存在多项式时间算法使其能够归约为某一NP问题,则称该NP问题为NPC问题(NP-complete)。
如果所有的NP问题都存在多项式时间算法使其归约到某问题,则称该问题为NPH问题(NP-hard)。
所谓的多项式时间算法,就是一种函数求解过程。显然,求解方法也是一种验证方法,因而有P类问题属于NP类问题。如果NP类问题也属于P类问题,那么就有P=NP了。学术界已经证明了所有的NPC之间都有多项式时间算法实现转化。由NPC的定义不难看出,只要找到一个NPC问题的多项式时间算法,也就等于找到了所有NP问题的多项式时间算法,于是也就证明了NP=P。
2. 典型的NPC问题
长时间以来,人们将寻找NPC类问题的多项式时间算法作为了解决P=NP问题的关键途径。一些典型的NP类问题[3](见图1所示)早已经被一些数学家证明是NPC问题了。例如,由3个逻辑变量组成的合取范式3-CNF-SAT(简称为3-SAT)满足问题、子集和问题SUBSET-SUM、旅行商问题TSP、哈密顿回路问题HAM-CYCLE等,这些都是NPC问题寻找多项式时间算法研究的热门问题。
图1 典型NPC问题及相关
Fig. 1 NPC Problems
3. 3-SAT与子句消去法
本文给出的分段子句消去法是解决如何在多项式时间求出3-SAT满足解的方法。
3.1 3-SAT定义
所谓的3-CNF就是多个由3个逻辑变量或其非组成的多项式间形成的与运算表达式。一般这种逻辑表达式被称为合取范式(CNF),多项式逻辑因子称为子句。
将逻辑变量x的非运算用x’表示,集合A={x1,x2,...,xn}, A’={x1’,x2’,...,xn’},3-CNF定义如下:
其中m是子句的数量,xij∈A∪A’.
求3-CNF=1解的问题一般叫3-SAT.
3.2 子句消去法与反子句
由逻辑代数知,逻辑多项式的任何一项值为1,则多项式的值为1。因而欲使3-CNF=1,只要每个子句的值为1就行。
定义1:设定子句中逻辑项值为1,并消去该项值为1的所有子句的方法,称为子句消去法。
定义2:将子句中的项用非运算表示得到的子句叫原子句的反子句。
定义3:子句中包含变量x与x’,则称此子句为恒一子句。
由于恒一子句的逻辑值总是1,不影响子句消去法,所以本文后面提到的3-CNF、3-SAT、 k-CNF或合取范式等一律不包含恒一子句。
4. 3-CNF表格式和关联段
分段子句消去法要用到3-CNF的表格表达方式。
4.1 3-CNF的表格式
将逻辑变量x用1表示,x’用0表示,建立的3-CNF表格式如图2所示。子句以3位二进制数的形式占表中一行,并且规定变量相同的子句行相邻。
图2 3-CNF值格式
Fig. 2 The form of 3-CNF
定义4:变量相同的子句放到一起叫子句块。
定义5:能够使子句块中全部子句消去的变量值叫块解。
4.2 关联段
定义6:由相同变量联接的子句块组称为关联段。
依据定义,图2中有5个子句块的关联段。
定义7:能使关联段中所有子句值为1的段中变量值,称为段解。
定义8:子句块间有一个共同变量的叫一元关联。子句间有2个共同变量的叫二元关联。
定义9:子句块间没有共同变量的子句块,称为独立段。
显然,3-CNF有三个共同变量的子句就是子句块。
5. 子句消去法相关定理
为了说明子句消去法对k≥3合取范式k-CNF=1求解的有效性,我们以更一般的情况来论述本节一些内容。
5.1 k-CNF的定理
定理1:所有变量值都设定之后,仍然有剩余子句存在,则设定的n位数不是k-CNF=1的解,否则是解。
证明:因为依子句消去法,消去的子句值是1,直到所有变量值设定后剩下的子句值一定是0。这些值为0的子句是合取范式的因子,必使k-CNF=0。
定理2:子句块中若有互反子句存在,则二值都不是块解。
证明:依据子句消去法,以子句的值为1消去的所有子句中不包括其反子句,因此总有其反子句不能被消去,则互反子句值都不是块解。
推论1:k-CNF中子句的反子句值不是块解。
推论2:k-CNF子句块解不超过2k-1个。
推论3:若 k-CNF中有2k个子句的子句块存在,则k-CNF=1无解。
定理3:从一个子句块出发确定的k-CNF=1解,也可以从另一子句块出发确定这个解。
证明:假设由子句块A确定的解a不是由子句块B确定的解,那么因a中必含有B的一个子句值,于是可以从这个值出发,按照a的值扩充来求解,仍然是这个合取范式的一个解。于是可知,从A做起始块或B做起始块可以得到相同的解。
由此定理可知,选择任何子句块做为起始块求解,效果一样。
定理4:n个变量的k-CNF子句块最多有Cnk个。
证明:显然k阶子句的变量是从n个变量中取出k个构成的集合,每个变量取值0或1就构成了子句块。依据排列组合知识,知定理成立。
5.2 3-CNF的定理和性质
定理5:子句块或关联段无解,则3-CNF=1无解。
证明:因为子句块解与关联段解都是3-CNF=1解的组成部分,其无解,3-CNF=1自然无解。
将独立的子句块也看成一个关联段,那么有下面定理6。
定理6:3-CNF=1的求解可以分别对各关联段求解。
证明:由3-CNF的表格式可知关联段是不重合的,并且将各关联段的解按照变量顺序组合就是3-CNF=1的解,所以可以分开求解。
定义10:子句消去过程中剩余子句块间有相同变量,则称这些子句块为动态块,消去此动态块的变量值叫动态块解。
定理7:动态块无解,则关联段无解。
证明:因为动态块变量是关联段解的组成部分,所以动态块无解,其所在关联段就无解。
定理8:确定了一个变量值的动态块其余变量的所有可能值都存在,则此次段选值不是段解。
证明:如表1所示,如果固定了左侧3列中一个变量的值,那么剩余2个变量的值可能为右侧的2列值。如果右面2列4行值都存在,则表明无论设定剩余2个变量取任何值,都不能够将动态块的子句消除干净,因此知此次选值不是段解。
表1 一个变量值确定其它变量值
Tab. 1 Situation of fixed onevariable
块子句可能值 | 固定一个变量后剩余变量可取值 | |||
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 1 |
0 | 0 | 1 |
|
|
1 | 0 | 1 |
|
|
0 | 1 | 1 |
|
|
1 | 1 | 1 |
|
|
推论4:动态块确定一个变量值后其余2变量有3组值,则有惟一动态块解;两组或一组值,则有多个动态块解。
推论5:子句块中变量有4子句同值,取其它值可无解。
定理9:连续多值可选的关联段最终可确定段解。
证明:3-CNF求解中只有一个变量值确定的动态块可以产生多解。若设定关联变量值后的剩余动态块仍然有多值可设,则可连续查找关联块,直至无解、有惟一解或有关联段的结束动态块出现。如果最终出现关联子句块无解,则关联段无解。如果出现子句块块有唯一解,可反方向设定关联变量值去确定前面每个多值动态块的解;如果多解情况最终关联的是未曾设定解的子句块,可以把子句块解设定,然后反方向去确定多解的动态子句块,最终会连成一个关联段,得到关联段的解或无解。
6. 3-SAT分段消去算法
运用子句消去法,可以按照关联段设定变量值,消去子句,逐步对3-CNF=1求解。
6.1 关联段子句消去法
运用子句消去法,可以按照关联段设定变量值,消去相关子句,逐步对3-CNF=1求解。对没有8个子句的子句块组成的数值表3-CNF,进行如下步骤的操作可以求出满足解。
(1)将所有子句块中一个变量有4个相同值的变量设定其值,消去相应子句;
(2)对形成表2右侧3种类型子句的动态块和只需设定一个变量值的动态块求出唯一解,并消去相应子句;
(3)设定所有多解的剩余子句块的解,优先处理可能形成无解的情况。
如果前面都是唯一解的情况,遇到了无法回避的表3的无解情况,那么3-SAT无解。
依据子句消去法,若所有的关联段都有解,那么3-CNF=1就有解。其解为各关联段解的组合。
6.2 关联段子句消去法实例
图3给出了用分段子句消去法求3-CNF=1的例子。
首先,本例的子句块x1x2x3选x3=0;子句块x3x4x5选x5=0;子句块x4x5x6选x6=0(见图3(1))。
其次,消去相应子句后,有x5x6x8动态块必需确定x8=0(图3(2))
最后,消去相应子句后,剩下了有多解的关联段(图3(3)),可以设定x1=0、x2=1将全部剩余子句消去。此3-CNF=1有解010*00*0***。
图3 3-CNF=1求解过程
Fig. 3 procedue of the remove clauses
6.3 分段子句消去法的多项式时间复杂度
分段子句消去法,将3-CNF的子句分成了相互关联的段,并以段解来组成3-CNF=1的解。由于关联段是不重复的,所以3-CNF的关联段最多有[n/3]个,此时最多有一至两个子句块之间关联,其余子句块都是独立的。
由于3-CNF的每个关联段都可以一次求段解操作,因而用分段子句消去法求出3-CNF=1的解或判定无解,最多需要进行[n/3]段消去子句的过程。从这一点来说,用分段子句消去法求3-CNF=1的解是一个O(n)时间复杂度的算法。
其实,3-CNF=1是否有解,主要取决于子句数m和子句分配的结构,亦即子句之间关联的程度。3-CNF关联段子句越多,3-CNF=1的解就越少,反之解的数量会很多。当所有子句块只有一个子句并且都是独立块时,3-CNF=1会有最多的解。
7. 结论
3-SAT求满足解的分段子句消去法是一个多项式时间复杂度的算法。本算法证明了典型的NP-complete问题之一3-SAT是一个P类问题。依据学术界公认的观点,分段子句消去法可以说明P=NP。
[参考文献](References)
[1]https://en.wikipedia.org/wiki/P_versus_NP_problem
[2] Steven Cook. The complexity of theorem proving procedures. In Proc. ThirdAnnual ACM Symposium on the Theory of Computing, pages 151-158,1971.
[3] Thomas H. Cormen Charles E. LeisersonRonald L. Rivest Clufford Stein. Introduction to Algorithms,Third Edition,pages1082-1104,2009.
[4] Gilles Brassard and Paul Bratley. Fundamentals of Algorithmics. PrenticeHall,1996.
附加一个例题:100个变量的3sat求解.xls
2015年11月22日补充修改
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-22 14:31
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社