为什么没有针对SAT和其他决策问题的近似算法?


18

我有一个NP完全决策问题。给定问题的一个实例,我想设计一种算法,如果问题可行,则输出YES,否则输出NO。(当然,如果算法不是最佳算法,则会出错。)

对于此类问题,我找不到任何近似算法。我一直在寻找SAT,并且在Wikipedia页面上有关近似算法的内容如下:该方法的另一个局限性是它仅适用于优化问题,而不适用于“纯粹”的决策问题,例如可满足性,尽管通常可以.. 。

例如,为什么我们不将近似率定义为与算法犯错的数量成正比呢?我们如何实际以贪婪和次优方式解决决策问题?


5
有一些MAX-SAT的近似算法。
Yuval Filmus

2
MAX-SAT不是决策问题,不是吗?
Ribz '16

15
近似算法始终用于优化问题。
Yuval Filmus

4
因此,您基本上希望拥有一种可以快速完成但允许偶尔给出错误答案的算法。我认为您在这里使用诸如“近似算法”和“最佳”之类的定义明确的术语会极大地使您感到困惑。这些具有非常具体的含义。我猜您正在寻找一种启发式方法-如果您使用该术语更新您的问题(或从头开始提出一个新问题,以避免更多的困惑),则可能会有更好的结果。
AnoE

尽管这不是一个完整的答案,但它可以部分解释原因:存在一些重要的SAT问题,对于这些问题,仅低位错误并不比一半位错误好。
约书亚

Answers:


33

近似算法仅用于优化问题,不适用于决策问题。

在尝试解决某些决策问题时,为什么不将近似率定义为算法所犯错误的比例?因为“近似比”是一个具有明确定义的标准含义的术语,所以它意味着其他含义,并且对两个不同的事物使用相同的术语会造成混淆。

好的,我们可以定义一些其他比率(让我们称之为其他比率-例如,“比率”)来量化算法针对某个决策问题所犯的错误数量吗?好吧,目前尚不清楚该怎么做。那部分的分母是多少?或者换一种说法:将有无数的问题实例,对于其中的某些算法,算法将给出正确的答案,而对于其他算法,它将给出错误的答案,因此最终得出的比率是“除以无限的东西”,最终变得毫无意义或没有定义。

