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

博文

振奋!每个华人一看就会做这个世界难题

已有 3145 次阅读 2016-12-4 08:51 |个人分类:SAT问题|系统分类:科研笔记| 子句消去法, SAT问题

振奋!每个华人一看就会做这个世界难题

将若干个逻辑变量及其非的形式“或运算”组成的表达式,再进行“与运算”,这些变量都取什么值会使结果为“真”?这就是所谓的世界难题SAT

以往SAT问题没有快速求解方法,上百个变量,即使用计算机也无法在短时间内求出能够成立的满足解。下面介绍的子句消去法只要你熟悉汉字,会做算术题,就能快速地计算出SAT问题的满足解!

1.    01表示题目

CNF=(x1’+x2’+x3’)(x1’+x2+x3’)(x1+x2’+x3)(x1+x2+x3’)(x1’+x3+x4’)(x1’+x3+x4)(x3’+x4’+x6)(x3+x5’+x6’)(x3’+x5’+x6+x10)(x3+x5+x6+x10)(x6+x7+x8’)(x6+x7’+x8) (x6’+x7 +x8’)(x8’+x9)(x8+x9)(x10’)             

CNFSAT题目,“+”是或运算符号,“”是变量非运算符,与运算符省略。用“1表示x,用“0表示xCNF就可以用表1来表示。

1

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

2.    子句块和变量唯一解

CNF每个括号内的多项式叫子句。变量相同的子句称为子句块。有k个变量的子句块叫k阶子句块。k阶子句块最多能有2k个子句,这个子句块称为完全块

判定无解:有完全块的CNF一定没有结果为“真”的解!

判定变量唯一解k阶非完全块有2k-1个“0”或“1”,它就是这个变量的唯一解。

3.    解题方法(1)    消去变量唯一解子句

首先检查变量唯一解,有则设定这个变量值,消去这个变量有这个值的子句。如表1中二阶子句块x8x9和一阶子句块x10都有变量唯一解,所以设定x9=1,x10=0,然后消去相关子句。结果见表2

2

 

 

 

 

 

 

 

 

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

 

 

 

(2)    找出变量唯一可选解

逻辑变量只能取值01。如果一个变量不论取值0还是1,消去相关子句都会剩下完全块或矛盾值,那么就知道CNF没有“真”值解。如果只有一个值使剩下的是完全块或矛盾值,那么就可以取这个变量的另外一个值,消去相关子句(两个值都剩下非完全块,暂时不设定这个变量值)。例如x1=1会剩下完全块相互矛盾(见表3)。

3

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

 

 

 

当测试x1=1消去相关子句时,出现了完全块冲突(黄色),因而x1=1不是可选解。如果选定x1=0消去相关子句,如表4所示,没有完全子句块及变量唯一解矛盾。因而可以设定0x1的值,消去相关子句后继续求解。

注意01都不是变量可选解,那么CNF没有“真”值解!

4

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

 

 

(3)    只看关联变量可选解

确定变量可选解不必全做,只要看同属于不同子句块的变量就可以。非完全块不是关联变量一律有2个可选解(可证明)。

检测表4的关联变量x3x6的可选解,知道01都是。

(4)    任选变量值消去变量唯一解相关子句

剩下的变量都有两个可选解的时侯,有定理保证一定有解。这样就可以任意确定一个变量值,消去相关子句,再确定变量唯一解,消去相关子句。重复操作,直至没有剩余子句,最终就求出了CNF结果为“真”的满足解了。表5至表8表示了操作过程。

5  选择x6=1消去子句

0

 

 

 

 

1

 

 

1

0

x1

x2

x3

x4

x5

x6

x7

x8

x9

x10

1

0

1

 

 

 

 

 

 

 

1

1

0

 

 

 

 

 

 

 

 

 

1

 

0

0

 

 

 

 

 

 

 

 

 

0

1

0

 

 

 

6       选择x3=1消去子句

0

 

1

 

 

1

 

 

1

0

x1

x2

x3

x4

x5

x6

x7

x8

x9

x10

1

1

0

 

 

 

 

 

 

 

 

 

 

 

 

0

1

0

 

 

 

7  选择x2=1消去子句

0

1

1

 

 

1

 

 

1

0

x1

x2

x3

x4

x5

x6

x7

x8

x9

x10

 

 

 

 

 

0

1

0

 

 

 

8  选择x7=1消去子句

0

1

1

 

 

1

1

 

1

0

x1

x2

x3

x4

x5

x6

x7

x8

x9

x10

(5)    验算

对于子句消去法计算得到的全体变量值是否是CNF=1的解,是可以验证的。一种办法是将每个变量求出的值(空白可以任意取值01),代入CNF的逻辑表达式,检验最终结果是否是CNF=1

介绍一个简单的验证方法,即将所求解值置入原题(表1)的上面,检验每一行是否有与其变量值相同的子句表现值。若有,则将子句消去,若最终没有子句剩下,就说明得到的解完全正确。

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

9  验证CNF=1的满足解

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

 

4.    华人不聪明吗?

说华人不聪明是一种偏见。这个世界难题如此简单就解决了,是不是聪明智慧的表现?

据说SAT问题找到多项式时间复杂度算法就解决了P versus NP问题。P=NP

方法是简单的,理论是深刻的。

给一个100个逻辑变量的SAT题,大家可以试试。

3SAT100.xls (答案在下面附件)。

复件 3SAT100.xls

参阅:

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

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

 



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

上一篇:多项式时间复杂度和指数时间复杂度相差多少?
下一篇:将复杂问题弄简单了方显出科学人的本事
收藏 IP: 120.52.94.*| 热度|

0

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

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

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

GMT+8, 2024-12-22 11:41

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部