我有一个NP完全决策问题。给定问题的一个实例,我想设计一种算法,如果问题可行,则输出YES,否则输出NO。(当然,如果算法不是最佳算法,则会出错。)
对于此类问题,我找不到任何近似算法。我一直在寻找SAT,并且在Wikipedia页面上有关近似算法的内容如下:该方法的另一个局限性是它仅适用于优化问题,而不适用于“纯粹”的决策问题,例如可满足性,尽管通常可以.. 。
例如,为什么我们不将近似率定义为与算法犯错的数量成正比呢?我们如何实际以贪婪和次优方式解决决策问题?
我有一个NP完全决策问题。给定问题的一个实例,我想设计一种算法,如果问题可行,则输出YES,否则输出NO。(当然,如果算法不是最佳算法,则会出错。)
对于此类问题,我找不到任何近似算法。我一直在寻找SAT,并且在Wikipedia页面上有关近似算法的内容如下:该方法的另一个局限性是它仅适用于优化问题,而不适用于“纯粹”的决策问题,例如可满足性,尽管通常可以.. 。
例如,为什么我们不将近似率定义为与算法犯错的数量成正比呢?我们如何实际以贪婪和次优方式解决决策问题?
Answers:
近似算法仅用于优化问题,不适用于决策问题。
在尝试解决某些决策问题时,为什么不将近似率定义为算法所犯错误的比例?因为“近似比”是一个具有明确定义的标准含义的术语,所以它意味着其他含义,并且对两个不同的事物使用相同的术语会造成混淆。
好的,我们可以定义一些其他比率(让我们称之为其他比率-例如,“比率”)来量化算法针对某个决策问题所犯的错误数量吗?好吧,目前尚不清楚该怎么做。那部分的分母是多少?或者换一种说法:将有无数的问题实例,对于其中的某些算法,算法将给出正确的答案,而对于其他算法,它将给出错误的答案,因此最终得出的比率是“除以无限的东西”,最终变得毫无意义或没有定义。
或者,在大小为n的问题实例上,我们可以将定义为算法错误的错误分数。然后,如果存在这样的限制,我们可以将r n的限制计算为n → ∞。这会定义明确(如果存在限制)。但是,在大多数情况下,这可能不是很有用。特别是,它隐含地假设问题实例上的分布均匀。但是,在现实世界中,问题实例上的实际分布可能并不统一-通常距离统一很远。因此,以这种方式获得的数字通常并没有您希望的有用:它常常给人一种对算法有多好的印象。
要了解有关人们如何处理顽固性(NP硬度)的更多信息,请参阅处理顽固性:NP完全问题。
您在决策问题中看不到近似比率之类的原因是,它们通常在人们通常询问的决策问题的背景下没有意义。在优化设置中,这很有意义,因为“关闭”很有用。在许多环境中,这没有任何意义。看到您在离散对数问题中“关闭”的频率没有多大意义。看到您多久“接近”查找图形异构体没有任何意义。同样,在大多数决策问题中,“接近”正确的决策也没有意义。
现在,在实际的实现中,在许多情况下,了解问题的哪些部分可以“快速”确定以及哪些部分不能“确定”是有帮助的。但是,与优化不同,没有一种千篇一律的量化方法。您可以按照建议进行统计,但前提是您知道输入的统计分布。大多数时候,对决策问题感兴趣的人并不是很幸运拥有这样的分布。
作为案例研究,考虑暂停问题。停顿问题是无法确定的。很遗憾,因为这是一个非常有用的问题,可以解决您正在编译的问题。但是,实际上,我们发现从暂停问题的角度来看,大多数程序实际上都非常易于分析。在这种情况下,编译器利用此优势生成最佳代码。但是,编译器必须认识到有可能无法确定特定的代码块。任何依赖于代码“可能决定”的程序都会遇到麻烦。
但是,编译器用来确定其在解决这些特定情况下的停顿问题方面的性能的度量标准与密码程序用于测试特定的素数对是否可以抗攻击地硬化的度量标准有很大不同。没有一种适合所有解决方案的尺寸。如果您想要这样一个度量标准,则需要对其进行调整以适合您的特定问题空间和业务逻辑。
除了现有的答案之外,让我指出,在某些情况下,有必要为决策问题提供一个近似的解决方案,但它的工作方式可能与您想象的不同。
使用这些算法,只有两个结果之一可以确定,而另一个可能不正确。就拿米勒-拉宾测试为素数,例如:如果测试确定一个数是不是素数,这一结果是一定的。但是在其他情况下,这仅表示该数字可能是质数。根据您愿意投资多少计算时间,您可以增加对结果的信心,但是对于非主要情况而言,结果并不是100%。
在解决无法解决的问题时,此功能特别强大:您可以编写一个工具来尝试解决特定代码段的停顿问题。如果可以找到该程序不会无限循环的证明,则可以100%确定。如果找不到这样的证明,则可能只是程序控制流程太复杂,以至于您的工具无法分析,但这并不是证明它将永远循环的证明。通过简化控制结构,您也许可以创建一个等效的程序,该程序足够简单,以证明该工具肯定会停止。