或者,在大小为n的问题实例上,我们可以将定义为算法错误的错误分数。然后,如果存在这样的限制,我们可以将r n的限制计算为n 。这[Rññ[Rññ定义明确(如果存在限制)。但是,在大多数情况下,这可能不是很有用。特别是,它隐含地假设问题实例上的分布均匀。但是,在现实世界中,问题实例上的实际分布可能并不统一-通常距离统一很远。因此,以这种方式获得的数字通常并没有您希望的有用:它常常给人一种对算法有多好的印象。

要了解有关人们如何处理顽固性(NP硬度)的更多信息,请参阅处理顽固性:NP完全问题


3
+1。但是最后一点不是很可靠,有人可能会争辩说,您可以定义近似比率,即当n达到程序在输入长度n时输入的错误数超过长度n的字符串数时,n的极限为无穷大。当然,这实际上没有用,因为通常只输出“ YES”(或“ NO”)的简单程序就可以达到良好的比率(有时甚至是1!)。
aelguindy '16

1
@det,这是一个单独的问题,您应该单独询问(在标准教科书或在线资源中阅读此问题之后)。我们希望您每个帖子只问一个问题。
DW

1
@aelguindy,好点。我已经相应更新了答案。
DW

2
@det为什么贪婪?“几乎”解决决策问题意味着什么?
拉斐尔

2
@Mehrdad:通常会通过最坏情况的错误来评估近似算法:有史以来非最佳算法的上限。因此,例如,您可能会说给定的近似算法总是找到的结果至少是最佳结果的五分之六。没有真正的方法可以将其转化为决策问题。如果你的算法有时会发出(说)0.1,那么无论它有时掉0.9(在这种情况下,你会做的更好,在最坏的情况下,总是EMIT 0.5),在“近似” -ness是假的和“0.1 ”实际上只是表示“ 0”。
ruakh

14

您在决策问题中看不到近似比率之类的原因是,它们通常在人们通常询问的决策问题的背景下没有意义。在优化设置中,这很有意义,因为“关闭”很有用。在许多环境中,这没有任何意义。看到您在离散对数问题中“关闭”的频率没有多大意义。看到您多久“接近”查找图形异构体没有任何意义。同样,在大多数决策问题中,“接近”正确的决策也没有意义。

现在,在实际的实现中,在许多情况下,了解问题的哪些部分可以“快速”确定以及哪些部分不能“确定”是有帮助的。但是,与优化不同,没有一种千篇一律的量化方法。您可以按照建议进行统计,但前提是您知道输入的统计分布。大多数时候,对决策问题感兴趣的人并不是很幸运拥有这样的分布。

作为案例研究,考虑暂停问题。停顿问题是无法确定的。很遗憾,因为这是一个非常有用的问题,可以解决您正在编译的问题。但是,实际上,我们发现从暂停问题的角度来看,大多数程序实际上都非常易于分析。在这种情况下,编译器利用此优势生成最佳代码。但是,编译器必须认识到有可能无法确定特定的代码块。任何依赖于代码“可能决定”的程序都会遇到麻烦。

但是,编译器用来确定其在解决这些特定情况下的停顿问题方面的性能的度量标准与密码程序用于测试特定的素数对是否可以抗攻击地硬化的度量标准有很大不同。没有一种适合所有解决方案的尺寸。如果您想要这样一个度量标准,则需要对其进行调整以适合您的特定问题空间和业务逻辑。


因此,据我了解,解决决策问题的唯一方法是设计效率可能非常低的最佳算法?因为我有一个决策问题(NP完全问题),所以我被要求提出一个贪婪(快速)算法来找到解决方案。我该如何解决?您是否了解针对此类问题的论文?
Ribz

1
@det推回去,让问题重述。如果您有一个NP完全问题,那么您就很固步自封,但是实际上您根本不需要解决一个问题。例如,您并不总是需要完美的答案。也许接近就足够了。或者,您可以为一些简单的案例解决问题,然后对困难的案例进行调整。例如,打包算法通常是NP完全的,但是使用概率方法可靠地达到最佳值的5%以内的算法是常见的。
科特·阿蒙-恢复莫妮卡

2
老实说,被告知要提出一个贪心算法来解决NP完全程序实际上与单手承担整个计算机科学/数学界的任务相同。如果您发现P中时间NP-完整的程序算法,在非常至少,你将获得解决P = NP的100万$克莱奖。实际上,您发现的结果将重塑我们所知道的计算,并在一夜之间彻底改变整个安全/加密行业。最好将任务的措词调整为无法证明NP完整。
Cort Ammon-恢复莫妮卡

我对NP完全问题使用了贪婪的精确算法。我只需要解决一个小问题,就可以在周末获得一台64处理器的服务器。
Patricia Shanahan

8

除了现有的答案之外,让我指出,在某些情况下,有必要为决策问题提供一个近似的解决方案,但它的工作方式可能与您想象的不同。

使用这些算法,只有两个结果之一可以确定,而另一个可能不正确。就拿米勒-拉宾测试为素数,例如:如果测试确定一个数是不是素数,这一结果是一定的。但是在其他情况下,这仅表示该数字可能是质数。根据您愿意投资多少计算时间,您可以增加对结果的信心,但是对于非主要情况而言,结果并不是100%。

在解决无法解决的问题时,此功能特别强大:您可以编写一个工具来尝试解决特定代码段的停顿问题。如果可以找到该程序不会无限循环的证明,则可以100%确定。如果找不到这样的证明,则可能只是程序控制流程太复杂,以至于您的工具无法分析,但这并不是证明它将永远循环的证明。通过简化控制结构,您也许可以创建一个等效的程序,该程序足够简单,以证明该工具肯定会停止。


概率算法(您的答案)和近似算法(问题)之间存在很大差异。特别地,两者的组合是非常特殊的品种。
拉斐尔

此外,我们知道了停机问题中不存在的概率算法,假设术语的合理解释在这方面。
拉斐尔

@Raphael我不打算将答案专门针对概率算法。当然,对于Miller-Rabin就是这种情况,但是正如您自己提到的那样,对于停止问题的示例而言,情况已不再是正确的,而且我想对于发现这种行为的大多数情况也不是正确的。我想表达的观点只是,您只会对一种结果有把握,而对另一种结果则不会。
ComicSansMS

如果您只说些半问题,那我不认为您在回答这个问题。
拉斐尔

@Raphael我的答案也不是专门针对半可计算的问题。实际上,我认为我所描述的方法甚至都不适用于半可疑问题。现在,您将确定在那里是否进入了函数的未定义分支,因此可以肯定地声明没有结果。我所描述的内容可以归结为:可能有一个答案,但是该算法可能看起来不够努力,无法发现它。
ComicSansMS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.