是否有通用的方法来评估优化算法的最优性?


9

是否有一种通用的方法来评估优化算法的最优性,例如解决原本为NP困难或NP完全问题的算法?

到目前为止,我想到的唯一方法是将算法的结果与已知的最佳解决方案进行比较。

如果不是,是否有针对某些特殊问题的特定方法?

编辑要澄清:通过最优性,我的意思是结果与最优解的结果有多接近。


也许是对cstheory.stackexchange.com的问题?
卢西亚诺

您如何定义优化算法的“最优性”?您是否要对其源代码进行分析,然后报告其近似因子是多少?
亚历克斯十布林克

您可能指的是一种算法的“效率”,该算法用于“描述与消耗的各种类型的资源有关的算法属性”。算法也分为精确算法和启发式算法。精确的算法可以保证找到最佳的解决方案,但是可能要花几个世纪的cpu时间(对于实际大小的NP-hard问题),而启发式算法将在更合理的时间内找到接近全局最优的解决方案。(分钟或小时,这取决于输入的内容。
Florents Tselai

Answers:


3

这取决于问题的种类。

如果存在针对该问题的多项式时间近似方案(PTAS)(例如,欧几里得TSP),则您可以获得的解决方案可以任意接近多项式时间中的最优解。这意味着,对于每个e > 0,都有一个多项式时间算法可以找到您问题的近似解,保证在最佳解的(1+ e)之内。在这种情况下,您只需要比较两种算法在e相同值下的运行时/内存复杂度。如果一种算法可以做出与其他算法相同的“最优性保证”,但是运行时间/内存成本较低,那么它可能是更好的算法。

如果问题是APX而不是PTAS,即如果有多项式时间逼近算法可以保证产生的解在最佳解的恒定因子之内,则可以比较该恒定因子。因子较低的解决方案将提供更好的解决方案(但通常以更高的运行时间/内存成本为代价)

如果问题不在这两个类别中,那么我认为您可以做的最好的就是比较它们对一组随机问题或已知最优解的解决方案。


1

我认为没有通用的方法,但是肯定有一些方法。

以问题SET-COVER为例。对于那些不知道的人,问题如下:

给定一组元素B={1,2,...,m}和多个子集,S_1, S_2, ..., S_n其并集为B。您正在尝试找到这些子集的最小数量,以使联合保持静止B。现实世界中此问题的典型示例是,向您提供了一系列社区,并且您正在尝试寻找最佳的学校放置位置,以使每个社区的服务距离d最近的学校都不远。在这种情况下,B是的集合,S_xdTown 内的所有集合组成x

您证明此问题是NP-COMPLETE。但是,有一个简单的贪婪解决方案,您可以反复选择S_i未发现元素最多的集合。您可以证明该算法效果很好

如果最优算法由k集合组成,则贪婪算法将仅由k ln(n)集合组成,其中ln是自然对数。


1

通常,对于“最佳性能”的任何定义,确定程序是否具有“最佳性能” A或“最佳性能” B的问题通常是无法确定的(如下证明)。这意味着没有一种方法可以始终告诉您算法的最优程度。

但是,在分析近似算法时,通常会采用一些方法。通常,逼近算法是通过保证其解与最优解之间的距离来评估的。我将给出一个示例问题和近似值,我将使用“下界”方法来证明这一点,这是一种非常常用的证明比率的方法。

有问题的问题是“卡车装载”问题:我们有很多相同的卡车(尽可能多),每辆卡车最多可承载重达T的货物。我们希望在这些卡车中装载n个物体,用于运输。每个对象i的权重均为w_i,其中w_i <= T(因此,没有一个物品不能装在卡车上,即使靠他们一个人也是如此)。项目不能分为几部分。我们想加满卡车,以便我们需要尽可能少的卡车。这个问题是NP完全的。

有一个非常简单的近似算法可以解决这个问题。我们只是开始向卡车装载物品,直到卡车装满,以至于下一个物品无法容纳为止。然后,我们再乘另一辆卡车,并向该卡车装载与前一辆卡车不符的物品。我们不再在这辆卡车上装载任何物品:相反,我们乘坐一辆新卡车,再次用很多物品装满它,直到不再适合为止,将最后一件物品再次放在自己的卡车上,依此类推。

该算法是针对问题的所谓2近似:它使用的卡车最多是最佳解决方案所需数量的两倍。“至多”至关重要:我们可能会幸运地找到最佳解决方案,但至少我们不会做得太糟。

为了证明这一点,我们首先定义所需卡车的最佳数量的下限。为此,想象一下我们可以将物品切成碎片:然后我们可以轻松地将每辆卡车(最后一辆卡车)完全装满。如果这样做的话,我们需要的卡车数量是我们对原始问题所需要的卡车数量的下限:在“最佳”情况下,最佳解决方案总是完全填满每辆卡车,在这种情况下,卡车数量相等,但是如果最佳解决方案使卡车空缺,那么它仅需要更多卡车即可。

现在我们来看一下近似算法。请注意,在每个步骤中,我们(部分)填充两辆卡车。还要注意,通过算法的工作方式,第一辆卡车中的物品和第二辆卡车中的物品不能一起放入第一辆卡车,因此它们的总和至少为T。这意味着每一步,我们至少要装载一个价值两辆卡车上的物品。现在比较这对我们的下界:在这种情况下,我们加载项的全车价值在一个卡车。换句话说,我们的近似算法(线性时间)计算的解决方案非常类似于我们的下限“解决方案”,但使用两辆卡车而不是一辆。因此,我们使用的卡车最多是最佳算法的两倍,因为我们使用的卡车最多是最佳算法下限的两倍。


该算法给出了一个恒定因数近似值:它的坏度是最佳解的2 。其他措施的一些示例:最多C比最佳解决方案多(加法误差,很少见),最多c log是最佳解决方案的n倍,最多cn次是最佳解决方案的劣,最多c 2 ^(dn)是最佳解决方案的两倍(非常糟糕;例如,一般的TSP仅接受具有这种保证的算法)。

当然,如果要确保证明的因素是可以证明的最佳因素,则应尝试查找算法给出的解决方案确实尽可能糟糕的实例。

还要注意,有时我们对非NP困难的问题使用近似算法。

我在大学的逼近算法课程中(很多)学到了这一点。


不确定性证明:令P是一个问题,而A和B是P的近似算法,其中A和B对于“最优性”的一些合理定义不具有相同的“最优性”,并且A和B的运行时间均为ω (1)(严格比恒定时间慢,即,对于较大的实例,它们变得更慢),并且A和B始终都停止。

令D是一个声称可以计算以下内容的程序:给定某个程序C计算出一个近似值P,对于足够大的输入,确定它与A一样好还是与B一样好(因此,您可以使用它对程序进行分类根据其最佳性)。

然后,我们可以使用D解决暂停问题。设E为程序,F为该程序的输入。我们将使用D来确定E是否会在输入F处停止。

我们设计一个程序G,该程序执行以下操作:给问题P输入一个S,它在F上同时运行E,在S上并行运行A:它先执行E一段时间,然后执行A,然后再次执行E,依此类推。如果E在F上停止,它将停止在A上运行,而在B上运行B并返回B的结果。如果A在E停止之前先停止,则返回A的结果。

现在在G上使用D来确定E是否在F上停止:如果E在F上停止,那么对于足够大的输入S,E在A停止S之前在F停止E(因为E停止的时间不取决于E的大小)。输入,与A)不同。因此,D报告说G具有B的最优性。如果E在F上不停止,D将报告G具有A的最优性。

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.