Algorithm 当局部最优解等于全局最优解时?关于贪婪算法的思考

Algorithm 当局部最优解等于全局最优解时?关于贪婪算法的思考,algorithm,global,greedy,Algorithm,Global,Greedy,最近我一直在研究一些贪婪算法问题。我对局部最优感到困惑。正如你所知,贪婪算法是由局部最优选择组成的。但局部最优决策的组合并不一定意味着全局最优,对吗 以兑换为例:如果我们有,用最少数量的硬币兑换15美分 10美分、5美分和1美分硬币,那么你可以用一枚10美分和一枚5美分硬币来实现这一点。但是如果我们加入一个12美分的硬币,贪婪算法就会失败,因为(1×12美分+3×1美分)使用的硬币比(1×10美分+1×5美分)多 考虑一些经典的贪婪算法,例如Huffman、Dijkstra。在我看来,这些算法是

最近我一直在研究一些贪婪算法问题。我对局部最优感到困惑。正如你所知,贪婪算法是由局部最优选择组成的。但局部最优决策的组合并不一定意味着全局最优,对吗

以兑换为例:如果我们有,用最少数量的硬币兑换15美分 10美分、5美分和1美分硬币,那么你可以用一枚10美分和一枚5美分硬币来实现这一点。但是如果我们加入一个12美分的硬币,贪婪算法就会失败,因为(1×12美分+3×1美分)使用的硬币比(1×10美分+1×5美分)多

考虑一些经典的贪婪算法,例如Huffman、Dijkstra。在我看来,这些算法是成功的,因为它们没有退化情况,这意味着局部最优步骤的组合总是等于全局最优。我明白了吗

如果我的理解是正确的,那么有没有一种通用的方法来检查贪婪算法是否是最优的

我找到了一些。
然而,这个问题并没有涉及太多细节。

您需要设计一个见证示例,在该示例中,您认为算法是全局算法的前提失败了。根据算法和问题进行设计

你换硬币的例子是不正确的。硬币的设计目的是让所有可能的组合成为可能,但不是为了增加混乱。您添加的12c是不保证的,是额外的


添加内容后,问题不是换硬币,而是另一个问题(即使主题是硬币,您也可以根据需要更改示例)。为此,您自己给出了一个见证示例,说明该问题的贪婪算法将陷入局部极大值。

一般来说,只要问题是凸的,局部最优解始终是全局最优解。这包括线性规划;具有正定目标的二次规划;以及具有凸目标函数的非线性规划。(然而,NLP问题往往具有非凸目标函数。)

如果启发式函数具有某些属性,则启发式搜索将为您提供具有局部最优决策的全局最优。有关这方面的详细信息,请参阅AI手册


一般来说,如果问题不是凸的,我不知道有什么方法可以证明局部最优解的全局最优性。

贪婪算法几乎永远不会成功地找到最优解。在这种情况下,这在很大程度上取决于问题本身。正如Ted Hopp所解释的,对于凸曲线,可以找到全局最优解,当然前提是要找到目标函数的最大值(相反,如果要最小化,凹曲线也可以工作)。否则,您几乎肯定会陷入局部最优。这假设您已经知道目标函数

我能想到的另一个因素是邻里函数。某些邻域,如果足够大,将同时包含全局最大值和局部最大值,因此您可以避免局部最大值。然而,你不能把邻居弄得太大,否则搜索会很慢


换句话说,不管你是否用贪婪算法找到全局最优解,都是特定于问题的,尽管在大多数情况下,你不会找到全局最优解。

有一些定理用拟阵(也称为greedoid)来表示贪婪算法最优的问题有关详细信息,请参阅维基百科的这一部分:

我认为问题与您的回答相反,即“如何证明一系列局部最优决策将导致全局最优?”您的硬币论点就是一个很好的例子。考虑到实际存在的硬币,是否有可能证明“做出改变”问题具有最佳子结构?@andrewjs是的,mabye添加12c不是一个好例子。但我想表达的是,当使用greeday算法时,对于每一步,你都会选择最好的一步。然后你首先选择12c,然后对于剩下的3美分,你只能选择1c*3。所以你说,我们需要逐个检查问题?没有一个通用的范例,对吧?@Aaron Novstrup:经过受过很多教育的分析后,没有找到一个证人,局部最优很可能就是全局最优。然而,我不知道如何证明这一点certain@Ivan韩:我的观点是,通过修改硬币,你改变了问题。硬币的设计是经过仔细挑选的。通过任意选择一枚硬币,你改变了问题。以具有不同硬币价值的外币为例,更改示例仍然有效。您所说的是,我们可以通过对问题的目录进行分类来验证局部最优。那么问题就变成了,有没有方便的方法来检查问题是否是凸的@伊万-我说得很随便。一个给定的问题通常可以通过多种方式解决,这取决于一个人选择如何表示它。一旦您有了一个特定的表示,那么它可能会也可能不会被归类为凸面或非凸面。例如,进行更改的示例问题可能可以表述为线性规划优化问题。然后,凸性自动跟随,将问题作为线性规划问题的贪婪算法将给出全局最优解。以其他方式表述,这样的结论可能是不可能的。哇!乍一看,我想这已经超出了我的知识范围。不是数学专家。如果我们想通过编程验证解决方案,有没有好的方法?@Ivan为分析和证明问题的许多属性(复杂性、可计算性)和算法(正确性、复杂性等)提供了基础。单靠编程是无法达到目的的。从目前的讨论结果来看,没有一种简单的方法可以验证局部最优和全局最优步骤之间的相等性。当使用贪婪算法时,你不能总是期望它产生全局最优解