贪心算法,安排

时间:2015-09-04 09:48:57

标签: algorithm greedy

我试图了解贪婪算法调度问题是如何工作的。

因为我无法理解贪婪算法调度问题,所以我一直在阅读和谷歌搜索。

我们有n个工作要在一个资源上安排。作业(i)具有请求的开始时间s(i)和结束时间f(i)。

我们选择了一些贪婪的想法......

  • 接受s的递增顺序("最早的开始时间")
  • 按f - s的递增顺序接受("最短的工作时间")
  • 接受越来越多的冲突("最少的冲突")
  • 按f递增顺序接受("最早完成时间")

这本书说的是最后一本,按f的顺序接受将始终提供最佳解决方案。

然而,它没有提到为什么它总是提供最佳解决方案以及为什么其他3不能提供最佳解决方案。

他们提供了一个数字,说明为什么其他三个不能提供最佳解决方案,但我无法理解它的含义。

由于声誉不佳,我无法发布任何图片,因此我会尝试绘制它。

| --- | | --- | | --- |
| ------------------------- |
     增加s的顺序 低估了解决方案

| ----------- | | ----------- |
          | ----- |
      增加f-s的顺序 低估了解决方案

| ---- | | ---- | | ---- | | ---- |

| ----- | | ----- | | ----- |

| ----- | | ----- |

| ----- | | ----- |

增加冲突次数的顺序。 低估了解决方案

这就是它的样子,我不明白为什么这是每个场景的反例。

如果有人能够解释为什么每个贪婪的想法都有效/无效,那将非常有用。

谢谢。

2 个答案:

答案 0 :(得分:4)

我想我可以解释一下。
可以说,我们有n个工作,开始时间为s[1..n],结束时间为f[1..n]。因此,如果我们根据完成时间对其进行排序,那么我们将始终能够完成大部分任务。让我们看看,如何
如果一份工作提前完成(即使它是在系列的后期开始,那么工作很短),那么我们总是有更多的时间来完成以后的工作。让我们假设,我们可以在这个时间间隔内开始/完成其他工作,这样我们的任务数量就会增加。现在,这实际上不可能像在此之前完成的任何任务那样,那么那将是最早完成时间的那个,所以我们将在那个工作。并且,如果任何任务到目前为止尚未完成(但已经开始),那么如果我们选择了那个,我们就不会完成任何任务,但现在我们实际上已经完成了一项任务。所以,无论如何,这是最佳选择。
有许多可能的解决方案,可以在一个区间内完成最大数量的任务,EFT提供了一个这样的解决方案。但它始终是最大数量。

我希望我能解释清楚。

答案 1 :(得分:3)

由于@ vish4071已经解释了为什么选择最早的完成时间将导致最佳解决方案,我只会解释反例。任务[a,b]a开始,到b结束。我将使用您提供的反例。

  1. 最早的开始时间
  2. 假设任务[1,10][2,3][4,5][6,7]。最早的开始时间策略将选择[1,10],然后拒绝其他3,因为它们都与第一个碰撞。然而,我们可以看到[2,3], [4,5], [6,7]是最佳解决方案,因此最早的开始时间策略并不总能产生最佳结果。

    1. 最短的执行时间
    2. 假设任务[1,10][11,20][9,12]。此策略会选择[9,12],然后拒绝其他两个,但最佳解决方案是[1,10][11,20]。因此,最短的执行时间策略并不总能带来最佳结果。

      1. 最少的碰撞数
      2. 这个策略似乎很有希望,但是你的11个任务的例子证明它不是最优的。假设任务:[1,4],3x [3,6][5,8][7,10][9,12],3x [11,14][13, 16][7,10]与其他任务只有2次冲突,这比任何其他任务都少,所以首先通过最少量的冲突策略来选择它。然后会选择[1,4][13, 16],并且所有其他任务都会被拒绝,因为它们会与已选择的任务发生冲突。这是3个任务,但是可以选择4个任务而不会发生碰撞:[1,4][5,8][9,12][13, 16]

        您还可以看到,最早的完成时间策略将始终在这些示例中选择最佳解决方案。请注意,可以存在多个具有相同数量的所选任务的最佳解决方案。在这种情况下,最早的完成时间策略将始终选择其中之一。