科学网

 找回密码
  注册

tag 标签: 多项式时间复杂度

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

我似乎感觉完成了一项重大任务
热度 2 accsys 2017-2-18 18:30
姜咏江 今天得闲,浏览了 ECCC 网站,好像是以色列主办的,过去没接触过。浏览 2017 年的文章,首先被 ScottAaronson 教授的 P ? = NP 一文所吸引。文章太长,总而言之是 P/NP 问题很难,很重要等,没见到问题已经解决的字样。 数学证明具有很强的逻辑性,但基础是概念和事实。文中提到尚未见到多项式时间的算法出现,因而难说 P 与 NP 是否相等。我所做的工作正是找到了 SAT problem 这个 NP-complete 问题的多项式时间算法,因而我想 Scott Aaronson 的文章落后了。 P/NP 问题很多人走的是企图用旧有的概念和方法去证明两者之间的关系,失败的原因就是没有见到一个 NP-complete 问题的多项式时间算法,又不能肯定这种算法是否存在,也就是缺乏事实依据,缺乏应有的概念,故而没法用逻辑来推导出确定正确的结论。 多见证明文章冗长,几乎都成了一本书,早就失去了数学证明的特色,难免出现逻辑或概念上的偏差,也不易被人完全读懂,自然让人们认可起来也相当困难。这大概是 P/NP 问题证明的盲点。 我所追求的是具体的 SAT 问题算法,以子句消去法这个算法去探讨多项式时间复杂度,进而踩在库克的肩膀上,去说明了 P=NP 罢了。 子句消去法可以在多项式时间内求出 SAT 的满足解,前文已经提到。昨天又将《 All Solutions of SAT by Eliminate Clause and Its Possible Solutions Method 》一文放到了 arXiv.org 网站上,编号 1823386 。之前还放上了《 Clause Elimination Method for Vertex Cover 》,编号 1791707 ;《 Solve the Maximum Clique by the New Data Structure 》,编号 1791794 。毫无疑问,运用文中介绍的算法都可以证明在多项式时间将需要的解求出来。 这些论文都以介绍实际算法为主,进而依据算法的实际来证明这几个 NP-complete 问题,都可以针对最坏的情况,在多项式时间获得解答。因为我实实在在地给出了前所未有的算法,因而我有充分的底气,敢说 P=NP 。 Scott Aaronson 教授什么时候能够见到我的子句消去法和以上的论文,或许会惊讶。也许这几篇论文不太 English ,我猜他也会理解我的算法,也会写出新的论题。 事实是概念的基础,正确概念是论证的基石 。 2017-2-18
个人分类: P/NP问题|3540 次阅读|3 个评论
破解SAT问题必须要解决的几个层次问题
accsys 2017-2-6 05:52
姜咏江 逻辑变量的可满足性问题 SAT 的破解,用子句消去法求解需要解决五个层面的问题。 第一, k 阶子句块什么情况下无解? k 阶子句块有 2 k 个不同的子句,则一定无解。例如, 3 个变量的子句块如果有 8 个不同的子句,那么合取范式 CNF=1 一定无解。改变一下判断方法:一个变量在 k 阶子句块中有 2 k-1 个 0 和 1 ,那么 CNF=1 一定无解。 第二, 什么情况下变量在子句块中有唯一解? 在 k 阶子句块中变量只有 2 k-1 个 0 或 1 (不同时有)。例如,三个变量的子句块中某变量有 4 个 0 ,那么这个变量必须取值 0 。 第三, 不同子句块中的同一个变量什么情况下无解? 这就是变量在不同子句块中都有唯一值,但出现了矛盾。即一个值是 0 ,同时在另一个子句块中必须是 1 ,这时合取范式 CNF=1 无解。 第四, 变量的值不是 0 就是 1 ,可以选择哪个? 变量在子句块中虽然可以取值 0 或 1 ,但由于子句块间的关联关系,变量取值要受到制约。子句消去过程中不产生矛盾的变量值叫变量可选解。 可选解有一个的变量就是关联变量的唯一解 。有两个可选解的变量取值,放到最后每个变量都有两个可选解的情况处理。 第五, 每个变量都有两个可选解,如何选择变量值 ? 这种情况下合取范式 CNF=1 一定有解,但选择值时要避免出现矛盾。因为当前面的变量已经取定 0 或 1 的时侯,后面的变量要选择 0 或 1 ,就要满足前面变量取值的交叉关系,不能出现矛盾选择(有定理保证存在不矛盾取值)。 子句消去法的基本思想是:先将必然选择值的变量确定后,消去相关子句,然后处理可以任意取值的变量,但要避免选择的矛盾。 如果以上五个层面的问题都在消去子句的过程中处理好了,那么任何合取范式的求解都不在话下。 SAT 问题最复杂的情况是每个变量都有两个可选解。这时必须将它们的可选解值列表,当要每次选择变量值时,查表依据前面选定值来确定这个变量的值。 由于 SAT 的二进制数表示的子句总数不超过 2C n 1 +2 2 C n 2 +2 3 C n 3 +...+2 (k-1) C n k-1 +2 k C n k , k 是常数,这就是一个 k 次多项式,子句消去法以子句为处理的基本单位,因而子句消去法算法的时间复杂度不会超过 O( n k+1 ) 。 k 是小于 n 的常量。上面这个多项式与 2 n 相比,只有当 n 大到一定程度,才会体现出多项式算法的“快速”性。如果 k 很大,仍然会感到“很慢”,但由于合取范式 CNF 有很多特别情况,研究这些特别情况,可以得到比 DPLL算法 快得多的算法。 2017-2-6
个人分类: SAT问题|3819 次阅读|0 个评论
基于3SAT问题说明子句消去法的多项式时间复杂度
accsys 2016-12-8 08:44
基于 3SAT 问题说明子句消去法的多项式时间复杂度 姜咏江 为让大家能理解子句消去法的多项式时间复杂度特性,本文就以 3SAT 问题来简单说明。三个变量的子句在施行子句消去法的过程中,也会出现一个变量或两个变量的子句。因而 3SAT 问题实际就是最高阶是 3 的 SAT 问题。 算法 : ( 1 ) 子句消去法先查找子句块变量无解和唯一解 。有变量无解计算结束,不然连续消去唯一解剩余子句块,出现变量无解结束计算,出现剩余子句块全多解时,选择另外子句块变量唯一解操作。 ( 2 ) 没有了子句块变量唯一解,就去找关联变量(属于不同子句块的变量)的可选解 。这一过程中需要对变量 0 值和 1 值分别施行子句消去测试可选解的数量。如果变量测试有唯一可选解,就按照( 1 )的方法计算,不然标记这个变量有 2 个可选解,然后选择另外的关联变量测试。 ( 3 ) 剩余SAT 全部变量都有2 个可选解 。此时计算最为简单,只要任意设定一个变量的值后,施行子句消去法,最终就可以得到 SAT 的满足解。 复杂度 : 假设 3SAT 的每个子句块都没有唯一解变量,而且每一个变量都是关联变量,并且 n 个变量都需要判定可选解的数量。这应该是 3SAT 求满足解时间复杂度最坏的情况。 A. 查找无解和唯一解 。由于 3SAT 的子句块最多有 C n 3 个,每个子句块最多有 8 个子句。有 8 个子句的子句块存在, 3SAT 无解。子句块中一个变量只有 4 个相同值就有唯一解。所以最坏的情况下,这些特点都不会出现。这只要对每个子句块变量进行 0 和 1 的统计就可以做到。因而最多要统计 8C n 3 次。可见时间复杂度为不超过 O(n 3 ) 。 B. 确定变量可选解 。假设测试变量是所有子句块的变量,那么设定值为 0 和 1 都要对每个子句块确定一次无解或无变量唯一解。检查的子句块仍然不会超过 C n 3 个,最多要统计 8C n 3 次。故这步算法的时间复杂度也不超过 2nO(n 3 ) ,即为 O(n 4 ) 。 C. 确定了每个变量都有2个可选解消去子句 。由于有定理保证,所以按照子句消去法设定各变量的值,消去子句的时间复杂度显然是不超过 O(n) 。 从这 3步 操作来看,不过是有限个多项式时间的和而已,故可知 3SAT 问题子句消去法求解的时间复杂度最坏是 O(n 4 ) 。 2016-12-8
个人分类: 3SAT解法|3799 次阅读|1 个评论
SAT问题去重复子句的时间复杂度是怎样算出来的?
accsys 2016-11-9 09:36
姜咏江 SAT 的定义中是不允许出现重复子句的,但在子句消去的过程中,会出现降阶的子句块中有重复的子句。 t 阶子句块变量唯一解是因为它有 2 t-1 个相同的表现值( 1 ≤ t ≤ k )。在消去子句的过程中很难事前知道那些子句会重复,这样证明消去重复子句这一步算法时间复杂度为多项式时间就很困难。不过我们可以从总体上来探讨。 假如 SAT 子句的最高阶是 k ,那么子句块的总数不会超过 C n k +C n k-1 +...+C n 1 个。如此有 m 个变量表现值相同的子句块( 1 ≤ m ≤ k-1 )最多有 C n -m k-m +C n -m k-m-1 +...+C n -m 1 +1 个,那么有 m 个变量表现值相同的子句块的子句总数不会超过 C=2 k-m +2 k-m-1 +...+1 个。 C 是一个有限常数。因此,任何一个剩余的子句块的子句数数,都不会超过这个数。在小于常数 C 个数中,消去重复数的算法时间复杂度无疑是 O(1) 。而剩余子句块最多还是 C n k +C n k-1 +...+C n 1 个,所以 SAT 总体去掉子句块中重复子句的算法时间复杂度是 O( n k ) 。 2016-11-9
个人分类: SAT问题|2392 次阅读|0 个评论
论子句消去算法的多项式时间复杂度
accsys 2016-10-31 10:41
论 子句消去算法的 多项式时间复杂度 姜咏江 (对外经济贸易大学 北京 中国 100013 ) 2016-10-30 摘要 本文重点论证 SAT 问题算法时间复杂度问题。文中给出了运用子句消去法求 SAT 满足解的基本方法,并对该算法的每一步骤都进行了时间复杂度深入分析,进而论证出用子句消去法去求解 SAT 问题,最坏的情况下,算法时间复杂度也不会超过 O( n k ) 。作者定义了子句块和关联段的概念,并用限位数理论和方法找到了求 SAT 满足解的一般方法。这是本文作者所特有的研究成果。 关键词 SAT 多项式时间 子句消去法 变量关联段 限位数 反子句 中图法分类号 TP301.6 O158 1. 引言 2016 年 10 月 10 日 在唐山召开了中国计算机应用大会。依据会议要求我投去了《子句消去法求 k-SAT 满足解》论文。经过大会组织审稿,决定推荐到国内一流计算机期刊发表,虽经向不同期刊推荐,但期刊不敢发表,皆是无理由退稿 。既然国内期刊不能发表,我不如自己在科学网上发表 ,文责自负,有何不可? 论文贴到我的博客之后,有人对变量 2 可选解的情况提出疑问,认为这仍然是概率解的方法,对算法多项式时间复杂度不理解。本文在那篇论文的基础上,专门论述子句消去法的算法多项式时间复杂度问题,以便打消关心子句消去法读者的心头疑虑。 2. 子句消去法算法 子句消去法求 SAT 满足解或 k-CNF=1 解的算法如下: ( 1 )化简:将变量有唯一表现值设定为解,将相关子句消去; ( 2 )去掉子句块中重复子句; ( 3 ) 判断变量可选解,无可选解转( 10 ); ( 4 )变量有 2 个可选解,记录可选解数量,选择另一变量,转( 3 ); ( 5 )变量有唯一可选解,确定该变量唯一解,消去相关子句; ( 6 )对剩余子句重复( 1 )至( 5 ),若全部变量设置完成(无剩余子句)转( 9 ); ( 7 )对剩余全有 2 个可选解变量,从任意一变量设定解出发,依据变量唯一解消去子句; ( 8 )有剩余子句且有变量值未设定转( 7 ); ( 9 )得满足解结束。 ( 10 )无解结束。 3. 重要概念与定理 为了很好论证,需要重点重复几个概念和定理。 定义7 . 运用子句消去法,不使剩余关联子句块无解的变量值,叫变量可选解。 理解这个概念举例说明最好。 表 1 是求变量 x15 可选解的操作过程:( 1 )设 x15=1 ,消去该列表现值为 1 的子句;( 2 )由子句块 x2x15 知 x2 必取值 0 ,消去这个子句;( 3 )又知 x20 必取值 0 ,消去此列表现值为 0 子句。得到剩余的子句块全是多解。 表 1 求x15=1可选解 可选解数: 变量取值:  0   1         0 行号 x2 x13 x15 x16 x17 x18 x19 x20 1 1             0 2 0   0           3   0 0   0       4   0 1   1       5   1 0   1       6   1 1   0       7   1   0         8   0   1         9       0 0 0     10       1 1 1     11         0 0 0   12         1 0 0   13           0 0 0 14           1 1 1 定理3 .SAT 有解,其子集有解。 这个定理的重要性在于能够检查前面设定的变量值能否是关联段解的一部分。同时能够对全 2 可选解变量组成的关联段找到段解。 4. 变量关联段与子集 在求变量可选解的过程中,涉及消去子句的那些子句块显然也是一个 SAT ,我们不妨称之为 变量关联段 。显然,当变量有可选解的时侯,变量关联段就有解。 如果我们原来的 SAT 施行子句消去法,那么变量关联段中的子句就可能被消去,这样就会得到原来变量关联段的子集。 例如, 表2 中已知每个变量都有 2 个可选解,所示的是变量 x15 取值 1 时的变量关联段。其中 x2 、 x15 、 x20 的值 0 、 1 、 0 叫这个变量关联段的解。 表 2 变量x15=1关联段 可选解数:  2 2 2 2 2 2 2 2 变量解:  0   1         0 行号 x2 x13 x15 x16 x17 x18 x19 x20 1 1             0 2 0   0           3   0 0   0       4   0 1   1       5   1 0   1       6   1 1   0       7   1   0         8   0   1         9       0 0 0     10       1 1 1     11         0 0 0   12         1 0 0   13           0 0 0 14           1 1 1 如果先取值 x17=1 ,消去相关子句。对变量 x15=1 关联段来说,就有 4 、 5 两行的子句被消去了,剩下的 1 、 2 、 3 、 6 、 13 、 14 行子句就构成了子集。 由定理 3 ,我们极容易得到下面的 2 个推论。 推论1 :变量关联段子集也是原变量值的关联段。 推论2 :两个可选解变量不消去,总有两个可选解。 由这个推论,下面定理 7 的证明就太容易了。 定理7 .k-SAT 或 SAT 的每个变量都有 2 个可选解,那么从任意一变量确定值出发,消去子句块变量唯一解相关子句,如此继续,可得到它们的满足解。 表 3 剩余的变量关联段 可选解数:  2 2 2 2 2 2 2 2 变量解:  0   1   1       0 行号 x2 x13 x15 x16 x17 x18 x19 x20 1 1             0 2 0   0           3   0 0   0       4   0 1   1       5   1 0   1       6   1 1   0       7   1   0         8   0   1         9       0 0 0     10       1 1 1     11         0 0 0   12         1 0 0   13           0 0 0 14           1 1 1 证明 :由推论 2 知,设定一个变量值,按照变量关联段解进行设定相关变量值,得到其余剩余子句都是某变量关联段的子集组成部分,每个变量仍然有两个可选解。如此继续,最多不超过全部 n 个变量次操作,就可以得到原来 k-SAT 或 SAT 的满足解。 5. 子句消去算法多项式时间复杂度 定理8 :子句消去法是多项式时间复杂度算法。 证明 :算法第( 1 )步的时间复杂度为 O( n ) 。 第( 2 )步的 k 阶子句块中因 k 是常数,即子句块中变量的数量不变,那么子句块中子句最多不超过 2 k 个,所以这步操作的时间复杂度不会超过一个常数,即是 O(1) , C n k 个子句块计算的时间复杂度为 O( n k ) 。 第( 3 )步剩余变量最多有 n 个,判断一个变量可选解的子句块数量最多不超过2 k C n k + 2 k-1 C n k-1 +...+2C n 1 个,要对这些子句块进行无解、唯一解和多解的判断,这是一个不超过 O( n k ) 时间复杂度的过程。对每个变量最坏要设置 0 和 1 进行检验的情况,最多要进行时间复杂度为 2 n 倍的 O( n k ) ,即要进行时间复杂度不超过 O( n k+1 ) 的操作。 第( 4 )步是转移判断。 第( 5 )步是对第( 3 )步有可选解操作的重复。 第( 6 )步是转移判断。 第( 7 )步根据定理 7 不难说明每消去一个变量的时间复杂度不超过 O( n k ) ,那么即使有 n 个变量有 2 个可选解,运用子句消去法,算法时间复杂度也不超过 n O( n k ) ,即不超过 O( n k+1 ) 。 第( 8 )( 9 )( 10 )步是常数时间复杂度。 整个子句消去法是有限步骤完成的过程。依据算法多项式时间复杂度的性质知道,子句消去法算法的时间复杂度最坏为 O( n k+1 ) 。 定理 8 证毕。 请参阅: http://blog.sciencenet.cn/blog-340399-1009188.html 2016-10-31
个人分类: k-SAT求解|2824 次阅读|0 个评论
子句消去法多项式时间复杂度证明的详细解释
accsys 2016-10-19 09:58
子句消去法 k-CNF=1 求满足解的算法如下(原文见附件): (1) 化简:将变量有唯一表现值设定为解,将相关子句消去; (2) 去掉子句块中重复子句; (3) 判断变量可选解,无可选解转( 10 ); (4) 变量有 2 个可选解,记录可选解数量,选择另一变量,转( 3 ); (5) 变量有唯一可选解,确定该变量唯一解,消去相关子句; (6) 对剩余子句重复( 1 )至( 5 ),若全部变量设置完成(无剩余子句)转( 9 ); ( 7 ) 对剩余全有 2 个可选解变量,从任意一变量设定解出发,依据变量唯一解消去子句; ( 8 ) 有剩余子句且有变量值未设定转( 7 ); ( 9 ) 得满足解结束。 ( 10 ) 无解结束。 要证明算法时间复杂度为多项式类型,就应该指出其每一步都是多项式类型时间复杂度。我们分步来解释: 第一步,化简的过程是判断每个变量的全部表现值是否相同。 即使一个一个表现值进行对比,由于 k-CNF 最多有 2 k C n k 个子句,而且表现值只有 0 和 1 ,那么最多需要也就是 2 k C n k 次。可以知道最坏的情况下的时间复杂度为 O( n k ) ,实际上具有相同变量的子句数会远远低于这个数。 我们只要计算一下 0 和 1 的数量,只要有一个计数为零,那么就可以设定另一个值。这时的时间复杂度为 O(1) 。 如果消去子句的过程也考虑,那么最坏也是最好的时间复杂度为 O( n k ) ,此时就没有必要再继续考察变量了,因为所有的子句都可以消去了。 第二步,去掉子句块中重复的子句的工作是在子句块中完成的。 k-CNF 的子句块最多有 2 k 个,无论你如何比较结果都不会超过常数 2 k !,因而这一步的时间复杂度为 O(1) 。 第三步,判断变量可选解,最多要判断 2 n 次,还可以如下理解。 由于逻辑变量是定义在{ 0 , 1 }这个集合上的,因而必须对选择的变量分别选择 0 和 1 运用变量唯一解子句消去法检查是否会出现无解剩余子句块或多解剩余子句块。由于子句块最多有 C n k 个,所以需要考察的剩余子句块不会超过 C n k 个。 0 和 1 各进行一次,那么这一步算法时间复杂度也是 O( n k ) 。 第四步,这是简单判断,显然算法时间复杂度为 O(1) 。 第五步,变量确定只有唯一解。 当变量只有一个可选解的时侯,这个可选解就是变量的唯一解。消去含有这个变量这个表现值的所有子句,最多也不超过 2 k C n k 个。因而这一步算法时间复杂度不超过 O( n k ) 。 第六步,这是对( 1 )至( 5 )的有限次重复。 第七步,如果对可选解考察得到的是每个变量都有 2 个可选解。这时只要对任意一个变量取 0 或 1 的值,消去相关子句,然后再消去剩余降阶子句块中变量唯一解的子句。根据变量可选解的确定过程知道,这一过程中成为唯一解的变量相关子句都会被消去,而剩下的子句中的变量一定还有 2 个可选解。于是可以继续对剩下的子句集再进行这样的操作,直至全部子句消去。变量都有 2 个可选解的子句块最多有 C n k 个。所以这一步最坏的算法时间复杂度也不超过 O( n k ) 。 这一步不好理解的地方是任意设定一个变量的值就能够将关联段的子句全部消去吗?是不是会产生没有解的情况?如果出现没有解,再去重复求解,不就变成了概率求解了吗? 实际情况是当每个变量都有 2 个可选解到时候,可以按照子句消去法,从变量的任意值出发,都可以求出满足解,不会出现没有解的情况,这是由变量可选解的定义直接相关的。变量的可选解是通过子句消去法剩余各阶有无解定义的,和变量可取值是不同的概念。 第八、第九、第十步都是 O(1) 这样的算法时间复杂度。 总之,依据多项式时间复杂度复杂度的低阶不算的特性,有限次的 O( n k ) 之和的算法时间复杂度仍然是 O( n k ) 的特性,用子句消去法求 k-SAT 满足解的算法时间复杂度为 O( n k ) 。 姜咏江 2016-10-19 附件: 2016子句消去法求k-SAT满足解.pdf
个人分类: k-SAT求解|2974 次阅读|0 个评论
k-CNF-SAT子句消去法求解原理与方法
accsys 2015-12-27 18:24
k-CNF-SAT 子句消去法求解原理与方法 姜咏江 E-mail accsys@126.com 2015-12-27 2000 年美国克雷数学所悬赏百万美元的 P/NP 问题解决,关键要找到 NPC 问题的多项式时间算法。子句消去法完成了对 NPC 问题中的 3-SAT 的多项式时间求满足解,进而可以推广到求 k-SAT 的满足解。本文给出用子句消去法求 k-SAT 满足解的基本原理和方法。 1. 子句消去法 子句消去法 是对 3-SAT 求解的有效方法。根据逻辑代数的理论,一个逻辑多项式如果某一项的值是 1 ,那么这个逻辑多项式的值就是 1 。而合取范式 k-CNF 是由多个逻辑多项式(子句)之间形成的与运算表达式,所以只要参加与运算多项式的值全是 1 ,那么 k-CNF=1 就成立。 子句消去法就是依据这种逻辑运算的规律,逐一选择设定每个逻辑变量的值,使子句的某个项(文字)值为 1 ,从而使子句值为 1 ,并将满足值为 1 的那些子句消去。当每个逻辑变量的值按照此种需求都设定之后,如果没有了剩余子句,那么显然 k-CNF=1 ,如果有剩余子句没能消去,那么 k-CNF=0 。由于一个子句中有同一变量正反表示的文字,该子句的值一定为1,所以子句消去法不用考虑这种子句,实际操作一律消去即可。 2. 完全子句块 如何选择每个逻辑变量的值才能够获得 k-CNF=1 的解? 这个问题是子句消去法能否在多项式时间求出 k-CNF=1 解的关键。如果采用任选一个 0 或 1 做为变量的值,显然对 n 个变量的合取范式求满足解是 O(2 n ) 算法时间复杂度。如果按照回避出现“完全子句块”的方法,运用子句消去法就可以在 O( n ) 的算法时间复杂度内求出合取范式的满足解。 依据限位数理论 ,二进制 k 位数最多有 2 k 个数,并且每个数都有唯一的反码数。用 01 表格式表示的合取范式 k-CNF 如 表 1 所示。其中 x i 用 1 表示( i=1,2,..., n , n ≥ k ), x i 的非运算 x’ i 用 0 表示,并把 0 或 1 称为变量 x i 的表示值。为了区别表示值,把求解中确定出的变量 x i 值,叫做变量解值。 为了研究确定变量解值的方法,我们将 01 表示的具有相同变量的子句放到一起,形成的子句集合叫子句块。 k 阶子句形成的子句块,如果有 2 k 个不同的 k 位二进制数,则称该子句块为 k 阶完全子句块。 表 1 是 k-CNF 形成的完全子句块。第一个数表示变量数,第二个数表示子句数,从左上到右下以二元向量 (1 , 2 1 ), (2 , 2 2 ),(3 , 2 3 ),...,(k , 2 k ) 为标记,形成了1-CNF、 2-CNF 、 3-CNF 、 ... 、 k-CNF 的完全子句块。 01 表格式中子句变量表示值是互为反码数的子句称为反子句。例如,子句 x’ i x j x’ v 和 x i x’ j x v 的表示值为 010 和 101 ,则称 x’ i x j x’ v 和 x i x’ j x v 是互为反子句。 从反子句的定义和子句消去法可知,如果一个合取范式 k-CNF 有互反子句存在,那么无论怎样也不能够设定变量的解值将全部子句消去,因而无论怎样设定那 n 个变量的值,都一定会有 k-CNF=0 。 因为完全子句块的每个子句都有反子句存在,依据子句消去法必然会得出完全子句块 j-CNF ≠ 1 ( j=1,2,3,4,...,k )的结论。 从 表 1 我们可以直接看到,完全子句块中每个子句都有反子句,因而不论设定怎样的变量值都不会有 k-CNF=1 。 表 1 k-CNF 完全子句块 序号 x 1 x 2 x 3 x 4 x 5 x 6 x 7 … x k-1 x k 1 0 0 0 0 0 0 0 … 0 0 2 1 0 0 0 0 0 0 … 0 0 3 0 1 0 0 0 0 0 … 0 0 4 1 1 0 0 0 0 0 … 0 0 5 0 0 1 0 0 0 0 … 0 0 6 1 0 1 0 0 0 0 … 0 0 7 0 1 1 0 0 0 0 … 0 0 8 1 1 1 0 0 0 0 … 0 0 9 0 0 0 1 0 0 0 … 0 0 … 2 k -1 0 1 1 1 1 1 1 … 1 1 2 k 1 1 1 1 1 1 1 … 1 1 3. 关联子句块 有相同变量的子句块称为关联段。关联段中共同变量形成的子句块称为关联子句块。显然,子句块可以认为是关联段的特殊情况。相互关联的多个子句块,将具有相同变量的表示值的子句放到一起,就可能出现完全子句块。如果在用子句消去法求解的过程中,不相同的变量值都已设定,剩余的子句中形成了 m 个关联变量的完全子句块,那么也一定会使合取范式 m-CNF=1 无解,其中 0mk 。 表 2 所示的是 4-CNF=1 在用子句消去法求解中,已经选定了 x p =1 和 x t =0 ,从而动态形成了 3 阶完全子句块(中间的 8 个子句)。 表 2 动态形成的完全子句块 x p =1 x i x j x v x t =0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 4. 有唯一解的子句块类型 变量的解值一经选定,与该变量极其表示值之相同的子句都可以消去。如果一些子句块能够被唯一的一组解值消去,则称该组值为子句块的唯一解。 k-CNF=1 中唯一解值类型如下: ( 1 ) k 阶子句块有一个变量有 2 k-1 个一样的表示值,那么这个变量有唯一解值。 因为只用 0 和 1 表示的 2 k 个数,只要有一个数位的数码全一样,那么其余数码表示的不相同数一定有 2 k-1 个,这就是一个 k-1 阶的完全子句块。此时不选这个变量的表示值做解值,那么就会出现 (k-1)-CNF=1 无解。 子句消去法在求解的过程中,对 k 阶子句块变量设定一个值,消去相应子句之后,得到的剩余子句块就成了 k-1 阶子句块。再对剩余子句块求解时可仍运用求k阶子句块的方法 来做。 ( 2 ) k 阶子句块有 2 k -1 个子句时,该子句块有唯一解。 因为 k 阶完全子句的互反子句是一对一的, k 阶子句块若有 2 k -1 个子句,说明有一个子句的反子句不在这个子句块中,于是将没有反子句的子句表示值设为解值,就一定能够将子句块的全部子句消去。 5. 子句消去法求解算法 懂得了 k-CNF 无解和唯一解的结构,按照下面的操作顺序, k-CNF=1 求解就不是难事。 ( 1 )对 k-CNF 先检查是否有 2 k 个子句的子句块,没有转( 2 ),有则无解。 ( 2 )找 2 k -1 个子句的子句块或子句块有 2 k-1 相同表示值变量,设定该变量的表示值为解值,消去相应子句,否则转( 3 )。 ( 3 )对剩余子句块先求唯一解,消去相应子句,若为多解,暂时保留并转( 4 ),若出现无解情况,则结束。 ( 4 )剩余都是多解子句块,设定块解,先选定关联变量的值,消去相关子句直至结束。 6. 结论 ( 1 )子句消去法求解合取范式满足解的方法具有很强的鲁棒性。即使整个 k-CNF=1 无解,我们仍然可以确定出有解的部分和无解的部分,这对做多因素分析十分重要。 ( 2 )运用表上作业的子句消去法求 k-CNF=1 的解,是一个对 n 个变量设定值的过程。这种设值过程不需要重复,只要进行 n 次设定变量解值即可达到目的,因而子句消去法完全是一种 O(n) 的多项式时间复杂度的算法。 【参考文献】 http://blog.sciencenet.cn/blog-340399-928224.html 姜咏江 . 自己设计制作 CPU 与单片机 , 人民邮电出版社 , p237-238,2014. https://en.wikipedia.org/wiki/P_versus_NP_problem Steven Cook. The complexity oftheorem proving procedures. In Proc. ThirdAnnual ACM Symposium on the Theory ofComputing, pages151 - 158,1971.
个人分类: k-SAT求解|1977 次阅读|0 个评论
K-CNF-SAT多项式时间求解算法和软件(正式发表)
热度 2 accsys 2015-8-13 14:42
K-CNF-SAT 多项式时间求解算法和软件 姜咏江 Email:accsys@126.com 摘要 :给出子句消去计数法分组定解算法,该算法可以在多项式时间求出 k-CNF-SAT 的全部解。证明了斯提芬 . 库克定义下的 NP C 问题 就是一个 P 类问题。 关键词 : NPC , P/NP 问题,子句消去计数法分组定解 1. 背景简介 P/NP 问题曾于 2000 年被美国克雷数学所定为最难的难题,有甚者说其挑战了人类智慧。所谓 P/NP 问题的定义是这样给出的: 复杂度类 P 包含所有那些可以由一个确定型图灵机在多项式表达的时间内解决的问题;类 NP 由所有其肯定解可以在给定正确信息的多项式时间内验证的决定问题组成,或者等效的说,那些解可以在非确定图灵机上在多项式时间内找出的问题的集合。 实际上这个定义有很多歧义,涉及到人们对确定型图灵机、非确定型图灵机、多项式时间、问题、决定问题、肯定解、给定正确信息、验证等一系列概念的认识的不统一,很难形成统一的见解。人们能够统一的是 P 类问题属于 NP 类问题,但 NP 类问题是否就是 P 类问题,一直没有确定的结论。 1971 年斯提芬 . 库克 (Stephen A. Cook) 发表了〈 The Complexity of Theorem Proving Procedures 〉才把 P 之外的问题归结为三大类,即 NP 、 NP-complete 及 NP-hard 。库克的分类得到了学术界的认可。在库克的定义下, P 、 NP 、 NPC 、 NPH 问题的定义如下: P 问题,可以在多项式时间内求出解的问题, Polynomial problem 。 NP 问题,可以在多项式的时间里验证一个解的问题, Non-deterministic polynomial NPC 问题,如果所有的 NP 问题都存在多项式时间算法使其能够归约为某一 NP 问题,则称该 NP 问题为 NPC 问题, Np complete 。 NPH 问题,如果所有的 NP 问题都存在多项式时间算法使其归约到某问题,则称该问题为 NPH 问题, Np hard 。 由以上 NPC 问题的定义,我们不难想到,只要我们能够找到一个 NPC 问题,并能够找到其多项式时间的求解算法,那么就可以肯定这个 NPC 问题就是一个 P 问题。因为所有的 NP 问题都可以通过多项式时间算法归约成 NPC 问题,并且所有的 NPC 之间都有多项式时间算法实现转化,因而只要找到一个 NPC 问题的多项式时间算法,也就等于找到了所有 NP 问题的多项式时间算法,于是也就证明了 NP=P 。 长时间以来,人们将寻找 NPC 类问题的多项式时间算法作为了解决 P=NP 问题的关键途径。一些典型的 NPC 问题(见 图 1 所示)已经被数学家明是 NPC 问题。例如合取范式满足问题 3-CNF-SAT 、子集和问题 SUBSET-SUM 、旅行商问题 TSP 、哈密顿回路问题 HAM-CYCLE 等都是 NPC 问题寻找多项式时间解法的研究热门问题。但时至今日,除去本人新近研究出来的 k-CNF-SAT 多项式时间算法之外,未见到任何 NPC 问题的多项式时间复杂度的算法出现。 2. 子句消去计数法分组定解算法 的形成 本人发明的子句消去计数法分组定解的算法,源自本人设计的子句消去计数法。子句消去计数法适合于制作确定 n 个变量与 k 阶子句的合取范式求解的运算器。由于运算器的逻辑电路是并行执行方式,因而求解的速度可达几十纳秒之间完成。 子句消去计数法求解需要设立可能解名称计数器。一般 n 个变量则需要有 2 n 个以逻辑变量 x 和 x’ 排序形成的字为名称的计数器。在消去子句的过程中,要看子句所含变量表示包含在哪个计数器名称中,则该计数器加 1 。计数器的初值都为 0 ,消去全部子句后,若某计数器的值仍然为 0 ,则说明计数器的名称取反得到 n 元变量值是 k-CNF-SAT 的解。 我进一步研究发现,事实上求解的过程并不需要具体的计数,而是只要知道那些值为 0 的计数器名称,可以对其表示可能解的名称取反,就可以得到全部解。因而在运算器设计上,完全取消了计数器,而专用以可能解命名的标志寄存器就达到了求解的要求。 图 1 典型的 NPC 问题 尽管子句消去计数法能够实现硬件并行瞬间求解,但在软件编程来看, n 个逻辑变量的合取范式可能解有 2 n 个。在子句消去的过程中,需要通过子句的变量确定那些不为 0 的可能解标志。如果采用逐一访问可能解标志的方式,必然是一个指数时间复杂度的算法。如何有效地减少对 2 n 个可能解标志的访问,就是突破 k-CNF-SAT 问题多项式时间算法的关键。 3. 子句消 去 计数 法求解的算法 要能够理解子句消去计数法分组定解的算法,必须先弄清楚什么是子句消去计数法。 3.1 一些规定 一个逻辑多项式如果存在一项的值是 1 ,那么这个逻辑多项式的值一定就是 1 。同样,一个逻辑项的存在为 0 的因子,那么这个逻辑项的值一定是 0 。逻辑变量非的值,一定是逻辑变量值的反码。逻辑运算的这些基本规律是子句消去法计数法成立的基础。 为了用计算机表示方便,我们这里用“ + ”表示或运算,用“ ’ ”表示非运算,将子句用括号括起,并将与运算符号省略。逻辑变量 x 和 x’ 我们经常会用 1 和 0 分别表示,这叫值化。为了方便,在不引起混淆的情况下,我们会不区别 x 与 1 , x’ 与 0 。 由于 k 阶合取范式满足 k-CNF-SAT 的子句中包含变量 x 与 x’ 同在的情况,这样的子句的逻辑值永远是 1 。我们将这样的子句称为恒一子句。显然,恒一子句的存在与不存在并不影响合取范式满足 k-CNF-SAT 的满足解,因而下面的讨论中,都会将恒一子句去除。 3.2 子句消去计数法 用子句消去计数法求解 k-CNF-SAT 问题算法如下: ( 0 )设立 n 元单侧计数器: x1’x2’x3’…xn-1’xn’ ,…, x1x2x3…xn-1xn ,x 1 ’x 2 ’x 3 ’…x 5 ’x 6 ,共计 64 个。 ( 1 )去掉恒一子句 ( x 1 + x 1 '+ x 2 ') ,剩 ( x 2 + x 3 + x 4 )( x 1 '+ x 3 '+ x 4 ')( x 1 '+ x 2 + x 5 ')( x 2 + x 3 + x 6 )( x 1 + x 5 + x 6 ') ( 2 )消去剩下合取范式的第一子句,使含 x 2 x 3 x 4 标识的计数器都加 1 ; ( 3 )消去第二子句,使含 x 1 ' x 3 ' x 4 ' 标识的计数器都加 1 ; ( 4 )往下继续操作 5 次,则所有的子句都被消去,计数器计数完成。 ( 5 )令为 0 计数器的变量取反码值即得解。例如,计数器 x 1 ’x 2 ’x 3 x 4 ’x 5 ’x 6 ,于是得 f ( x 1 ,..., x 6 ) 值为 1 的解有:( 110110 )。 ( 6 )一次性可以写出所有解。如果互为反码标识的计数器都为 0 ,则对应逻辑变量组合双方都是解。 验证: 对于所得解可以带入原式验证。例如将 x 1 =1 、 x 2 =1 、 x 3 =0 、 x 4 =1 、 x 5 =1 、 x 6 =0 带入原式得: f (1,1,0,1,1, 0)=1 。 4. 子句消去计数法的概念与性质 为什么子句消去计数法就能够求出 k-CNF=1 的解?它的证明就在下面的概念和方法中。 定义 1 :如果子句中同时有逻辑变量和其反表示,则称子句为恒一子句。 显然,恒一子句的值总是 1 ,与逻辑变量的取值无关。 定义 2 :所有包含变量 x 的非恒一子句叫 x 相关子句。 定义 3 :我们将 n 对互反变量表示只取变量或变量非,得到的 k 个变量子句组合,叫一侧。 例如, 3 个变量只取 x 1 ’ 、 x 2 、 x 3 ’ ,形成的 2 阶子句一侧为 x 1 ’+x 2 、 x 1 ’+x 3 ’ 、 x 2 +x 3 ’ 。而 x 1 ’+x 2 ’ 、 x 1 ’+x 3 ’ 、 x 2 ’+x 3 ’ 是 x 1 ’ 、 x 2 ’ 、 x 3 ’ 形成的一侧。如此不难知道, n 个逻辑变量构成的一侧共有 2 n 个。 子句消去计数法的计数器就是为了记录一侧含有的子句数量而设计的。 定理1 : n 个变量合取范式 k-CNF 中一侧 相关子句数最多为组合数 。 证明 :因为一侧只有 n 个变量的惟一表示,从中取出 k 个形成子句,即为从 n 个元素中取出 k 个的组合数 。 此定理可以用来检查给定的合取范式是否不正确。如果给出的合取范式的一侧相关子句超过这个数,则可判定合取范式有错误。 定义 4 :将合取范式子句中一个变量的表示( x 或 x’ )值定为 1 的子句全部消去求解的方法,称为子句消去法。 显然,子句消去法经过 n 次消去,若没有剩余子句,则 k-CNF 是可满足的,反之不满足。 定理2 :非恒一子句全体,消去 x 相关子句中,一定不含有其反变量 x’ 一侧子句。 证明 :因为非恒一子句 x 与 x’ 是不同时出现在一个子句,所以消去 x 相关子句, x’ 相关子句依然存在。 定义 5 :包含所有可能子句的合取范式 k-CNF ,叫完全合取范式。 完全定理 : n 个逻辑变量所成的 k 阶合取范式 k-CNF ,最多有 个子句。非恒一子句最多有 个。 证明 :因为每个子句的元素可以是逻辑变量或它的非,这相当从 2n 个元素中取出 k 个的组合数,即为 。而恒一子句最多有 个,所以非恒一子句最多有 个。 推论 :完全合取范式的值恒为 0 。 因为完全合取范式包含 x 与 x’ 的所有相关子句。所以用子句消去法无论经过怎样的 n 次消去子句,都不能使之没有剩余子句,而剩余子句的值是 0 ,则合取范式的值是 0 。 可满足定理 :若非恒一子句中互反变量有一侧相关子句不存在,则 k-CNF-SAT 可满足 。 证明 :因为 x 的相关子句全体包含一侧所有的 n 个变量或其非,如果其中一侧不存在,则可确定将这一侧相反一侧变量逐一消去,依据定理 2 可知最终将没有剩余子句。 可满足定理是我们进行 k-CNF-SAT 求解子句消去计数算法正确性的依据。实际上, n 个变量的每个一侧子句的全体变量表示,刚好是一个 n 位二进制数,将这个 n 位二进制数用变量名表示,就是一侧相关子句数量计数器的名称。当消去一个子句的时候,就要看该子句属于哪一侧,从而使对应的计数器加 1 。 子句消去计数法关键就是记录一侧相关子句的数量,如果一侧子句数量为 0 ,说明这一侧的相关子句在合取范式中都不存在,而将计数器名称相反一侧变量的子句一一消去,则不会再有剩余子句了。这种子句消去计数法可能会最终有若干个计数器值为 0 ,那么 k-CNF-SAT 就会有若干组解。如果没有计数器的值为 0 ,说明 k-CNF-SAT 无解。 由于子句消去计数法求 k-CNF-SAT 的解问题,转化成了一侧计数器是否为 0 的问题,因此在设备设计上将计数器换成了与计数器名称一样的可能解标志寄存器,通过可能解标志为 0 来确定 k-CNF-SAT 的满足解。 5. 子句消去计数法分组定解算法 设 n 个逻辑变量的 k 阶合取范式子句的数量为 m ,则去掉恒一子句之后, m 的变化范围应有 1 ≤ m ≤ 。从这一点来看,决定子句消去计数法算法动作的次数是 m 的可能变化范围,因而消去子句的过程是一个与 n 有关的多项式时间。但因为每消去一个子句,都要到 2 n 个可能解标志中去查找子句所在的一侧,故而这一过程是与 n 有关的指数型时间算法。可见要使 k-CNF-SAT 在多项式时间内求出解,则需要设法使查询可能解标志的过程变为多项式时间的算法。 5.1 可能解标志分组设想 合取范式 k-CNF-SAT 的全部可能解就在 2 n 个与 n 位二进制数一一对应的集合之中。这 n 位二进制数的每一位,不是 0 ,就是 1 ,只要将每个位置都放上 0 和 1 各一遍,那么这 2 n 个与 n 位二进制数就表达出来了。另一方面,当我们把子句的变量与可能解标志核对时,只要看变量对应的位置的 0 或 1 ,而无需观查其他位置的数码是 0 还是 1 。这样我们就可以用 * 号来代表 0 和 1 ,使查询的可能解标志一下子从 2 n 个转化到只查询几个(最多是 2 k 个)就能够将那些可能解标志应该为 1 的全部找到。正是这一创新的可能解标志用 * 分组的方法,解决了对以往 2 n 个可能解标志访问的指数时间,使该过程变成了多项式时间算法。 创新的要点是 n 个逻辑变量所有可能解标志可以用 n 个“ * ”表示( * 本身表示 0 或 1 )。这样一来,最初的可能解标识我们就用 * n * n-1 * n-2 …* 2 * 1 这一个字来表示(这里的下标只是说明位置,计算中不写)。我们在消去子句的过程中,会将这个可能解标志进行分裂分组,并去掉那些为 1 的标志组,从而在多项式时间内求出合取范式 k-CNF-SAT 满足的所有解。 5.2 基本设计思想 根据子句消去计数法,消去一个非恒一子句,合取范式可能解标志集中,消去子句的变量位置至少会有一个是其反码表示的可能解标识留下。例如,消去子句 x3+x5+x7’ ,那么最初全是 * 表示 10 个变量的 3-CNF 的可能解标志组就分裂成了 7 个分组,其中 * 表示是 0 或 1 。这个剩余的可能解标志分组用集合 B 记录。 B= { ***0*0*0** , ***0*0*1** , ***0*1*0** , ***1*0*0** , ***1*0*1** , ***1*1*0** , ***1*1*1** }。而从 ********** 中分裂出来的 ***1*1*0** 分组,其可能解标志都变成了 1 ,因而就全部消去了。 若再有子句 x3’+x5’+x7 ,则恰有 ***1*0*0** 被消去。则 B= { ***0*0*0** , ***0*0*1** , ***0*1*0** , ***1*0*1** , ***1*1*0** , ***1*1*1** } 若有变量落在 * 的位置,则因 * 即可是 0 ,亦可是 1 ,所以可将本组分解。 例如,若再消去 x3’+x5’+x10 知从上次剩余标标志组 B 中知,该子句的标识落在 ***0*0*0** 组中,被消去的为 1**0*0*0** ,将其消去,应剩 0**0*0*0** 。于是可能解变为: B= { 0**0*0*0** , ***0*0*1** , ***0*1*0** , ***1*0*1** , ***1*1*0** , ***1*1*1** }; 若再有子句 x3’+x7+x10’ ,但因该子句在标志组 ***1*1*0** 中,则剩余 B= { 0**0*0*0** , ***0*0*1** , ***0*1*0** , ***1*0*1** , 1**1*1*0** , ***1*1*1** }; 如此继续,直至全部子句消去。当全部的子句消去之后,从剩下的用 0 、 1 和 * 表示的可能解标志取反( * 位既取 0 ,又取 1 ),这样就可以得到合取范式全部解! 5.3 子句消去计数法分组定解算法 子句消去计数法分组定解算法如下: ( 0 )输入 k 阶合取范式,并将同变量的子句尽可能放到一起; ( 1 )设立一个 n 位字,每位都是“ * ”的可能解标志集 B ; ( 2 )从头开始,逐一消去子句,恒一子句直接消去,若是非恒一子句,则依子句变量表达形式的采用拆分标志组,去掉相应标志组包含该子句的部分(若子句变量值正好与 B 的对应位相同,那么消去该组,不然从存在标志组中分裂组中将其消去),获得剩余可能解标志组集合 B ; ( 3 )重复( 2 ),直至无子句或全部可能解标志组都被消去; ( 4 )若 B 标志完全被消去,说明此合取范式无满足解,不然各可能解标识的 0 、 1 位分别取反码, * 位分别选择 0 或 1 ,得到的 n 位二进制数都是原合取范式的解。 为了能够具体了解子句消去计数法分组定解算法,我们用例子加以解释。 5.4 子句消去计数法分组定解算法例题 例题 : 5 个逻辑变量的 3 阶合取范式 F=(x1’+x1+x3’)(x1’+x2’+x3’)(x2’+x3+x4)(x3+x4’+x5)(x1+x2+x3)(x2’+x4’+x5’) (x3’+x4’+x5’), 求满足 F=1 的解。 解:令 B= { ***** },因 (x1’+x1+x3’) 是恒一子句,直接消去。 消去 (x1’+x2’+x3’) ,则分裂后剩余 B= { **001 , **010 , **011 , **100 , **101 , **110 , **111 }; 再消去 (x2’+x3+x4) ,则因其标志在 **100 、 **101 中,消去 *110* ,剩, *0100 , *0101 ,于是 B= { **001 , **010 , **011 , *0100 , *0101 , **110 , **111 }; 再消去 (x3+x4’+x5) ,则因其标志在 *0100 、 *0101 、 **110 和 **111 中,则从消去 101** ,剩 00100 、 00101 、 00110 、 01110 、 11110 、 00111 、 01111 、 11111 ,于是 B= { **001 , **010 , **011 , 00100 , 00101 , 00110 , 01110 , 11110 , 00111 , 01111 , 11111 }; 再消去 (x1+x2+x3) ,则因其标志在 00111 , 01111 , 11111 中,消去无剩余,得 B= { **001 , **010 , **011 , 00100 , 00101 , 00110 , 01110 , 11110 }; 再消去 (x2’+x4’+x5’) ,则消去 00100 和 00101 ,得 B= { **001 , **010 , **011 , 00110 , 01110 , 11110 }; 然后在标志 **001 的分裂组中,消去标志 00001 ,剩余 01001 、 10001 、 11001 ,则得 B= { 01001 、 10001 、 11001 , **010 , **011 , 00110 , 01110 , 11110 }; 再消去 (x3’+x4’+x5’) ,则在 **010 和 **011 分裂组中消去 00010 和 00011 ,得 B= { 01001 、 10001 、 11001 , 01010 , 10010 , 11010 , 01011 , 10011 , 11011 , 00110 , 01110 , 11110 }; 根据标志取反得解方法,得此合取范式共有 12 个向量解,分别是 B’ ={ 10110 , 01110 , 00110 , 10101 , 01101 , 00101 , 10100 , 01100 , 00100 , 11001 , 10001 , 00001 }。 5.5 K-CNF-SAT 多项式时间复杂度的证明 子句消去计数法分组定解的算法的简捷之处,在于依据子句的构成,简化成一次性直接去访问那些有关的可能解标志,而不用对那些无关的可能解标志逐一进行访问。这样做的结果,将对可能解标志的查找就会从 2 n 个转化为对 m 组子句数据的多项式时间查找。 5.5.1 子句分块 从我编写的 3SAT 求解程序执行的过程中,使我感到将相同变量的子句组成块进行计算,速度会格外地快。因而我们下面就以同名变量子句分块,来加一讨论子句消去计数法分组定解的算法的多项式时间复杂度。 由于 k 个变量表示子句组成的块,子句数不会超过 2 k 个,而且如果出现 2 k 个 k-CNF 的子句块,则该合取范式一定无解。例如 3SAT 的一个块中如果有子句 x i ’x j ’x s ’ 、 x i x j ’x s ’ 、 x i ’x j x s ’ 、 x i x j x s ’ 、 x i ’x j ’x s 、 x i x j ’x s 、 x i ’x j x s 、 x i x j x s ,则会出现所有的可能解标志都被消去,这就说明合取范式无解。 一个块中子句越多,剩下的子句可能解标志就越少,这样就可以减少后面消去子句时查找要消去标志的数量。根据这个原则,我们在输入时尽量将子句数多的块放到合取范式的前面,以便消去这个块的子句之后,产生更少的标志组。 对于 k-CNF-SAT 来说,究竟子句可以分成多少块,这要看它所含有的子句数量和变量的分布来决定。一般来说,非恒一子句数 m 要受到 1 ≤ m ≤ 的限制,因而块的数量会是一个确定的自然数。 5.5.2 可能解标志组分段 在子句消去计数法分组定解的算法中,为了方便子句所在标志的查找,我们将 n 个变量组成的可能解原始标志组进行分段。如果是 k 阶合取范式,那么就将 k 个连续变量标号的标志组分为一段,最后不足 k 个标志的也单独成为一段。那么总能分出 个标志段。 我们把这种连续 k 个变量组成的可能解标志组段,叫标准段。 每个标准段可以表达 2 k 个可能解标志。一般用 n 个 * 刚好能代表 2 n 个可能解标志,因为其每段代表 2 k 个标志,假如刚好有 n/k 个标准段,那么依据乘法原理,应共有 (2 k ) n/k = 2 n 个可能解标志。 标志段内每一 k 位二进制数,我们都称为一个段值。各段段值的数量可以不同,那么所表达的可能解标志数量就是各段值数量的乘积。例如,有 3 个标准段的段值数量分别是 5 、 16 、 8 ,那么,所表示的可能解标志数为这些数之积,即 640 个可能解标志组。 依据标准段段值数量的这种关系,我们很容易写出每个可能解标志。假如 n=10 , k=3 ,且最后得到的各段值如下: 1 段 2 段 3 段 4 段 011 010 010 0 111 101 011 那么这 4 个段可能解标志有: 011 010 010 0 011 101 010 0 011 011 010 0 111 010 010 0 111 101 010 0 111 011 010 0 一般地说, t 个标准段段值分别为 u 1 、 u 2 、 u 3 、 ... 、 u t ,那么可能解标志就共有 u1 × u2 × u3 × ... × ut 个。 有了可能解标志组分段及段值,则可能解标志组就可以通过段值的形式表达,而无需一个个地将可能解标志单独写出来。 5.5.3 消去子句时段值的变化 可能解标志组按序分成标准段之后,最简单的情况是一个子句局限在一个标准段中,这样消去子句关联的段值,就在一个 k 元的标准段中查找就是了,实际查找的段值不会超过 2 k -1 个,连续消去子句会使段值数量不断减少。为了能够使后面的访问段值的数量尽可能地少,我们要将属于标准段的子句块都放到子句队列的最前面,这样既能够减少访问次数,又能够方便后续非标准段的访问。 实际上,除了属于标准段之外,一些子句的变量可能同时属于多到 k 个标准段的情况。如果子句变量属于一个标准段,除了子句块的第一个子句消去时要产生从 * 表示转到 0 、 1 表示的分裂之外,每消去一个 k 阶子句,只要从那 2 k -1 个段值中找到它的值表示,然后消去即可。但分散的变量子句最多可能要访问 k 个标准段,这时如果直接消去相应的数码 0 或 1 ,那就不对了。这种情况也会产生从数值段到数值段的分裂。当然,如果有的段仍然是 * 表示的,那么按照 * 表示进行分裂就可以。但若是相对位都是数码表示的,那么产生分裂,计算起来会相对麻烦一些。 ( 1 )对应 * 的标准段分裂 用 * 表示的标准段分裂最为简单。其实 k 个 * 就对应着 k 位二进制限位数。此时只要将第一个子句变量的数表示从中去掉,剩下的 2 k -1 个 k 位二进制数就是分裂的结果。 标志分段之后,如果继续消去属于这个标准段内的子句,那么就从该段值中将它们消去即可。 ( 2 )多个标准段的处理 消去一个非标准段的子句时,可能子句包含的变量散落在多个标准段之中,这时也要产生分裂。这种分裂要比标准段的分裂复杂。 如果一个子句的变量需要查询多个标准段,除了全为 * 的标准段,都要转化成多个段共同位长的单一的数码表示的基本可能解标志,然后消去相应的那些包含子句变量表示的标志组。 这种一个子句最多也就能够占居 k 个标准段,因而形成最多的是一个 k × k 位的大段,但只因为要访问的是 k 个位置,根据子句的变量名称,经过 k 次判断就可以确定消去。这种占有多个标准段的子句我们要尽可能地放到后面消去,因为此时每个标准段的段值数都会很少,因而访问量也较少。为了最大限度地降低访问次数,我们将合取范式的变量紧凑子句放到前面去,越松散的子句越要放到后面后面,会减少许多访问的时间。 由于 k-CNF 的非恒一子句最多有 ,且因 k 个变量的子句数不能超过 2 k -1 个,否则无解,所以最大的段段值也不会超过 (2 k -1) k 个。即使每个子句消去时都是访问这种最大的段,那么消去 m 个子句,访问的次数也不会超过 m(2 k -1) k 个段值。 5.5.4 算法的多项式时间复杂度 子句消去计数法分组定解的算法是不是一个多项式时间复杂度的算法,事关 NP-complete 是不是 P 问题的大事。如果能够证明 k-CNF-SAT 可以有多项式时间算法,那么也就确定了 NPC=P ,进而能够得出 P=NP 的结论。 从前面介绍的子句消去计数法分组定解的算法,我们已经得出了确定 k-CNF-SAT 的满足解最多需要 m(2 k -1) k 个段值访问。由于在 k-CNF 中阶数 k 是一个常数,而子句数 m 是个变量,所以可以认为 m (2 k -1) k 分组定解的过程就是一个 O( m ) 的多项式时间复杂度算法。如果非要牵扯到变量个数 n 对 m 的约束,那么也会得出与 n 有关的最多子句消去计数法分组定解的多项式时间计算公式 (2 k -1) k ( ) 。这个计算公式 (2 k -1) k 是个常数, 是个 k 次方多项式,因而 可以说明子句消去计数法分组定解算法的时间复杂度是 O( n k ) 。 6. 结论与感受 我研究 P/NP 问题前后只有一年的时间。在这一年的时间里,我探讨了程序执行时间的算法。为了能够按照所谓传统的“算法多项式时间复杂度”去寻找多项式时间解决 NPC 一类问题,我先后重点研究了子集和问题和 k-CNF-SAT 可解问题。 子集和问题采用的是先建所有子集,后查找和的方法,虽然可以求解,但在程序执行的总体时间上尚未摆脱 2 n 次操作。按照传统的对多项式时间的认识,应该承认还未找到多项式时间算法。 之后我又重点研究了 k-CNF-SAT 可解问题。在这个问题中我逐渐有了突破。 第一、先提出了看似极为简单的 子句消去法 ,实际上这是一种变相的验证解的方法。 第二、进一步探求研究,找到了 k-CNF-SAT 的 子句消去计数法 ,该方法运用可能解标志记数,得到了“只要某可能解标志为 0 ,那么其 n 位序名称取反,即可以一次性得到 k-CNF-SAT 的全部解。该方法的可能解标志仍然具有 2 n 个,如果不采取特殊的查询标志方法,仍然摆脱不了所谓的与 n 有关的指数时间约束。 第三、经过再深入细致地研究,发现了 子句消去计数法分组定解算法 ,可以依据对可能解标志分组实现多项式时间求出 k-CNF-SAT 全部解的算法,从而真正解决了 NPC 一族的关键性的 k-CNF-SAT 问题的多项式时间复杂度算法。其中证明这是一个多项式时间的算法,花费了巨大的心思。 由于 NPC 一类难题都可以规约到 k-CNF-SAT 问题求解。因此,本人发明的子句消去计数法分组定解的算法理论和实际意义不言而喻。 给一个求解3SAT的程序,供下载体会子句消去计数法分组定解的解法。本软件尚未做多项式时间更高效处理。提供给朋友目的是让有兴趣的朋友先试试求解的可能性。还会修改成更高效的多项式时间算法。 3SAT.rar 特别声明:本算法是我个人独创,如有引用请注明出处。 (证明多项式时间复杂度的部分较前进行了修改)。 2015-08-13 此方法过于复杂,请看简单的: http://blog.sciencenet.cn/blog-340399-928224.html
个人分类: 科研论文|4645 次阅读|3 个评论
多项式型与指数型算法悖论
热度 1 accsys 2015-7-22 03:52
多项式型与指数型算法悖论 姜咏江 在 P/NP 问题的讨论中,很重要的概念就是 O( n k ) 与 O(2 n ) 的时间复杂度问题。其实这是一条悖论!请看: 定理 :任何有限个多项式相加仍然是一个多项式。 那么, n 个元素集合的非空子集共有 C n 1 + C n 2 + C n 3 +…+ C n n -1 + C n n =2 n -1 个。毫无疑问,等式的左边是多项式型(因为任何一项都是一个多项式),而等式的右边是指数型。 请问,我们求子集过程的算法时间复杂度是 O( n k ) 还是 O(2 n ) ? 2015-7-22
个人分类: 科研讨论|3570 次阅读|2 个评论
解析式不能表达的子集和函数,自由的正式发表
热度 1 accsys 2014-12-9 11:31
解析式不能表达的子集和函数 姜咏江 Email: accsys@126.com 解析式不能表达的函数一般只能够用真值表的形式来表示,只是函数的定义域和值域都必须是有限个值。著名的子集和 subset_sum 问题就是这样一个函数。如何将这个函数表达出来?第一,先要确定函数的定义域;第二,求出函数的值域并建立对应关系。 一、 添右组合法 N 个数组成的数集的子集应该有 2 N 个。如何能够快速地求出这 2 N 个子集?我这里提供一种方法,叫添右组合法。我相信这是一种最快的求全部子集与子集和方法。 表 1 是添右组合方法求全部非零子集的例子。 表 1 添右组合例子 序号 S1 S2 S3 S4 S5 1 12 34 56 77 562 2 12,34 34,56 56,77 77,562 3 12,56 34,77 56,562 4 12,77 34,562 5 12,562 6 12,34,56 34,56,77 56,77,562 7 12,34,77 34,56,562 8 12,34,562 9 12,56,77 34,77,562 10 12,56,562 11 12,77,562 12 12,34,56,77 34,56,77,562 13 12,34,56,562 14 12,34,77,562 15 12,56,77,562 16 12,34,56,77,562 这种方法操作的具体步骤如下: (1) 将每个数做为一元子集; (2) 将右面的数依次排到左面数的后面,形成二元子集,直到最后一个元素排到所有左面一元集合中,至此形成全部二元子集; (3) 如果子集的最后已是最右面的数,不再添加,以下各次添加亦如此; (4) 将二元子集依次添加上右面的元素,形成三元子集; (5) 将三元子集依次添加上右面的元素,形成四元子集; (6) 将四元子集添加上右面的元素,最后得到全集结束。 这种 方法我们称为添右组合。按照添右组合这种方法,对于 n 元的集合也可以依次得到一元到 n 元的全部子集。 二、 添右组合定理 添右组合法得到的子集有两个问题必须回答。 1. 这种方法得到的是全部子集吗? 2. 这些子集中有没有重复的子集? 添右组合定理 : n 元集合用 添右组合法得到全部非空子集为 2 n -1 个 。 这个定理需要证明全部非空子集一个不少,且都不相同。 这里用归纳法来证明: 显然一个元素的集合没有多大意义,因而下面证明从 2 个元素的集合开始。 (1) 设 n=2 ,那么 A= { a 1 ,a 2 },则 A 的转移组合得到的子集为{ a 1 }{ a 2 }{ a 1 ,a 2 }子集数为 2 2 -1=3 说明子集数正好且不重复。 (2) 设 n=k 时得到的子集{ a 1 }{ a 2 } ... { a 1 ,a 2 ,..., a k }满足条件子集数为 2 k -1 ,且不重复。那么当 n=k+1 时,则除添加子集{ a k+1 }之外,需要将 n=k 时得到 2 k -1 个子集全部添加 a k+1 ,形成的全部子集为 { a 1 }{ a 2 } ... { a k }{ a k+1 } ... { a 1 ,a 2 ,..., a k }{ a 1 ,a 2 ,..., a k , a k+1 } 子集总数应为 2 k -1+2 k =2 × 2 k -1=2 k+1 -1, 说明子集总数正确。 (3) 假设 n=k+1 时出现了重复子集,不妨设有子集 B i =B j , i ≠ j ,它们之中都包含 a k+1 。那么将 a k+1 从它们之中取出,则应有 Bi\ { a k+1 } =Bj\ { a k+1 },这与 n=k 时得到的子集不重复子集矛盾。故没有重复子集产生。 证毕。 理论上添右组合法可以快速求出任意有限数集的全部子集与其和,也就是构造出子集和函数的真值表表达方式。 三、 设计的软件及使用 我用 FoxPro 用添右组合法设计了 Subset_sum 软件。用这款软件可以求出任意有限数集的全部子集,顺带求出其元素和。由于计算机提供的资源不同,软件在不同的计算机上运行的数据范围会受到具体计算机的制约。 例 1. 验证数集 S={1,2,7,14,49,98,343,686,2409,2793,16808,17206,117705,117993} 子集有没有和为 138457 的子集。 此题摘自《算法导论》,书中只给了一个答案。我们来看看有几个。 如 图 1 所示,运行 subset.exe ,选择 BuildSet\CreateSet ,然后输入 S 集合的数,这样就可以生成其全部非零子集。 图 1 Subset_sum 建立集合 得到非零子集之后,就建立了 Subset_sum 函数,其定义域与值域可以选择 TruthTablec 查看。总共有 10383 个子集,也就是 2 14 -1 个。 如果想猜测验证所给数为子集和的个数,可以选择 GuessCheck 项,然后输入猜测的数,回车。 图 2 是输入 138457 后得到的 4 个子集 ,而书中只给出了一个。可见软件是比较全面地寻找了满足条件的子集。这一过程实际上是在值域中搜索,依据真值表列了出全部满足条件的子集,速度之快已是 O( n ) 级多项式时间复杂度。 讨论 p\np 的问题,不应将函数的建立时间包括在其中。 P 类问题借用函数 y = x 1 + x 2 +...+ x n 得出了子集和,而这个解析式是早已建立好的通用函数,其定义域包含了 Subset_sumh 函数的定义域,故而可以借用。用这个表达式计算必须保证自变量属于 Subset_sumh 函数的定义域才可以。不要以为使用函数 y = x 1 + x 2 +...+ x n 不是查表,实际上设计计算机运算器就是制作了一张真值表。在使用该公式求子集和时,难道不用看看子集的元素有哪些吗? 由和值去查找所有的和为此数的集合,即是所谓的 np 问题。这里从 2 14 -1 个数中查找子集和是 138457 完全是一个 O( n ) 级多项式时间复杂度查找问题。变量是 n , 而不是 14 。在子集和问题中,请记住 2 k -1 的 k 是一个常量! 图 2 输入 138457 得到 4 个子集 软件使用中,如果只想验证某个数是不是这个集合的子集和,那么请选择 YesNot 项菜单,输入猜测的数,系统会立即给出“是”与“否”的回答。 此外,该软件还可以依据和值及元素数来查找满足条件的全部子集,这要选择菜单 Conditions 来获得。这样可以减少那些不必要的子集出现。 四、 结论 做为退休的人,已经没有了利益的过多纷争,能做的事情是凭借兴趣,锻炼一下自己的脑子,免于过早痴呆。 结论是有的,那就是 P 类问题和 NP 类问题是同一类问题。 P=NP 。 2014-12-9 附软件: BuidSubset_Sum.rar
个人分类: 科研讨论|4334 次阅读|1 个评论

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

GMT+8, 2024-5-24 00:40

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部