科学网

 找回密码
  注册

tag 标签: 多项式时间

相关帖子

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

没有相关内容

相关日志

征求数字电路优化和基因计算等方面合作者
accsys 2017-5-6 13:27
征求数字电路优化和基因计算等方面合作者 姜咏江 布尔电路可满足性问题,即一般称为 SAT 问题,长时间没有多项式时间的快速算法出现。 DPLL 方法虽然能够完备求出满足解,但是速度较慢,特别当合取范式 CNF=1 有唯一解的时候, DPLL 获得其可满足解,消耗的时间叫人难以忍受。 本人发明的子句消去法求 3-SAT 满足解,时间复杂度最坏的情况也不超过 O( n 4 ) ,因而计算速度较快。 图 1 是具有 200 个逻辑变量的 3-CNF 。 图 1 有 200 个变量的 3-CNF 这 200 个变量 500 个子句的 3-CNF ,用子句消去法在个人笔记本电脑上,求出结果为“真”满足解用了 4 分 43 秒(见图2,解数码串中那个些*,表示该位变量可以取值0或1)。这个求解的时间比起指数时间复杂度算法,同样的问题肯定是快得很多。有求 3-SAT 问题满足解的朋友,一定会从此实例中体会到子句消去法的多项式时间复杂度的特性。 图 2 3-CNF=1 的满足解和运行时间 子句消去法是完备的算法,即任何的 SAT 问题都可以得到确切的满足解,或者指出那些不满足的合取范式 CNF 。与 DPLL 算法相反, SAT 的满足解越少,子句消去法的求解速度越快。依据子句消去法理论,我们不仅能够求出 SAT 的满足解,而且能够依据 CNF 的结构明确判断出其无解,或者有几个解。 我所研究的是 SAT 问题满足解和全部解的计算方法。如何将这种快速的计算方法应用于实际领域,这还是些复杂而具体的问题。需要进一步地研究。 我设计完成了 3-SAT 求满足解和求全部解的计算机软件。如果有朋友愿意了解或进行相关的测试,请给我写信,以便我们建立联系,奉送测试软件。匿名需求,恕不接待。 我的邮箱是: accsys@126.com 2017-5-6
个人分类: SAT问题|3366 次阅读|0 个评论
多项式时间复杂度和指数时间复杂度相差多少?
accsys 2016-12-1 09:00
多项式时间复杂度和指数时间复杂度相差多少? 姜咏江 如果以问题条件中对象数量 n 做为考察标准,随着 n 的增大,什么样的算法耗时增长速度快?这就是解题当中的时间复杂度问题。同一个问题,寻找耗时增长速度最慢的算法,无疑具有十分重要的意义。 从数学知识知道,一次函数 y=a n +b 随着 n 的变大, y 的增长速度是不变的。还知道, k和c是大于1的正 常整数时, y =a 0 n 0 +a 1 n 1 +...+a k n k 和 z =a 0 c 0 +a 1 c 1 +...+a n -1 c n -1 +a n k n 比较,当 n 大到一定程度后, z 的增长速度要比 y 快得多。 y 的表达式称为多项式型, z 的表达式称为指数型。 在计算机编程的算法中,如果对 n 的重复操作是可以用多项式型计算,避开指数型无疑是人们所希望的。在计算机中对 n 的重复操作是可以用多项式型计算就是多项式时间复杂度 O( n k ) ,用指数型计算的过程,就是指数时间复杂度 O(c n ) 。有许多实际问题,人们只是找到了指数型的算法,没有找到多项式型算法。对于后者能否找到多项式型算法的研究成为了世界难题,这就是 P 与 NP 问题。 指数型最简单的是 z =2 n 。我这里就举求集合子集的例子,来说明这两者的关系。 A. 求 n 个元素集合的全部子集数。 用元素添加法知,包括空集有 C n 0 +C n 1 +...+C n n =2 n . B. 求 n 个元素集合的不超过 3 个元素的子集数。 包括空集有 C n 0 +C n 1 +...+C n 3 . 由此可见多项式型和指数型之间的关系。多项式型的幂指数一定是不超过一个常数,这是二者区别的关键。在 n 增大的时侯, k 是不能够也跟着 n 增大。很多人混淆了这种约定,因而陷入了无法自拔的境地。 不可否认,多项式型在 k 相当大的时侯,随着 n 的增大,用计算机计算仍然耗时庞大,但与指数型最小的 2 n 比起来也会是“小巫见大巫”。 证明 C n 0 +C n 1 +...+C n n =2 n 如下: 添右定理 : n 元集合用添右组合法得到全部非空子集为 2 n -1 个。 这个定理需要证明全部非空子集不少,且都不相同。 这里用归纳法来证明。 设 n=2 ,那么 A= { a 1 ,a 2 },则 A 的转移组合得到的子集为{ a 1 }{ a 2 }{ a 1 ,a 2 }子集数为 2 2 -1=3 说明子集数正好且不重复。 设 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 }{ a2 } ... { 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, 说明子集总数正确。 假设 n=k+1 时出现了重复子集,不妨设有子集 B i =B j , i ≠ j ,它们之中都包含 a k+1 。那么将 a k+1 从它们之中取出,则应有 B i \ { a k+1 } =B j \ { a k+1 },这与 n=k 时得到的子集不重复子集矛盾。故没有重复子集产生。 证毕。 2016-12-1
个人分类: P/NP问题|10829 次阅读|0 个评论
子句消去法求SAT问题满足解口诀
accsys 2016-11-8 08:19
姜咏江 消去块中唯一解, 不然找一可选解, 解多暂时一边放, 全多选解可得解。 《时间复杂度解释: 子句块变量唯一解的判断条件为有2 k-1 个0或1,如果同时0和1都有2 k-1 个SAT无解 。 SAT 的子句块最多有 2 k C n k +2 k-1 C n k-2 +…+ C n 1 这多项式个,子句块变量最多为 k 个, k 是一个常数,子句块可能重复的子句不会超过 2 k-1 C n k-2 +…+ C n 1 个,所以对子句块去掉重复子句的操作不会超过一个常数,知时间复杂度总是 O ( 1 )。这样,对 SAT 全体子句块去重复子句的操作时间复杂度就是多项式 O( n k ) 。 可选解通过设定变量值,然后施行子句消去法,到关联剩余子句块全多解或关联段边界。 这一过程最多有可能进行 2 k C n k +2 k-1 C n k-2 +…+ C n 1 个子句块消去操作,最坏每个变量操作 2 次, n 个变量操作时间复杂度就是 O( n k+1 ) 。 只要是变量全多可选解,那么可一次求出满足解。 这有定理保证。 结论:子句消去法时间复杂度不超过O( n k+1 )。 》 2016-11-8
个人分类: 教学点滴|2287 次阅读|1 个评论
公开搞学术研究要经得起冷嘲热讽
accsys 2016-11-5 07:17
姜咏江 学术研究并不都需要秘密地进行,特别是那些所谓的世界难题一类,公开在科学网上研究论证,不怕讥笑和嘲讽,借助于批评者,能够获得快意和驱动力,激奋你快速前进。这是我两年多钻研子句消去法求解 SAT 问题满足解的特有体会。 两年中,我从无知 SAT 问题到有所收获,除了我自身的数学和计算机的功底之外,探索科学的强烈兴趣是我研究重要的动力。我将所有的不同见解作为参考,也作为鼓励自己前进动力的一部分,提醒自己,要善待或感谢那些嘲讽与讥笑,最后收获的将一定是由衷的快乐。 证明子句消去法是多项式时间算法确实很艰难。虽然我构造了子句块、关联段、变量可选解、降阶子句块等概念,并运用限位数理论解决了变量无解和唯一解形式的判断,以至于证明了每个变量都有 2 个可选解的 SAT ,都可以用子句消去法求出满足解,但证明子句消去法是多项式时间复杂度的算法仍然是艰难的。这种艰难源自于消去子句过程中,要删除子句块中的重复子句,或者要涉及到数排序。 大家知道, k-SAT 中 n 个变量的 k 个变量子句最多有 2 k C n k 个,去重复的过程中,子句数不会超过这个数,要用通常的去掉重复子句的方法,最坏大概要进行 2 k C n k 的阶乘次比较。显然,这不是一个多项式时间可以完成的问题。解决这个问题需要懂得计算机硬件设计方面的知识。设计一个带有存储单元空满标志的存储器,并实行数据标记单元存储法,这个问题就转化成多项式时间算法了!核心思想就是将二进制表示的子句,放到这个数为地址的存储单元(专家排序法 http://blog.sciencenet.cn/blog-340399-995138.html )去掉重复,然后通过标志来选择操作这些数据。 SAT 问题不仅是一个数学和计算机软件程序设计的问题,它是一个用数学理论、计算机设计制作理论与方法的综合性问题。 限位数理论是我早年的研究, SAT 问题的解决中逼出来了专家排序法。不管今后这些方法会起到怎样的作用,作为一个凭借兴趣探讨学问的人都会有幸福感。公开搞学术的好处是可以借助别人的批评快速进步,最大的体会就是要经得起冷嘲热讽。 2016-11-5
个人分类: SAT问题|2500 次阅读|0 个评论
子句消去法求k-SAT满足解(正式发表),附件是正式版
accsys 2016-10-17 08:55
子句消去法求 k-SAT 满足解 姜咏江 (对外经济贸易大学 北京 中国 100013 ) (没法直接写公式,只好将2016...pdf文件放在后面。) 摘要 本文将 k-SAT 问题用表格式表达,用限位数理论和方法找出了 k-CNF 特有规律,用作者发明的变量唯一解消去法,能够在多项式时间求出 k-SAT 的满足解。算法通过证明和大量 k-SAT 问题实例检验正确无误。 关键词 k-SAT 子句消去法 限位数 多项式时间 反子句 中图法分类号 TP301.6 O158 Remove-Clausemethodforsolvingk-SAT SatisfiedAnswer JIANGYong-Jiang ( UniversityofInternationalBusinessandEconomics , BeijingCHN100013 ) Abstract Inthispaper,thek-SATproblemisexpressedintheformoftable,usingthelimitnumbertheoryandmethodtofindouttheuniquelawofk-CNF,usingtheauthor'sinventionoftheuniqueanswerofthevariableRemove-Clausemethod,canbeinpolynomialtimetofindtheanswerofk-SAT. Algorithmthroughtheproofandalargenumberofinstancesofk-SATproblemstotest,theyareallcorrect. Keywords k-SATRemove-ClauseLimited-Number Polynomial-time Opposite-Clause 1. 引言 P/NP 问题是计算机与数学科学界一大难题 。自从 1971 年斯提芬 . 库克 提出 NP-complete 类问题之后,理论学界普遍认为,只要能够找到任何一个 NP-complete 问题的多项式时间复杂度算法,就可以确定 NP 类问题就是 P 类问题。进而认为对那些用计算机都计算缓慢的问题,也可以找到快速的算法 。 40 多年的时间过去了,人们找到了众多 NP-complete 问题,典型的有 SAT 问题、 3-SAT 问题及其一般化的 k-SAT 问题、哈密顿回路问题、旅行商问题、子集和问题等。但这些问题至今都无有公认的多项式时间复杂度的算法。许多人将此类问题的解决放到了未来数学家的肩上 。 本文作者的贡献是发明了子句消去法,用该法对 k-SAT 问题进行了全面的分析,利用限位数理论找到了合取范式 k-CNF 特有的结构规律,并可在多项式时间之内求出 k-SAT 满足解。 2. k-SAT 与二进制限位数 一般提到的合取范式当中的子句中会同时包含逻辑变量 x 和它的非运算 x ’ ,这样的子句在求 k-SAT 问题满足解时不起作用。因而本文中不讨论变量 x 和它的非运算 x ’ 包含在一个子句中的情况。 2.1 k-SAT 的定义 合取范式 k-CNF 是由 k 个逻辑变量或变量的非运算组成的多项式之间进行与运算的逻辑表达式,其中每一个参加与运算的多项式叫子句。多项式中的逻辑变量或者逻辑变量的非运算形式都是逻辑项,又叫文字。当 k=3 时的 3-CNF=1 求解问题,就是 3-SAT 问题。 下面给出合取范式 k-CNF 的严格定义。 定义1 . 将逻辑变量 x 的非运算用 x’ 表示,集合 A= { x 1 , x 2 ,..., x n } ,A’= { x 1 ’, x 2 ’ ,..., x n ’ }, k-CNF= 其中 k 是一个常正整数, n 0 是 n 的最小值, k ≤ n 0 , x ij ∈ A ∪ A’ , x ij x ij ’ , m 是子句的数量。 定义2 . 使 k-CNF=1 成立的一组变量值叫满足解。这个问题一般又叫 k-SAT 问题。 2.2 SAT 的定义 求 k-CNF=1 的满足解的问题过程,会涉及到 j =k , k-1 , k-2 , … , 2 , 1 的变化。为此,这里也要给出 SAT 的严格定义。 定义3 . 将逻辑变量 x 的非运算用 x’ 表示,集合 A= { x 1 , x 2 ,..., x n } ,A’= { x 1 ’, x 2 ’ ,..., x n ’ }, SAT= =1 其中 x ij ∈ A ∪ A’ ,且 x ij x ij ’ , v i 是第 i 个子句文字数, n 0 是 n 的最小值, v i ≤ n 0 , m 是子句的数量。 求 =1 的满足解问题一般就叫 SAT 问题。 2.3 限位数 限位数是用一定位数的数码排列得到的数,它与普通数不同是无效 0 不能省略。限位数理论是机器算术运算设计的基础理论 ,在本文中又是子句消去法设计的基础。 k 位二进制限位数共有 2 k 个,其值由 0 直排到 2 k -1 。如果 k 位二进制数超过了 2 k 个,那么就一定出现了重复的数。 表 1 列出的是 3 位二进制限位数,共有 2 3 个。 从 表 1 容易理解,全部的 k 位二进制限位数纵向排列,每一列 0 和 1 的数量都是 2 k-1 个,这一特点成为了子句消去法判断变量唯一解和 k-SAT 无解的依据。 在不失一般性的情况下,本文常以 3-SAT 实例来说明问题。 表 1 三位二进制限位数 x 1 x 2 x 3 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.4 K-CNF 数码表达形式 如果用 1 表示逻辑变量 x ,用 0 表示逻辑变量 x 的非运算形式 x ’ ,那么 k 个逻辑变量的子句构成的合取范式就可以用 表 2 来表示,其中 k=3 。 3-CNF=( x 2 ’+ x 1 ’+ x 0 ’)( x 2 + x 1 ’+ x 0 )( x 4 + x 3 ’+ x 2 ’)( x 4 + x 3 + x 2 )( x 4 ’+ x 1 ’+ x 0 ’) 表 2 不仅表示了 3-CNF ,而且表示子句全体的结构及其运算关系。 为了区别求解时变量的取值,将 表 2 中子句变量对应的 0 和 1 称为变量的表现值。 表 2 中每一个子句占一行,同色底纹的子句具有相同的变量,称为子句块。子句块包含变量数叫子句块的阶。 含有相同变量的子句块相互关联形成关联段。关联段中的子句块间称为关联子句块。 表 2 3-CNF 二进制数码表 x 4 x 3 x 2 x 1 x 0 0 0 0 1 0 1 1 0 0 1 1 1 0 0 0 k-CNF 可能有若干个关联段,关联段之间没有共同的变量,所以 k-SAT 的满足解可以由各关联段分别求出。 定义4 . 有 2 k 个不重复子句的 k 阶子句块,称为完全子句块。 由 表 1 可知,完全子句块就是 k 位二进制数全体。完全子句块,每一数位(变量表现值)的 0 和 1 的数量都是 2 k-1 个。 定义5 .k 阶子句块中互为反码的子句称为互反子句。 由 表 1 可知,完全子句块中每个子句都有反子句。 3. 子句消去法与性质 由表 2 可见,变量的表现值是 0 的话,表示是这位变量的非运算。如果我们设定这位逻辑变量的值是 0 ,通过非运算,子句的这个项值就是 1 ,从而就表示这个子句的逻辑值是 1 。同样,将变量值设定为表现值是 1 ,也是这种情况。于是可知,逻辑变量设定值与子句的变量表现值相同,那么包含该项的子句值就都是 1 。 依据 k-CNF 的定义,容易知道 k-CNF=1 求解中,若设定变量值,使子句的值是 1 ,则可以将该子句消去,不影响继续求解。 3.1 子句消去法 二进制数表示子句的 k-CNF ,如果将一个变量的值设定为 0 或 1 ,可使所有包含该变量这个表现值的子句值为 1 。那么求 k-CNF=1 解的问题中,这些子句都可以消去,而剩余部分可以继续这样做,直至全部的变量值都设定完为止。如果这一过程的最后没有剩余子句了,那么所设的变量值全体就是这个 k-CNF=1 的满足解。如果有剩余子句未被消去,说明设定的变量值使剩余子句的值为 0 ,这组设定值就不是 k-CNF=1 的解。这就是子句消去法 。 例如, 表 2 表示的 3-CNF ,若设 x 4 x 3 x 2 x 1 x 0 =10000 ,就可以将全部子句消去。将这个值带入原 3-CNF 的文字表达式,则有 3-CNF=1 ,说明 x 4 x 3 x 2 x 1 x 0 =10000 是一个满足解。 3.2 相关的定义与定理 为了能够更清楚准确地论述问题,需要严格给出如下一些概念。 定义6 . 运用子句消去法,能把子句块的全部子句消去的一组变量值叫块解。 定义7 . 运用子句消去法,不使剩余关联子句块无解的变量值,叫变量可选解。 定义8 . 能把关联段全部子句消去的一组变量值叫段解。 对于 k 阶完全子句块施行子句消去法,总会有子句不能消去。 定理1 .k- 阶完全子句块无可选解( k=1,2,3,…C , C 是一个正整数)。 证明: 因为完全子句块的每个变量的0和1表现值都有 2 k-1 个,故无法设定变量值将子句全部消去,所以完全子句块无解。 定理2 .k 阶子句块中无反子句的子句是块解。 证明: 因为用这个子句变量的表现值逐一消去子句后子句块不会有剩余子句。 定理3 .k-SAT 有解,其子集有解。 证明: 显然, k-SAT 的解都是子集的解。 用定理 3 可以将变量表现值唯一的所有子句设定该值之后,全部消去,实行化简继续求解。 定理4. 属于 k 阶子句块,但不在其中的互反子句都是块解。 证明: 将互反子句中的一个添加到子句块,依据定理2,这个子句是添加它之后的块解。再依定理3知,这个添加的子句是原子句块的块解。 定理5 . 运用子句消去法, k-SAT 有解的充要条件是每个变量都有可选解。 证明:( 充分性)设每个变量都有可选解,依据变量可选解的定义,可知每个关联段都有解,因此 k-SAT 有解,充分性成立。 (必要性)假如 k-SAT 存在无可选解变量,则这个变量所在的关联段无解。依定理 3 ,知 k-SAT 无解。 运用子句消去法每设定一个变量的值,并消去那些含有该变量表现值的子句之后,剩下的含有这个变量的子句中,这个变量值已经确定,未确定值的那些变量表现值就变成了 k-1 阶子句。这种过程就是降阶运算。随着变量值的设定和消去子句,子句块最后都会降到一阶。 定理6 .k 阶子句块的变量只有 2 k-1 个 0 (或 1 )表现值,那么这个 0 (或 1 )是该变量的唯一可选解。 这个定理称为唯一解定理,在子句消去法中起着十分重要的作用。 证明: 依据二进制限位数理论知,当 k 位二进制数的一位有 2 k-1 个相同值时,其余 k-1 位就形成了 k-1 阶完全子句块。如果不设定这个表现值为变量的解,消去相关子句后,就会剩下 k-1 阶完全子句块,会出现这个剩余子句块变量无解。而设定该值,就会消去可能产生的剩余完全子句块。因此这个表现值就是该变量的唯一可选解。 逻辑变量可选解最多有 2 个。若某个变量只有 1 个可选解,称变量有唯一解。 如果 k-SAT 或剩余的 SAT 的每个变量都有 2 个可选解,那么可依据下面定理求满足解。 定理7 . k-SAT 或 SAT 的每个变量都有 2 个可选解,那么从任意一变量确定值出发,消去子句块变量唯一解相关子句,如此继续,可得到它们的满足解。 证明: 由可选解定义可知,选择变量可选解,消去剩余子句块变量唯一解的子句,剩下的变量仍然有 2 个可选解,不然就被消去。继续这样操作,知最终可得 k-CNF=1 或 SAT=1 的满足解。 4. 子句消去法算法 依据子句消去法及其性质,对分成子句块表格式的 k-CNF=1 求解的算法如下: (1) 化简:将变量有唯一表现值设定为解,将相关子句消去; (2) 去掉子句块中重复子句; (3) 判断变量可选解,无可选解转( 10 ); (4) 变量有 2 个可选解,记录可选解数量,选择另一变量,转( 3 ); (5) 变量有唯一可选解,确定该变量唯一解,消去相关子句; (6) 对剩余子句重复( 1 )至( 5 ),若全部变量设置完成(无剩余子句)转( 9 ); ( 7 ) 对剩余全有 2 个可选解变量,从任意一变量设定解出发,依据变量唯一解消去子句; ( 8 ) 有剩余子句且有变量值未设定转( 7 ); ( 9 ) 得满足解结束。 ( 10 ) 无解结束。 5. 算法时间复杂度 定理8 :子句消去法是多项式时间复杂度算法。 证明 :算法第( 1 )步的时间复杂度为 O( n ) 。第( 2 )步的 k 阶子句块中因 k 是常数,即子句块中变量的数量不变,依据定义 1 ,子句块中子句最多不超过 2 k 个,所以这步操作的时间复杂度不会超过一个常数,即是 O(1) 。第( 3 )变量最多有 n 个,判断一个变量可选解的子句块数量最多是C n k 个,最多要对 k 阶的 个子句块进行无解、唯一解和多解的判断,这是一个不超过 O( n k ) 时间复杂度的过程。 那么,对每个变量最坏要设置 0 和 1 进行检验的情况,最多要进行时间复杂度为 2 n 倍的 O( n k ) ,即要进行时间复杂度不超过 O( n k+1 ) 的操作。 定理 8 证毕。 6. 结论 P/NP 问题中所谓的多项式是指 k 是一个小于 n 的常整数, n 的初值可以是 k , 在 n 增长的过程中, k 保持不变。不能够总有 k= n 的理解,因为这样 n k 就是幂 n n ,实际上没有了 k ,从而混淆了常量与变量的概念。 如果确实有 n -CNF ,那么依据子句消去法,这是一个 n 元变量的子句块,只要 n -CNF 不是完全子句块,依据定理 2 和定理 4 ,总能找到 n -CNF=1 的满足解。这一过程只与子句的数量 m 有关。问题变成了在 m 个 n 位二进制数的集合中查找反码的问题。诚然有 1 ≤ m ≤ 2 n ,但已绝非是与 2 n 个数中的 n 有关的问题了, n 仅仅是数域的一种计算量而已。 不难看出求 k-SAT 满足解的子句消去法,完全适合求 SAT 的满足解。 7. 参考文献 PversusNPproblem, https://en.wikipedia.org/wiki/P_versus_NP StevenCook.Thecomplexityoftheoremprovingprocedures.InProc.ThirdAnnualACMSymposiumontheTheoryofComputing,pages151-158,1971. 楊照崑 楊重駿,未來數學家的挑戰 . http://episte.math.ntu.edu.tw/articles/mm/mm_10_2_04/ 姜咏江 自己设计制作 CPU 与单片机 , 北京 人民邮电出版社 2014.9 , p237-243. 姜咏江 3-SAT 分段子句消去法 . http://blog.sciencenet.cn/blog-340399-928224.html / 子句消去法求k-SAT满足解(同行讨论稿).pdf 姜咏江 ,男, 1945 年生,副教授, CCF 高级会员( 08073s ),主要研究方向为计算机微体系结构设计、计算机理论和数学 .
个人分类: k-SAT求解|3659 次阅读|0 个评论
k=n时k-SAT能快速求解吗?答田文洪老师
热度 1 accsys 2016-6-29 12:57
k=n 时 k-SAT 能快速求解吗? 答田文洪老师 田文洪 2016-6-2821:45 姜老师,一种情况就是如同SAT问题(可把3-SAT看作其特殊组合形式),当CNF输入项是2^k个不同项时,你所建议的方法的计算复杂度。此种情况可能是SA丅问题的最坏或最难情况,应该说明一下。 博主回复(2016-6-2821:59) : 田老师,子句标志消去法基础在于反子句的概念。SAT是1到k个变量的子句都可能存在,都有反子句。只要n位二进制数可以由无反子句的子句或不在SAT中的子句构成,那么这个数就一定是SAT的解。 上面是我与田老师的交流(见 http://blog.sciencenet.cn/blog-340399-987007.html )。我的回复不会使田老师满意吧?也许答非所问。遵照田老师的建议,我需要很好地解答这方面的问题,这样能够一起更好地讨论。 1.k=n子句就是标志 若k=n,那么k-SAT中每个子句就是它的标志。因而只要看n位二进制数有哪些数不在k-SAT当中,取其反码则为解。特别是当子句数为2 n 个时,可以直接判定无解。这种情况应该说最简单,而不是最复杂。虽然k=n时最多可有 2 n 个子句,但我们查找的是不在0~ 2 n -1中的数,这个过程的算法时间复杂度为O(x),x是一个变量。 2. 怎样理解 SAT 有n个变量的SAT,子句可以从1阶到n阶,因而各阶的子句总数会远远超过2 n ,但依子句消去法可知,低阶子句消去的同时,包含低阶子句的高阶子句也同时被削去了。由于低阶子句数总是高阶子句的组成部分,如果任何一低阶子句存在完全子句块,SAT都不会有解。不然从低向高阶施行子句标志消去的过程,剩下的子句标志都与剩下的n阶子句数有关。由1可知,其操作过程同k=n时的复杂度相同。 我们还是举例说明吧。 例如,在下面的SAT中有2阶和3阶子句。当我们操作低阶子句消去子句标志时,高阶子句如果包含低阶子句,那么高阶子句的子句标志也同时被消去了,这样剩下的子句标志一定都是被消去子句的反子句或SAT中没有的子句构成的。于是知剩下的这些n位数的反码,一定是SAT的解。 … x4 x3 x2 x1 x0   NO   x4 x3 x2 x1 x0 1 0 0   0 0 0 0 0 0 0 1   0 0 0 0 1   0 0 0       2   0 0 0 1 0   1 0 0       3   0 0 0 1 1   1 0 1       4   0 0 1 0 0   1 1 1       5   0 0 1 0 1   0   0 1     6   0 0 1 1 0   1   1 0     7   0 0 1 1 1   1 1     1   8   0 1 0 0 0   0 0     0   9   0 1 0 0 1     1 0 1     10   0 1 0 1 0     1 1 0     11   0 1 0 1 1     0 1 1     12   0 1 1 0 0     1 1 1     13   0 1 1 0 1     0 0 0     14   0 1 1 1 0       0 1 0   15   0 1 1 1 1       1 0 0   16   1 0 0 0 0       1 1 0   17   1 0 0 0 1       0 0 1   18   1 0 0 1 0               19   1 0 0 1 1               20   1 0 1 0 0   21   1 0 1 0 1 AS.8' 1 0 1 1 1   22   1 0 1 1 0 AS.24' 0 0 1 1 1   23   1 0 1 1 1               24   1 1 0 0 0               25   1 1 0 0 1               26   1 1 0 1 0               27   1 1 0 1 1               28   1 1 1 0 0               29   1 1 1 0 1               30   1 1 1 1 0               31   1 1 1 1 1 是否正确,还请多多指正。 姜咏江 2016-6-29
个人分类: k-SAT求解|3772 次阅读|2 个评论
子句消去法如何避免进入无解分支求解
accsys 2015-12-26 05:57
子句消去法如何避免进入无解分支求解 姜咏江 合取范式 3-CNF=1 的解是由 n 个逻辑变量的可满足取值所决定的,用子句消去法求解时,只要一个逻辑变量无法确定使子句值为 1 ,那么整个 3-CNF=1 就无解。实际上,整体的 3-CNF=1 是由一些局部的性质所决定的。这种局部特征集中体现在子句块和关联段,并且随着变量值的设定子句块和关联段都在缩小,特别是关联段,随着子句的消去,会划分成更小的关联段。因而用子句消去法求解 3-CNF=1 ,常常是分为一些局部求解。在求解中只要我们记牢无解的基本结构,就可以避免进入无解的情况,从而顺利地逐步获得满足解。 1. 合取范式 3-CNF=1 无解的基本结构 用子句消去法求 3-CNF=1 的解,先要清楚无解的情况。一般来说, 3-CNF=1 只有三种结构会出现无解。 ( 1 )子句块有 8 个子句; ( 2 )有两个变量的值已经确定,无法设定第三个变量的值; ( 3 )有一个变量的值已经确定,其余两个变量表示的子句有 4 种不同基本类型。 2. 唯一解值类型 子句块中变量写出的 0 或 1 称为变量表示值,而消去子句选择的 0 或 1 称为变量的解值。变量解值一经选定,该变量表示值与之相同的子句都可以消去。如果一些子句能够被唯一的一组解值消去,则称该组值为唯一解值。 局部的唯一解是求解 3-CNF=1 的关键,熟练掌握唯一解的情况,就能够快速地得到整体解。 3-CNF=1 唯一解值类型如下: ( 1 )子句块有一个变量有 4 个一样的表示值。 因为一个子句块若有一个变量有 4 个相同表示值,那么其余两个变量的表示值一定形成了 00 , 10 , 01 , 11 这四种,不然就出现了重复数。此时只有选择那一个有 4 个相同表示值做为该变量解值,那么才不会出现无解。 ( 2 )子句块两个变量值确定,第三个变量只有一种表示值。 ( 3 )子句块有 3 个子句,且一个变量值已经确定。 这种情况待选值变量取值以表示值多的为准。例如子句块中 x 1 已经确定为 0 ,有子句块如下: x 1 x 2 x 3 1 0 0 1 1 0 1 0 1 这时只要设定 x 2 =0 , x 3 =0 即可。 3. 关联段求解顺序 懂得了无解和唯一解的结构,按照下面的操作顺序, 3-CNF=1 求解就不是难事。 ( 1 )先检查是否有 8 个子句的子句块,没有转( 2 )。 ( 2 )找子句块有 4 相同表示值变量,设定该值,消去相应子句,否则转( 3 )。 ( 3 )都是多解子句块,找出关联子句块设定一个块解,消去相应子句,转( 4 ),若出现无解,则结束。 ( 4 )对剩余子句块先求唯一解,后定多解,直至关联段结束或多解转( 3 )。 4. 几点说明 ( 1 )子句消去法求解合取范式满足解的方法具有很强的鲁棒性。即使整个 3-CNF=1 无解,我们仍然可以确定出有解的部分和无解的部分,这对做多因素分析十分重要。 ( 2 )如果我们在实际问题研究中归纳出了 k-CNF-SAT ,那么你可以将 k-CNF-SAT 归约成 3-CNF-SAT 获得一些满足解(参考: http://blog.sciencenet.cn/blog-340399-945744.html )。 ( 3 )运用表上作业的子句消去法求 3-CNF=1 的解,是一个对 n 个变量设值的过程。这种设值过程不需要重复,只要进行 n 次即可,因而子句消去法完全是一种 O(n) 的多项式时间复杂度的算法。不妨随便写出一个 3-SAT ,用子句消去法求解试试,速度之快,超出以往的想象。 2015-12-25
个人分类: 3SAT解法|2403 次阅读|0 个评论
组合数C(n:n-k)是不是多项式?
热度 2 accsys 2015-8-26 08:10
组合数 C n n-k 是不是多项式? 姜咏江 在 P/NP 的问题中,多项式的概念成为了探讨 P 是否等于 NP 问题的关键。关于多项式我在博文《关于多项式时间的辨析》 http://blog.sciencenet.cn/blog-340399-895336.html 、《算法多项式时间复杂度不靠谱的证明》 http://blog.sciencenet.cn/blog-340399-898296.html 、《有限元线性过程计数原理》 http://blog.sciencenet.cn/blog-340399-896333.html 和《算法多项式时间复杂度是天大的笑话!》 http://blog.sciencenet.cn/blog-340399-895858.html 当中提出了自己的看法,并提出了从等式 2 n = 来看,所谓 O( n k ) 的多项式时间是一个悖论。 从组合数计数公式 C n k =n(n-1)(n-2)…(n-k+1)/k! 来看,这是一个 k 次多项式,其中 k ≤ n 。在此等式中总有 C n k =C n n-k 这个相等的关系式,那么我们不禁要问:“ C n n-k 是不是多项式?” 多项式有一个很重要的性质:任何有限个多项式之和都是多项式。 我用组合多项式的方式求出了 n 个数的全部子集,并且求出了任何子集的和(请见博文 http://blog.sciencenet.cn/blog-340399-849597.html )。如果你承认了求子集和的这一过程是多项式过程,那么 2 n 不是多项式就成了错误的认识;如果你不承认这是一个多项式过程,那么“任何有限个多项式之和都是多项式”这个性质也就不存在了,也就是说所谓的多项式概念也不存在了。这不是个悖论吗? 归根结底,我们要回答 C n n-k 是不是多项式? 2015-8-26
个人分类: 科研讨论|7942 次阅读|4 个评论
问题求解与验证的区别,答柳渝之质疑
热度 1 accsys 2015-7-19 08:36
问题求解与验证的区别,答柳渝之质疑 姜咏江 对于我提出的“子句消去计数法”是多项式时间算法,柳渝网友提出了质疑(见 2 ),她认为一个子句去检索 2 n 个名称,对 n 来说一定是指数时间的。其实 n 是否是解决问题过程重复的决定性因素,是判断 n 是否是“规模”的关键。在子句变量含在哪些一侧计数器名称检索中,规模不是 n 而是一个取值 0 至 2 n -1 的变量,理解了这一点,才能清楚子句消去计数法的“多项式时间复杂度”的本质。 不瞒各位网友,我已经用子句消去计数法设计了 3-CNF-SAT 运算器,只要你输入 3-CNF ,那么立即就会得到使 3-CNF-SAT成立 的全部解。 1. 问题求解与验证的区别 求解的方法(解题)是指根据给出完整的条件,通过计算一定能够得出结果,其特点是一次性成功。验证则是依据给出的条件(这个条件可能是求解的结果证书或部分条件),通过计算却不一定会得出正确结果,其特点是一个正确结果的确定,需要不确定性的多次验证。 例如,在 2 n 个 n 位二进制数的集合中查找某个值不超过 2 n -1 的数,问,这是一个验证过程,还是求解过程? 显然,这是一个求解过程,因为你总可以一次性地查询找到这个数。 求解的过程是确定性过程,即是函数。如果某过程的结果是不确定的,需要判断,这就是验证的问题了。 例如,从 A 地到 B 地走路多长时间可以到达? 这个问题看似很简单,但却是个验证问题。因为不同的人或者同一个人行走的速度会不同,因而全程消耗的时间也会不同,自然结果各不相同。对于一个人来说,他说要多少时间不能算数,到底用多长时间需要检验,或者验证,其结果往往是不确定的。验证那个人所说的时间,常需要多次检验。 回到如果查询逻辑变量的子句 x i ’+x j +x k 是否在某一个一侧计数器的名称中的问题。因为一侧名称计数器共有 2 n 个,因而变量名称完全的。所以一次性就能够确定这个子句都能够在那几个计数器名称之中,所以这是解题的过程,而不是验证的过程。 2. 柳渝质疑与回复 柳渝 2015-7-16 20:09 姜老师,您的算法“k-CNF-SAT子句消去计数法求解”的第二步: -从前到后检查每个子句,并将k个变量都在某计数器中的计数器加1。这一过程显然是多项式时间。 对每个含k个变量的子句,您是在指数个数2^n的计数器中检查此k个变量是否出现,然后来计数的,所以这一过程是“指数时间”,而不是您说的“多项式时间”。 博主回复(2015-7-16 20:38) : 不论多少个有限元素,检索的过程总是所谓多项式时间。 博主回复(2015-7-16 20:26) : 因为2^n个计数器是一个数而已,在算法执行中并不发生变化。不应该将数2^n和处理操作的这种数值关系混淆。我说过,任何数都可以表成指数形式,也可以表成底数形式,故而以是否是底数形式做时间判断,恐怕是多有不妥。 本文方法就可以在所谓的多项式时间解题,即一次性求出结果。验证或判断的特点是非一次性的。试试我的方法,你可以一次求出3-CNF-sat的全部解。 柳渝 2015-7-17 01:48 您说:“不论多少个有限元素,检索的过程总是所谓多项式时间。”此话需要辨析: 当我们谈论计算时间时,是有参照对象的。您的算法若相对实例的整个搜索空间(2^n),可以说是“多项式时间”,但是若相对实例的规模(n),就是“指数时间”了。 博主回复(2015-7-17 05:44) : 同意你的认识。检索不需要重复,只要找到就可以,并不涉及规模。 请参考: http://blog.sciencenet.cn/blog-340399-905817.html 2015-7-19
个人分类: 科研讨论|3239 次阅读|1 个评论
就P=NP问题回答网友的质疑
热度 1 accsys 2015-6-12 12:46
就 P=NP 问题回答网友的质疑 姜咏江 很好,终于有人能够提出具体的问题来探讨了。 下面是网友 slhzyx 对 http://blog.sciencenet.cn/blog-340399-887347.html 这篇博文探讨问题的质疑,由于回复场地太小,故单独写文作答。 1. 回答‘首先’:文中指出:‘由公式( j )我们立刻可以知道计算机能够计算出结果的问题都是 p 类问题。’这一段就是解答你所提出问题的,为何又返来问我? NP 问题也都是( j )公式可计算的。 2. 回答‘再次’:通过查询就可以知道猜测的问题是不是 p 问题。 3. 回答‘第三’:本文就已肯定地回答了 P=NP ,何须要看哪个公理?如果这个结论别人已经推导出来了,我在这里探讨这个问题还有什么意思?读书不能读傻了才好。 4. 回答‘还有’:这个问题的解释可以在很多地方都能找到,例如维基百科。 好了,你提出的问题我都作了回答。很愿意与你探讨。请看看我这篇博文 http://blog.sciencenet.cn/blog-340399-896333.html ,更希望能提出更多意见。 祝好! 2015-6-12
个人分类: 科研讨论|2380 次阅读|1 个评论
有限元线性过程计数原理
accsys 2015-6-8 08:18
有限元线性过程计数原理 姜咏江 计算机解题的时间计算问题倍受关注,如何通过数学方法计算,来准确地获得程序运行所需时间,至今尚未得到圆满的解决。计算机程序执行的过程除了出现死循环外,都是一个一个指令执行排列的线性有限过程。如果我们假定每条指令执行时间相同(实际不同可以确定),那么只要计算出指令实际执行的次数,就可以计算出程序运行完成所需要的时间。本文通过对有限元线性集合的计数过程研究,找到了对计算机程序执行所需时间计算的基本方法。 1. 线性有限集与计数过程 任何一个计算机程序中写出的指令是有限多个,不仅如此,在程序文件中,这些指令出现的顺序也是固定有序的。为了能够突出程序及其执行过程的本质,我们给出线性有限集和线性有限集计数过程的定义。 定义 1 :有限个元素位置确定的排列,称为 线性有限集 。 实际当中的任何计数过程都是在有限集上进行的,因为一旦计数发生在无穷集上,我们就无法用个数的概念来进行准确表达了。线性有限集的元素虽然位置固定,然而计数时可以分段跳跃式进行,也可以重复。 定义 2 :线性有限集上每个元素都至少计数一次,至多有限次,称为 计数过程 。 以计算机程序为背景的程序指令执行次数计数,并不改变程序设计的指令排列顺序。因而规定线性有限集的计数过程并不移动元素的排序。然而计数本身可能包含着重复,也允许选择和跳跃,但不管怎样,这种计数仍然是一个线性有限过程。计数中的元素常常可以被分段来选择和重复计数。 定义 3 :线性有限集的一个元素或两元素及中间元素组成线性有限集,称为 段 。 线性有限集的段是顺序计数的基本单位,段内不允许逆向计数,也不允许漏计段内元素,但允许段选择和段重复,允许段计数的有限次嵌套计数。一个或两个元素组成的段不会出现逆向计数。我们的这些约束条件是为了与计算机程序的执行过程相适应。 定理 1 :任何段在计数过程中至少被计数一次,至多被计数有限次。 根据段和计数过程的定义,定理 1 立即得证。 由于段允许重复计数,且允许段重复计数的嵌套,故而每个段都具有 3 个指标。这 3 个指标分别为:段内元素数、段重复次数和段嵌套的层数。依据这三个指标和乘法原理,我们立即会得到下面的段计数定理。 定理 2 (段计数定理) :设第 j 层的循环次数为 n j ,所在循环层数为 k 的一段,段内元素有 a 个,则该段计数次数 m = 。 由段计数定理,立即可以得到如下推论。 推论 1 :计数过程的第 k 层循环有最多有 m 段,则计数结果可由 M k = 计算。 推论 2 :如果计数过程的最高循环层数是 H ,且只有一段,那么线性有限集计数过程总结果 M = ,其中 a ki 只与层数 k 和该层的段序 i 有关,与循环次数 n i j 无关,若 a ki =0 表示不存在该段。 2. 程序指令重复执行次数计算 例如有 c 程序: x=0; y=0; z=10; t=0; for (i=0;i10;i++) { x++; for (j=0;j100;j++) { y++; for (m=0;m5;m++) { z++; t+=z; }}} 这是一个 4 层的循环嵌套。第一段包括: x=0; y=0; z=10; t=0; i=0; 其层数为 1 ,元素数为 5 ,循环次数是 1 。 第二段包括: i10; i++; x++; j=0; 其层数为 2 ,元素数为 4 ,循环次数是 10 。 第三段包括: j100; j++; y++; m=0; 其层数为 3 ,元素数为 4 ,循环次数是 100 。 第四段包括: m5; m++; z++; t+=z; 其层数为 4 ,元素数为 4 ,循环次数是 5 。 我想读者很容易会依据推论 2 计算出该程序指令重复执行的次数。 定理 3 :线性有限集的任意计数过程所得结果都是一个有限数。 证明:根据定义 2 立得。 定理 4 :线性有限集至多可划分出有限个段。 证明:(反证法)假设能够分化出无穷多个段,每个段至少会计数一次,且每个段至少有一个元素,那么计数过程的结果就是一个无穷大。这与定理 3 矛盾。 3. 计数的幂多项式 为了研究问题简单,我们给出定理 2 的推论 3 。 推论 3 :设最高循环层为 k ,每层循环数相同的只有一段,第 j 层循环最大数为 n j ,那么线性有限集的计数过程结果可以表示成 ,其中 a ij 是段内元素数 。 证明:根据推论 2 ,立即得证 。 我们称上面的公式为幂多项式。由于 a ij 可以为 0 ,上式的 n j 也可以用 n 表示。 幂多项式是研究 P/NP 问题的重要概念。 Email: accsys@126.com 2015-06-08
个人分类: 科研讨论|4378 次阅读|0 个评论
关于多项式时间的辨析
accsys 2015-6-3 21:38
关于多项式时间的辨析 姜咏江 在 P/NP 的问题中,不论是通俗的定义还是在形式语言的定义中,都将所谓的多项式时间做为重要的基础概念。什么是多项式时间?本文从计算机程序执行时间计算的角度出发,给出了程序执行时间计算的基本公式,并在该公式的基础上进行所谓多项式时间辨析。 1. 什么是多项式? 在数学中人们将 形式的表达式一般称为多项式,其中 x 是变量, n 是某一个确定的自然数, a i 是第 i 项的系数。从函数的观点看有函数 f ( x ) = 。其实,多项式的项是一种乘积的形式,而将多个乘积的表达式用加号连接起来,就得到了一个多项式。为此多项式还有函数 g ( x ) = ,它的右侧表达式又可以叫指数多项式;如果将幂底数和幂指数都认定是变量,那么就有二元函数 j ( x , y ) = ,右面的表达式又叫幂多项式。 2. 如何理解计算机程序执行时间计算? 众所周知,计算机是靠主频的时钟周期来划分时间单位的。一个时钟周期决定着计算机的一个基本状态。算法程序执行时间完全可以用其消耗的主频时钟周期计算出来。图灵机并没有这种实际严格的时间计算,但我们可以认为图灵机的每一次状态变换都需要一个统一的固定时间,这样就可以在假定时间单位下讨论时间消耗多少的问题了。 不论图灵机还是只有一个处理器的计算机,它们都遵循着线性顺序处理方式的特点来进行动作,因而计算算法程序执行的时间消耗,必然要遵从线性顺序处理方式的计算方法。这就是说计算机从程序启动的时刻起,所有的计时应为基本动作时间的总和,最终都可以用一个自然数来表示某种单位时间。 在这个数学计量过程中,可以依据某种条件来划分出计量的分段,这种分段我们称之为计量段。任何一个计量段都是有限的,而且最多只能进行有限次重复计量,不然就无法得到任何有效的计量结果。 如果某计量段的一次计量用自然数 n 表示,而有限重复的次数用 c 来表示,那么这段线性计量值就可以用 c × n 表示。当重复次数 c 恰好等于 n 的时候,就可以出现 n × n=n 2 的情况。如果重复次数恰好为 c=a × n k-1 的形式( a 是一个不等于 n 的数, k 是一个自然数),那么计量的表达式中就会出现 c × n=a × n k-1 × n=an k 这种表达式。如果我们探讨的是多个不同计量段的情况,就会出现 ( ij ) 的计算公式,其中 n 和 k 是幂底数和幂指数中的最大数, a ij 称为系数 。我们称公式( ij )为幂多项式。 幂多项式( ij )只有在极特殊的情况下才会成为幂底数 n 是一个变量 x ,最高幂指数 k 为常数的所谓“多项式”,此时公式( ij )就成为了 ;而当幂底数 n 为常数,幂指数 k 为变量 x 的时候,才能使( ij )成为所谓的“指数多项式”,那么公式( ij )就成为了 的形式 。 算法是程序设计的方法。一种算法客观上就规定了一个计算机程序执行的顺序,从前面谈到的时间计算来看,就成了一种划分时间段及重复计量的一种方法。 3. 程序执行时间都可以表达成幂多项式 在图灵机或现代计算机上,任何有解算法程序执行时间,不论如何,总能够用一个自然数表达出来,不然就与算法程序有解相悖。尽管有些问题的算法完成执行过程,恐怕要用人类都无法等待的时间才能完成,但聪明的人类可以不用等到那个结束的时候,而是采用数学方法计算出计算机能够解决这个问题所用的时间。因而研究计算算法执行时间具有十分重要的实际意义。 我们从计算机线性动作的基本方式出发,一般性地讨论了算法程序执行时间计算的基本形式( ij ),但这个表达式似乎对我们过于抽象。能不能从算法的角度说明( ij )公式中各个标识符所表达的实际意义?过去,许多人认为不可能确切地计算出程序执行的时间,其实这是完全可以办到的事情。 从计算机程序设计的基本结构来看,任何程序不外乎有顺序、分支、循环和子程序调用这四种基本结构。分支是有选择的顺序,而子程序可以镶嵌到调用点,使其变为顺序。这样一来,所有的程序都可以转化成顺序、分支和循环这三种基本结构。 虽然在算法设计当中有这三种基本结构,但在一个处理器上,算法程序实际执行中,一律都必须转化成一维线性有序执行的方式,即以机器基本动作的先后方式完成程序执行。这种执行方式可以通过( ij )幂多项式来计算基本动作的发生次数,其中 n 是多层循环结构的第 n 层循环次数, k 是循环嵌套层数, a nk 是循环体基本动作单位数。 如果我们更一般化地考虑基本动作单位是什么?那么可以认为在图灵机上就是一次状态转移,在现代计算机上就是一条机器微指令,在一般编程语言中,就认为是一个语句。在一般性编程语言中,虽然每个语句执行的时间不同,但这并不失问题探讨的一般性,因而我们仍然可以假定它们执行的时间相同。 4. 相关讨论 算法程序执行时间的计算无疑是关系到算法时间复杂度的决定因素。有关算法程序执行时间是由指令(基本动作)重复执行次数的多少来决定的,而指令重复执行次数又是由程序结构的循环层数 k 、层内循环次数 n 和各层内部指令数 a 三个量所确定。有关对算法时间复杂度的辨析,我们将放到另外的篇幅中讨论。 2015-06-03
个人分类: 科研讨论|7576 次阅读|0 个评论
P与NP问题是让聪明人做傻事
热度 3 accsys 2015-5-1 06:59
P 与 NP 问题是让聪明人做傻事 姜咏江 世界上的事情有难有易,这是人们都知道的常识。然而就是被称为世界上的聪明人常常做傻事。上中学时听说过:牛顿在门上挖一个大洞和一个小洞,为的是让小猫走小洞,大猫走大洞。这事真假且不论,反映出聪明的科学家也可能办傻事。 千禧大奖的头号世界难题, P/NP 问题就是一个让聪明人办傻事的闹剧。为什么?这事是让人们将所有的复杂的事情都去找简单的方法解决同一件事情的全部结果混为了一谈。 我以解决任意 N 个数的子集和问题为例,就可以说明这种混淆给人们带来的艰苦劳动是多么的不值得。 N 个元素集合每增加一个元素,那么就要增加 2 N 个子集,这就是说在不知道子集都是什么的情况下,需要以指数运算的方式来求这些子集,这在算法执行中自然要消耗大量的时间。如果我们将这一过程做为查找某个满足条件的子集是否存在( yes/no 问题),那么就不可能是一种较快执行的算法。如果我们在 N 个元素集合的所有子集都存在的情况下,去回答某个满足条件的子集是否存在的 yes/no 问题,我们只要用查询的方法就可以完成,也就是说我们可以用 O ( n )的所谓多项式时间复杂度解决问题,也就可以得出 P=NP 的结论。 因为求子集的算法是一个指数型运算过程,这个问题不可能用 n k 形式的算法( k 是常数)求解全部子集。即使某个曾经认为复杂的问题能够用简单的函数问题求解,也不代表能够将所有复杂的问题都可以用简单的固定多项式函数方式得到 yes/no 问题的回答。 我在这里规劝那些科学界的聪明人莫要再为这种傻事浪费时间了。请参考 http://blog.sciencenet.cn/blog-340399-849311.html http://blog.sciencenet.cn/blog-340399-861142.html 2015-5-1
个人分类: 科研讨论|3615 次阅读|9 个评论
请教“指令增速”和“算法指令增速”英文如何翻译?
热度 1 accsys 2015-2-7 16:20
本人英语水平有限。我想将《 算法时间复杂度与程序执行时间计算 》 http://blog.sciencenet.cn/blog-340399-861142.html 译成英文,不知“指令增速”和“算法指令增速”该如何翻译(定义请见连接博文),特请高人指点。
个人分类: 科研讨论|2927 次阅读|3 个评论
程序执行时间计算,多项式时间不靠谱
热度 1 accsys 2015-1-12 07:51
程序执行时间计算 姜咏江 简介 : 算法时间复杂度的研究,以所谓的多项式时间做为最低复杂度,实在有些不靠谱。计算机程序执行时间可以用其编译之后的机器语言程序来计算。因为每一机器指令(汇编指令)的指令周期都是确定的,故计算程序执行时间,可先计算出每条机器指令重复执行次数,然后与指令周期相乘求和,最终获得准确时间。本文提出的算法程序执行耗时计算,要以指令重复执行次数为基础,给出了指令重复执行次数的基本计算公式。 1. 背景 为了研究算法程序完成任务运行时间长短,人们引入了算法时间复杂度的概念。 在维基百科中,算法时间复杂度被定义为: 在 计算机科学 中, 算法 的时间复杂度是一个 函数 ,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的 字符串 的长度的函数。时间复杂度常用 大 O 符号 表述,不包括这个函数的低阶项和首项系数。 在百度文库中有计算方法解释:一般情况下, 算法 的基本操作重复执行的次数是模块 n 的某一个函数 f (n) ,因此,算法的 时间复杂度 记做: T(n)=O( f (n)) 。若 T(n)/f(n) 求极限可得到一常数 c ,则 时间复杂度 T(n) = O(f(n)) 。 不论维基百科还是百度的解释,都称算法时间复杂度是程序运行时间的定量描述。实际上,我们见到的 大 O 符号 表述只能算定性描述,根本谈不上定量。 为了能够确实对算法程序运行时间进行定量分析,本文从单处理器计算机指令设计与程序执行的原理出发,依据程序设计的基本结构,提出了一种比较切合实际的程序执行时间计算方法。结果会见到有限程序运行时间的计算,都可以表达成一种多项式形式。 2. 指令重复执行次数 我们知道,不论任何形式的计算机设计语言程序都要转化成机器语言程序才能够执行。因此,用与机器语言一一对应的汇编语言来讨论程序执行时间才应该是最准确的。不过由于各种语言程序在执行时间分析上具有一定的一致性,故而作定性分析时,也可以替代汇编语言。 不论何种计算机程序设计语言,就程序设计的基本结构来说都是一致的。程序的基本结构分为:顺序、分支、循环和子程序调用。任何计算机程序的执行都可以说是这几种程序结构的重复,所以计算程序执行过程所消耗的时间,都离不开对程序基本结构的分析。 程序执行的过程是由每个指令执行的过程组成的,因而程序执行的时间就是指令执行时间的累加。在汇编程序语言中,每条指令执行的时间消耗是确定的。特别是那些指令周期相等的计算机系统设计,用单一指令执行的时间乘以全部指令重复执行的次数,就能够计算出程序执行所需要的时间。如果计算机的指令周期不相同,则可以用每条指令的指令周期做为系数,进行所谓的加权求和来计算程序执行的时间。因此,算法程序执行时间的消耗,最关键的是计算出每条指令重复执行的次数。 3. 指令重复执行次数公式 我们将汇编程序不在执行状态的每条指令叫“写出的指令”,计算指令重复执行次数,就与这种写出的指令有关。 指令重复执行次数是由程序的基本结构所决定的。在顺序程序结构中写出的指令重复执行次数是 1 。而在循环结构中,写出的指令重复执行次数与循环的次数一致。程序执行中消耗时间最长的就是循环程序结构。直观地说,循环的次数越多,处在循环体内的写出指令重复执行次数越多,因而累计耗时就越长。在此种观点之下,整个程序就可以看成是多层循环结构,可以按照多层循环结构来计算程序执行时间。当然,子程序可以单独计算子程序执行的时间。由于分支程序结构的程序分支选择总是惟一的,故时间计算基本上等同于顺序结构。 我们将顺序与分支都认定为 0 层循环,那么程序运行的耗时计算,可以建立在多层循环结构的耗时计算上,也就是循环结构的写出指令重复执行次数计算上。如果用函数来描述,那么一个程序的指令重复执行次数 T 应为层内循环次数 n 与循环层数 k 的二元函数,即 T = f ( n , k ) 。为说明问题简单通俗,我们通过 c 程序的例子加以解释。 例 1 ,假设 n=k ,那么幂 n n 结构的 n 重循环用 c 语言描述如下。 for( i 1 =1; i 0 =n; i 1 ++){ for( i 2 =1; i 1 =n; i 2 ++){ ...... for( i n =1; i n =n; i n ++){ no 1 += 1; no 2 += no 1 ; }}...} for 语句条件表达式的初值语句在每层只执行一次,而定界和步长语句都要执行 n 次。显然最内层每个语句重复循环次数是 n n ,向外各层依次为 n n-1 、 n n-2 、 … 、 n 2 、 n 。那么总的语句重复执行次数为 1+3n+3n 2 +3n 3 +…+3n n-2 +3n n-1 +4n n 。 对于一个程序, 在顺序结构中,指令重复执行次数是 1 ;在单层 n 次循环结构中,指令重复执行的次数是 n ;在 k 层 n 次循环当中写出的指令,其重复执行的次数是 n k 。于是各层指令重复执行的次数可用公式 f ( n , k ) = a 0 +a 1 n +a 2 n 2 +...+a k -1 n k -1 +a k n k ( 1 ) 来计算,其中 a i 是各循环层的写出指令数, i=0,1,2,...,k 。 如果将公式( 1 )的 k 认为是常量,那么( 1 )式不就是一个多项式吗?我们能说这种形式的算法复杂度程序执行最快吗? 4. 计算类型实例 公式( 1 )中,若幂指数最高固定为常数 k ,则得到 k 次多项式;若幂底数固定为常数 k ,则得到指数多项式;若 1 层循环次数从 1 开始,逐层循环次数加 1 递增,则得到阶乘多项式。如此变化循环层数或循环次数,则可以得到各种重复执行计算的实际公式。为了说明这方面的演变,我们再举两个实例。 例 2 ,将( 1 )式的幂底数(循环次数)设定为常数 2 ,则能够得到指数型指令重复执行的多项式表达式 a 0 +a 1 2+a 2 2 2 +...+a n-1 2 n-1 +a n 2 n 。 例 3 ,设定幂底数是常数 k ,下面的循环结构可以实现 nlog k n 型的指令重复执行次数。 for( i=0; in; i++){ for( j=k; j=n; j*=k){ no 1 += 1; no 2 += no 1 ; }} 由 j*=k 知 j 的值循环变化序列为 k,k 2 ,k 3 ,..., k t =n ,于是内层循环次数 t=log k n 。 由于这个程序的外层循环次数是 n ,内层循环次数是 log k n ,因而程序指令重复执行次数总共是 1+2n+n+4n log k n=1+3n+4n log k n 。 5. 程序执行时间比较 关于算法程序时间复杂度,一种流行的观点认为多项式类型的算法复杂度较低,而且认为多项式类型算法程序运行耗时最少。其实这是一种错觉。 从公式( 1 )我们知道,决定算法程序执行时间长短的有两个因素,一个是多项式的幂指数 k ,另一个是多项式的幂底数 n 。当幂指数 k 较大的时候,虽然它是一个常数,我们也不能够认为多项式时间类型算法程序运行时间消耗会最少。特别在 nk 时,从( 1 )式立即知道, n k 多项式型算法程序时间的消耗会大于幂 n n 型算法程序的耗时。这说明在较大的循环层数的范围内,不能够就认为多项式时间具有较低的复杂度,当然也不能够认为这种情况的算法程序耗时最短。我们不妨仅就一项来进行比较。 例如设 n=5 , k=7 ,那么 n k =5 7 =78125 ;而 n n =5 5 =3125 。由此可见用多项式时间复杂度来说明算法程序耗时长短是不靠谱的事情。有人也许会说, n 趋于无穷才对。想象一下, n 趋于无穷大对程序执行的时间计算的意义有多大? 6. 结论 计算程序执行时间,要通过程序写出的指令重复执行次数进行,指令重复执行次数的多少,取决于程序循环结构的循环次数和循环层数这两个变量。通俗地讲,循环层数和循环次数越大,程序运行得出结果所消耗的时间越长。 任何在计算机上完成任务的程序运行,都需要在有限时间内解决问题,不然我们编写的程序就失去了意义。因而研究程序运行时间的有限性,远比研究程序执行时间的无限性更为重要。用算法程序执行中的指令重复执行次数来计算程序运行时间,是一种精确实用的计算方法。 同一任务的算法不同,会产生程序执行时间的很大差异,与此有关的内容是属于最优算法研究的问题,但不是所谓“多项式时间复杂度”就能解决的问题。 Email accsys@126.com 2015-01-10
个人分类: 科研讨论|4922 次阅读|2 个评论
P与NP问题概念解剖
accsys 2014-12-12 10:54
P 与 NP 问题概念解剖 姜咏江 把简单问题说复杂了,那叫蒙人;把复杂问题说简单了,那叫学问。 定义 1 : 集合 X 的 一个元素 x 与集合 Y 的一个元素 y 的对应 (x , y) 称为问题。 定义 2 : 集合 X 、 Y 关系确定的问题称为 NP 类问题,函数(映射)确定的问题称为 P 类问题。 定理 1 : 集合 X 、 Y 的 P 类问题亦是 NP 类问题。 证明 :若 (x , y) ∈ P ,则因函数(映射)是关系的特例,所以 (x , y) ∈ NP 。 定理 2 : 集合 X 、 Y 的 NP 类问题亦是 P 类问题。 证明:假设有 x ∈ X , y ∈ Y ,有问题 (x , y) ∈ NP 且 (x , y) ∈ P ,则可以定义一个函数(映射)使得 (x , y) 是该函数(映射)的一个问题。于是就有了 (x , y) ∈ P 。 函数或映射的定义域可以一般集合,可以是 n 维集合上的元素。 例如, x 是 n 个数集 A={a 1 ,a 2 ,...,a n } 的幂集 的 元素 ,则 x 的 元素和函数的问题为( x ,Σa i )(这里不好表示a i ∈ x) 。 定义 3 : 若 关系确定 的 问题可用 自然数 标号, 则称此 关系 是有序 关系,问题的标号称为序 。 所谓标号,就是问题与自然数集的数能够建立一一对应。 定义 4 : 若 函数确定 的 问题可用 自然数 标号, 则称此函数是有序函数 ,问题的标号称为序 。 定理 3: 有限 元素 集合 X 、 Y , X 到 Y 的 关系 是有序 关系 。 证明 :设集合 X 有 m 个元素 ,集合 Y 有 n 个元素 ,则当 x ∈ X , y ∈ Y 时,互不相同的问题 (x , y) 共有 m n 个,于是可以建立问题与 自然数集N={1,2,..., m n }元素的一一对应。 推论 1: 有限 元素 集合 X 到 Y 的 函数 是有序 函数 。 推论 2:以有限集合 A 的非空子集为元素定义的函数是有序函数。 证明 :设集合 A 的元素有 n 个,则 A 的幂集Β有 2 n -1 个 非空子集 元素。将非空子集用 1 到 2 n -1 的自然数标号,于是定义在Β上的任意函数的问题与 2 n -1 个从 1 到 2 n -1 的自然数一一对应。 定义 5 :有序关系问题按序列表,称为关系真值表。 定义 6 :有序函数问题按序列表,称为函数真值表。 定义 7 :寻找附合条件问题的过程,叫做求解。 定理 4 (多项式时间定理): m 元与 k 元有限集合间关系求解时间是多项式时间。 证明 :设有限集合间关系的 序为 N={1,2,...,n} , n=m k , 问题( a 0 ,y 0 )是要验证的问题。则依序最多比较 n 次可以得到是与否的结果。 故查找 问题( a 0 ,y 0 , ) 的时间复杂度是 O ( n ) 。 推论 3 :二 有限集合间的函数问题求解时间是多项式时间。 推论 4 : 有限集合到自身的关系求解是多项式时间。 推论 5 : 有限集合到自身的函数求解是多项式时间。 E-mail:accsys@126.com 2014-12-12
个人分类: 科研讨论|4581 次阅读|2 个评论

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

GMT+8, 2024-6-2 16:56

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部