我试图了解贪婪算法调度问题是如何工作的。
因为我无法理解贪婪算法调度问题,所以我一直在阅读和谷歌搜索。
我们有n个工作要在一个资源上安排。作业(i)具有请求的开始时间s(i)和结束时间f(i)。
我们选择了一些贪婪的想法......
这本书说的是最后一本,按f的顺序接受将始终提供最佳解决方案。
然而,它没有提到为什么它总是提供最佳解决方案以及为什么其他3不能提供最佳解决方案。
他们提供了一个数字,说明为什么其他三个不能提供最佳解决方案,但我无法理解它的含义。
由于声誉不佳,我无法发布任何图片,因此我会尝试绘制它。
| --- | | --- | | --- |
| ------------------------- |
增加s的顺序
低估了解决方案
| ----------- | | ----------- |
| ----- |
增加f-s的顺序
低估了解决方案
| ---- | | ---- | | ---- | | ---- |
| ----- | | ----- | | ----- |
| ----- | | ----- |
| ----- | | ----- |
增加冲突次数的顺序。 低估了解决方案
这就是它的样子,我不明白为什么这是每个场景的反例。
如果有人能够解释为什么每个贪婪的想法都有效/无效,那将非常有用。
谢谢。
答案 0 :(得分:4)
我想我可以解释一下。
可以说,我们有n
个工作,开始时间为s[1..n]
,结束时间为f[1..n]
。因此,如果我们根据完成时间对其进行排序,那么我们将始终能够完成大部分任务。让我们看看,如何
如果一份工作提前完成(即使它是在系列的后期开始,那么工作很短),那么我们总是有更多的时间来完成以后的工作。让我们假设,我们可以在这个时间间隔内开始/完成其他工作,这样我们的任务数量就会增加。现在,这实际上不可能像在此之前完成的任何任务那样,那么那将是最早完成时间的那个,所以我们将在那个工作。并且,如果任何任务到目前为止尚未完成(但已经开始),那么如果我们选择了那个,我们就不会完成任何任务,但现在我们实际上已经完成了一项任务。所以,无论如何,这是最佳选择。
有许多可能的解决方案,可以在一个区间内完成最大数量的任务,EFT提供了一个这样的解决方案。但它始终是最大数量。
我希望我能解释清楚。
答案 1 :(得分:3)
由于@ vish4071已经解释了为什么选择最早的完成时间将导致最佳解决方案,我只会解释反例。任务[a,b]
从a
开始,到b
结束。我将使用您提供的反例。
假设任务[1,10]
,[2,3]
,[4,5]
,[6,7]
。最早的开始时间策略将选择[1,10]
,然后拒绝其他3,因为它们都与第一个碰撞。然而,我们可以看到[2,3], [4,5], [6,7]
是最佳解决方案,因此最早的开始时间策略并不总能产生最佳结果。
假设任务[1,10]
,[11,20]
,[9,12]
。此策略会选择[9,12]
,然后拒绝其他两个,但最佳解决方案是[1,10]
,[11,20]
。因此,最短的执行时间策略并不总能带来最佳结果。
这个策略似乎很有希望,但是你的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]
。
您还可以看到,最早的完成时间策略将始终在这些示例中选择最佳解决方案。请注意,可以存在多个具有相同数量的所选任务的最佳解决方案。在这种情况下,最早的完成时间策略将始终选择其中之一。