大多数时候,令人困惑的事实是,是否要进行详尽的搜索(动态编程或反向跟踪或蛮力)来解决问题或采用贪婪的方法。
我不是在谈论使用贪婪来确定最佳解决方案,我说的是使用贪婪算法来找到“解决方案”。我试图找到一些标准的方法,我可以验证问题是否可以通过贪婪的方法解决。像Optimal子结构一样,用于动态编程的记忆。并没有任何具体问题。
我是否可以做任何归纳证明来判断贪婪方法是否总能产生最佳解决方案?
答案 0 :(得分:28)
为了证明使用贪婪算法可以解决优化问题,我们需要证明问题具有以下内容:
最优子结构属性:最优全局解包含所有子问题的最优解。
贪婪的选择属性:通过贪婪地选择本地最佳选择,可以获得全局最佳解决方案。
让我们考虑一下经典的活动选择问题。我们有 n 活动的 S ,每个活动都有一个开始时间
s[i]
和一个结束时间e[i]
。我们希望选择S的子集,以便选择最大化非重叠事件的数量。
This problem can be solved using a greedy algorithm,但我们怎么能证明呢?
我们需要展示它的展品:
考虑全局最优解S = {A', a, A''}
中包含的一般活动 a ,其中S
是全局最优解, a 是我们的小活动,A'
和A''
是在之前和之后之后找到活动的两个子问题。
如果问题具有最佳子结构属性,子问题A'
和A''
的最佳解决方案必须包含在全局最优解S
中。
这是真的,但为什么呢?
假设子问题A'
的最佳解决方案不在S
中。然后,我们可以在A'
中将S'
的最优值替换为A
,以获得优于S
的新的全局最优解。但S
是全球最优解决方案!矛盾。
我们需要证明我们贪婪的选择(选择先结束的活动)是正确的。
让B
成为子问题。让 b 成为首先结束的子问题B
的活动,因此 b 是我们(第一个)贪婪的选择。 我们需要证明 b 包含在B
的某些最佳解决方案中。
让X
成为子问题B
的最佳解决方案。让 x 成为首先结束的X
中的活动。
如果 b = x ,则 b 位于X
,B
的最佳解决方案我们已经证明贪婪的选择包含在最优解决方案中。
如果 b != x ,我们肯定有end_time[b] < end_time[x]
。
由于 b 是我们贪婪的选择(即首先在子问题B
中结束的活动),我们可以用{em> b <替换x
/ {>在X
中获取另一个最佳解决方案:X' = (X \ {x}) U {b}
。 X'
是最佳的,因为它具有相同数量的X
活动,X
是最佳的,在这种情况下, b 位于{{1} },X'
的最佳解决方案。
因此,我们贪婪的选择B
包含在b
的一个案例中的最佳解决方案中。
此外,还有一个强大的数学理论可以在某些情况下用于机械地证明特定问题可以通过贪婪的方法来解决。
简要说明:
可以定义名为 matroid 的特定组合结构。
过去一些聪明人证明,这些拟阵具有最优子结构属性和贪婪选择属性。
这意味着您可以对优化问题运行贪婪算法,它将找到最佳解决方案。您只需要验证您的问题是否在类似matroid的结构上定义。
有关此问题的更多信息,请访问here。