📜  贪婪算法的正确性

📅  最后修改于: 2021-04-24 16:02:47             🧑  作者: Mango

贪心算法会贪婪地选择一个候选对象(局部最优),并在不破坏可行性的情况下将其添加到当前解决方案中。如果通过上述步骤获得的溶液不是最终溶液,请重复进行直到达到全局最优或获得最终溶液为止。

尽管有几种数学策略可用于证明贪婪算法的正确性,但我们将尝试直观地证明它并使用矛盾的方法。

贪婪算法通常涉及一系列选择。贪婪算法无法回溯,因此一旦做出选择,便会做出选择。因此,至关重要的是,他们绝不能做出错误的选择。

假设S是通过对问题应用贪婪算法而获得的解决方案,而O是对该问题的最佳解决方案。如果SO相同,则默认情况下我们的算法是正确的。如果SO不同,那么在为该问题堆叠各种本地解决方案时,很明显,我们犯了一个错误,选择了效率较低的解决方案,导致使用S而不是O作为解决方案。但是根据贪婪算法的定义,我们总是选择局部最优解。
因此,使用矛盾证明可以说贪婪算法给出了正确的解决方案。

借助Krushkal算法,可以更好地理解上述证明。

克鲁斯卡尔算法:
这是用于查找图的最小生成树的贪心算法。

Kruskal算法可以说明如下:
0。创建最小生成树T,该生成树最初不包含边,
1.在G中选择边e,其中
(a)e不在T中并且…
(b)e为最小重量,且……
(c)e没有在T中创建周期
2.如果T不包含G的所有顶点,请转到步骤1。

T为获得的树, S为期望的树,使得W(T)> W(S)
显然,要做到这一点,在某个时间点我们选择了没有最小权重的边,但是根据上述算法,我们总是选择了最小权重边。因此,Krushkal的算法将始终给出正确的结果。请注意,V顶点的最小生成树必须至少具有V-1边,并且不包含循环。因此,在上述步骤中我们没有选择任何额外的优势。