【问题标题】:reason for the failure of greedy algorithm in following case以下情况下贪心算法失败的原因
【发布时间】:2017-11-22 05:44:46
【问题描述】:

我尝试解决一个声称可以仅使用动态编程解决的问题。以下是问题。 一个人的总能量为 H,他需要走完距离 D。他想在最短的时间内用最大的能量走完这段距离。他可以在 5 种模式下运行。根据 5 种模式中的一种,每公里跑完总距离。 这五种模式使用两个排序的数组来描述

时间:-'5m 10sec', '6 m 11sec','7 m 7sec','8 m 11sec','9 m 11sec'

所需能量:-11,9,8,7,6

所以我的贪婪解决策略是

  1. 计算 x=H/D 的地板
  2. 使用耗时最少且需要能量的模式运行下一公里

    &设置H=模式所需的H-能量

    设置 D=D-1

  3. 转到第 1 步,直到剩余距离变为 0。

  4. 答案将是每公里的所有时间。

我认为这个解决方案会奏效,但实际上却失败了。我知道如何使用 DP 解决它,但我想知道它在哪里失败。我尝试了很多例子,但没有得到感觉。我不完全记得上面两个数组元素,但它们必须按排序顺序。

【问题讨论】:

  • 您为什么希望它能够工作?试着证明你的算法应该有效,你会发现你的逻辑在某处有漏洞。
  • 好吧,对于你的算法,你现在甚至需要循环 - 答案是 (time: where max(E): E 最小和(所有模式的最小模式能量)*DL >= HL”的模式。需要“(所有模式的最小模式能量)*DL >= HL”来防止在 H=12、D=2 和第一步是 H=11 等情况下没有解决方案。
  • 你试过调试器了吗?
  • 您的x 有一个错误的假设,即对于每单位公里,您只能选择最多具有平均总能量的模式。这不是真的,考虑 H = 8,D = 4,有两种模式 (1, 10), (5, 1)。 x 为 2,因此您永远无法选择模式 2,因此您将使用 40 秒和 4 能量,而最佳策略是模式 1 跑 3 公里和模式 2 跑 1 公里,总共提供 31 秒和 8 能量
  • @shole 不,看我的逻辑,我在每一步都更新 D 和 H。所以对于最后一公里 H=5,D=1 和 x=5,所以算法会为最后一公里选择第二种模式。

标签: algorithm dynamic-programming greedy


【解决方案1】:

原因很简单;你还没有证明你的算法,所以你不能声称它是正确的。就那么简单。您是否知道研究文献中有多少启发式算法“看起来”正确,但它们没有正确性证明。因此,为什么它们只是启发式的。

您的解决方案是启发式的。举个反例。采取H=100, D=3。也将模式与时间[1,2,3,4,5] 和相应的能量作为[35,34,32,32,32]

您最初的xfloor(100/3)=33。能量最低的时间<=333。选择它。更新 H 和 D 使得 H=67, D=2。我们有floor(67/2)=33。再次选择时间3。更新 H 和 D 使得 H=34, D=1。最后x=floor(34/1)=34选择时间2。所以你的时间列表是[3,3,2],总能量32+32+34=98,总时间8

但是,我可以想出一个比你贪婪的解决方案更好的解决方案。即花费8单位时间但具有35+32+32=99总能量的时间[1,3,4]。打败你贪婪的解决方案。

故事的寓意?如果你不能证明你的算法,假设它是错误的,或者只是一个启发式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-07
    • 2020-09-16
    • 1970-01-01
    • 2016-01-07
    • 2015-07-25
    • 1970-01-01
    • 2012-01-01
    • 2021-11-08
    相关资源
    最近更新 更多