CMP设计分享 http://blog.sciencenet.cn/u/accsys 没有逆向思维就没有科技原创。 不自信是科技创新的大敌。

博文

千禧难题P与NP问题(科普2)

已有 3009 次阅读 2016-11-19 13:42 |个人分类:P/NP问题|系统分类:科普集锦| 子句消去法, SAT问题

千禧难题PNP问题(科普2

姜咏江

2. SAT问题求解方法

PNP问题之所以能够称为世界难题,这是因为这个问题最早要追溯到上个世纪50年代,数学家库尔特·哥德尔向计算机发明人之一冯诺依曼的提出了这个问题。1971年斯提芬.库克给出了NP类问题的定义,之后被学术界接受。现在已经有很多问题被证明了是NP问题,但是一直没有人能够确切证明NP问题就是P问题,或者NP问题不可能是P问题。其实,推翻一个证明的最好方法,就是找到一个反例。

世界各国的数学家和计算机专家都没有停止过寻找NP类问题是P类问题的例子。我是一个主张NP=P的人,因为我找到了SAT这个基本的NP类的多项式时间计算方法——子句消去法。

2.1  SAT问题的概念

 什么是SAT问题?“若干个逻辑变量和变量非形式组成的多项式,求它们与运算结果为真的解问题”就是SAT。这种逻辑运算式叫合取范式(用CNF记),每个因子多项式叫子句,单一变量的逻辑项被称为文字。例如合取范式

CNF=(x1’+x2’+x3’)(x1’+x2+x3’)(x1+x2’+x3)(x1+x2+x3’)(x1’+x3+x4’)(x1’+x3+x’)(x3’+x4’+x6)

(x3+x5’+x6’)(x3’+x5’+x6+x10)(x3+x5+x’+x10)(x6+x7+x8’) (x6+x7’+x8) (x6’+x7 +x8’)(x8’+x9)

(x8+x9) (x10’ )

求使这个逻辑表达式CNF=1时的10个逻辑变量值,这就是SAT问题。

合取范式CNF可以用数码“0”和“1”来表示。上面这16子句用0和1表达出来,就如1所示,1代表变量本身,0表示变量的非形式。

1 CNF01表示

x1

x2

x3

x4

x5

x6

x7

x8

x9

x10

0

0

0

 

 

 

 

 

 

 

0

1

0

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

1

1

0

 

 

 

 

 

 

 

0

 

1

0

 

 

 

 

 

 

0

 

1

1

 

 

 

 

 

 

 

 

0

0

 

1

 

 

 

 

 

 

1

 

0

0

 

 

 

 

 

 

0

 

0

1

 

 

 

1

 

 

1

 

1

1

 

 

 

1

 

 

 

 

 

1

1

0

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

0

1

0

 

 

 

 

 

 

 

 

 

0

1

 

 

 

 

 

 

 

 

1

1

 

 

 

 

 

 

 

 

 

 

0

1的表头是逻辑变量,每一行是一个子句。每列的01叫表头逻辑变量的表现值(文字)。求CNF=1的解写在表头的上面。

1中相同变量组成的子句叫子句块。具有共同变量,但变量不完全相同的子句块间称为关联子句块。通过关联子句块连接在一起的全部子句块叫关联段。关联段和关联段之间没有共同的变量。

1的全部子句块组成了一个关联段。

2.2        限位数理论

长时间人们对SAT问题没有有效地求解方法,这是因为没有找到CNF特有的内在结构特点。虽然许多人也将SAT问题用二进制数码表示,但没有新的理论支撑,也未曾找到解决的办法。

限位数是用一定位数的数码排列得到的数,它与普通数不同是无效0不能省略。限位数理论是机器算术运算设计的基础理论,又是解决纯离散数学计算的基础。

k位二进制限位数共有2k个,其值由0直排到2k-1。如果k位二进制数超过了2k个,那么就一定出现了重复的数。2列出的是3位二进制限位数,共有23个。

2容易理解,全部的k位二进制限位数纵向排列,每一列01的数量都是2k-1个。如果将一列的01的行都去掉,不考虑消去的那一列,那么剩下的那些行,就一定是k-1位的所有二进制数。这一特点就成为了子句消去法判断变量唯一解和CNF=1无解的依据。

两个数码相加结果是最大数码,称它们是互为反码。一个k位二进数的每个数码用其反码替换,得到的数叫原来数的反码数。每个表示子句的数都有唯一一个反码数。由表2不难理解这个结论。

2  三位二进制限位数

x1

x2

x3

0

0

0

0

0

1

0

1

0

0

1

1

1

0

0

1

0

1

1

1

0

1

1

1

2.3        子句消去法

CNF的子句中如果有一个文字的值是“真”,那么这个子句的值就是“真”。要求整个CNF的结果是“真”,必须全部子句的值都是“真”。根据这一原理,只要子句中有一个文字x,我们就设x为“真”,那么子句的值就是“真”,子句中有一个文字为x’,就可以设x为“假”,同样会让这个子句的值是“真”。在求CNF结果是“真”的时侯,用这种方法将子句设定为“真”之后一一去掉,只要变量不重复设值,最后全部子句都去掉了,那么设定的那些值就是使CNF为“真”的解,不然就不是使CNF为“真”的解。

上面的这种做法并不能保证每次设定的全部变量值是CNF=1的解。能不能有确定的方法让每次设定的变量值都是CNF=1的那些值?姜咏江发明的子句消去法解决了这个问题。

由表2所示子句的01表示方法可以知道,如果一个子句块的所有子句都存在,那么不论我们如何设定变量的值,都不可能将全部子句消去。这种情况只要看一个变量的的数量就可以判断。如果k个变量的子句块有一个变量有2k-10,同时还有2k-11,那么肯定这个变量不论设定0还是1,都不可能使这个子句块的全部子句值为1。由于子句之间是与运算的关系,所以CNF中至少有一个子句的值是0,那么合取范式CNF的值一定是0,也就是CNF=1无解。

我们把k个变量的子句全存在的子句块叫完全子句块。进一步分析可知,完全子句块用设定变量值的方法,不可能将它的全部子句消去,因而CNF的值必定是0。如果我们在设定变量值的时候能够避开出现完全子句块,你就会找到满足CNF=1的解。

在设定变量值的时候,能不能避开完全子句块呢?这一点我们现在可以做到了。根据前面的限位数理论,如果一个k个变量的子句块中,有一个变量有2k-1个相同的0(或1),而不同时有2k-1个相同的1(或0),那么设定这个值,消去子句,就不会有k-1个变量的剩下完全子句块,即设定这个变量值就不会使CNF=1无解。这种情况下的变量称为有唯一解。

规则1:子句块变量有唯一解必须首先设定。

1中的子句块x10和子句块x8x9就属于规则1的情况。设定x10=0x9=1,然后消去值为的子句,得到表3

3  设定唯一解消去子句

 

 

 

 

 

 

 

 

1

0

x1

x2

x3

x4

x5

x6

x7

x8

x9

x10

0

0

0

 

 

 

 

 

 

 

0

1

0

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

1

1

0

 

 

 

 

 

 

 

0

 

1

0

 

 

 

 

 

 

0

 

1

1

 

 

 

 

 

 

 

 

0

0

 

1

 

 

 

 

 

 

1

 

0

0

 

 

 

 

 

 

0

 

0

1

 

 

 

1

 

 

1

 

1

1

 

 

 

1

 

 

 

 

 

1

1

0

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

0

1

0

 

 

3中剩下的子句块中没有唯一解的变量了。剩下的子句块形成了一个关联段。由于每个逻辑变量都只能取值01,我们不妨设定1,看看会不会使CNF=1无解。如果无解,这个值肯定不能选,但不能就完全确定CNF=1无解,还要看看另外一个变量的值。这就有了变量可选解的概念。

什么是变量可选解呢?

在无变量唯一解的CNF中设定变量的一个值,并消去使值为的子句后,剩下子句块按照变量唯一解继续消去子句,如果剩下的子句块中没有变量唯一解,且子句块都不是完全子句块,则称设定的那个变量值是变量可选解。

根据可选解的定义,如果剩下的子句块有完全子句块,那么这次最初设定的变量值就不是它的可选解。由于逻辑变量可以取01两个值,于是还可以查看另一个值是不是可选解。如果只有一个值是可选解,那么这个值就一定是变量在关联段中的唯一解,如果都不是变量的可选解,那么CNF=1是不会有解的。如此,求CNF=1的解在无法确定变量唯一解的情况下,必须象除法运算一样,先要“试值”,然后才能确定变量的取值。

对于表3的剩余CNF,我们先测试x1=0,消去子句,发现剩余子句块没出现变量唯一解和完全子句块,这说明0x1的可选解(见表4)。

我们再测试x1=1,消去子句,发现x1=1剩余子句块x2 x3x3 x4出现了唯一解矛盾,即x3无法取值。这说明1不是x1的可选解(见表5)。

由此我们得出了0x1在关联段中的唯一解。按照表的过程来设定x1=0,消去子句,得到表6

4  x1=0是可选解

0

 

 

 

 

 

 

 

1

0

x1

x2

x3

x4

x5

x6

x7

x8

x9

x10

0

0

0

 

 

 

 

 

 

 

0

1

0

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

1

1

0

 

 

 

 

 

 

 

0

 

1

0

 

 

 

 

 

 

0

 

1

1

 

 

 

 

 

 

 

 

0

0

 

1

 

 

 

 

 

 

1

 

0

0

 

 

 

 

 

 

0

 

0

1

 

 

 

1

 

 

1

 

1

1

 

 

 

1

 

 

 

 

 

1

1

0

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

0

1

0

 

 

 

5  x1=1不是可选解

1

 

 

 

 

 

 

 

1

0

x1

x2

x3

x4

x5

x6

x7

x8

x9

x10

0

0

0

 

 

 

 

 

 

 

0

1

0

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

1

1

0

 

 

 

 

 

 

 

0

 

1

0

 

 

 

 

 

 

0

 

1

1

 

 

 

 

 

 

 

 

0

0

 

1

 

 

 

 

 

 

1

 

0

0

 

 

 

 

 

 

0

 

0

1

 

 

 

1

 

 

1

 

1

1

 

 

 

1

 

 

 

 

 

1

1

0

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

0

1

0

 

 

 

6  剩下的子句块

0

 

 

 

 

 

 

 

1

0

x1

x2

x3

x4

x5

x6

x7

x8

x9

x10

1

0

1

 

 

 

 

 

 

 

1

1

0

 

 

 

 

 

 

 

 

 

0

0

 

1

 

 

 

 

 

 

1

 

0

0

 

 

 

 

 

 

0

 

0

1

 

 

 

1

 

 

1

 

1

1

 

 

 

1

 

 

 

 

 

1

1

0

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

0

1

0

 

 

对于无变量唯一解的子句块组成的关联段,有定理可以证明“非关联变量一定有2个可选解。”因而测试变量可选解只要对关联变量进行就可以。对于表6的关联段,只要测试x3x6的可选解数量即可。

象测定x1的可选解一样,测出x3x6都有2个可选解。于是知,表剩余的CNF的每个变量都有2个可选解。根据变量可选解的定义,随便设定一个变量的1值,都不会在消去子句后出现完全子句块,也即不会出现无解。因此可以有

定理:由全是2个可选解变量构成的CNF,任意从一个变量设定值,用变量唯一解消去子句,最后总可以得到CNF=1满足解(这个定理的证明请见附件)。

对于表6,我们设定x6=1,再设定x3=1,消去相关子句,得到表7

7  设定x6=1,再设定x3=1

0

 

1

 

 

1

 

 

1

0

x1

x2

x3

x4

x5

x6

x7

x8

x9

x10

1

1

0

 

 

 

 

 

 

 

 

 

 

 

 

0

1

0

 

 

x2有唯一解1。而x7x8只要设定x7=1,或x8=0,就可以将全部子句消去,从而知011**11*10011**1*010都是表1CNF=1的满足解。

2.4        验证子句消去法的满足解

子句消去法计算得到的全体变量值是不是CNF=1的解?这是可以验证的。一种办法是将每个变量求出的值(*可以任意取值01),带入CNF的逻辑表达式,看看最终结果是不是1

这里介绍一个简单的方法,就是将结果放到表1的上面,看看每一行是否有与上面变量值相同的子句,有则将子句消去,最终没有子句剩下,就说明是解,不然就说明计算的过程出现了错误(见表8)。

8  满足解验证

0

1

1

 

 

1

1

 

1

0

x1

x2

x3

x4

x5

x6

x7

x8

x9

x10

0

0

0

 

 

 

 

 

 

 

0

1

0

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

1

1

0

 

 

 

 

 

 

 

0

 

1

0

 

 

 

 

 

 

0

 

1

1

 

 

 

 

 

 

 

 

0

0

 

1

 

 

 

 

 

 

1

 

0

0

 

 

 

 

 

 

0

 

0

1

 

 

 

1

 

 

1

 

1

1

 

 

 

1

 

 

 

 

 

1

1

0

 

 

 

 

 

 

 

1

0

1

 

 

 

 

 

 

 

0

1

0

 

 

 

 

 

 

 

 

 

0

1

 

 

 

 

 

 

 

 

1

1

 

 

 

 

 

 

 

 

 

 

0

如果x7不选,让x8=0,也可以将全部子句消去,从而完成解的验证。

2.5        总结

完成用子句消去法求SAT问题满足解要运用两个规则。

规则1:子句块变量有唯一解必须首先设定。

规则2:子句块无变量唯一解,先设定变量唯一可选解。

SAT问题长期没能解决的原因是没有得到其特殊的结构规律造成的。

我相信,只要能够找到NP问题的具体规律都会通过计算推导的方法获得解决。

关于理论上的子句消去法深层次证明请看:

http://blog.sciencenet.cn/blog-340399-1009188.html

http://blog.sciencenet.cn/blog-340399-1011907.html 

 

 

2016-11-19

 

 



https://blog.sciencenet.cn/blog-340399-1015636.html

上一篇:千禧难题P与NP问题(科普1)
下一篇:确定问题判定问题决定问题和验证问题
收藏 IP: 120.52.92.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-3 08:27

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部