贪心算法,调度

greedy algorithm, scheduling

我正在尝试了解贪心算法调度问题的工作原理。

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

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

我们有一些贪心的想法select...

而书上说的最后一个,按f的递增顺序接受总是会给出一个最优解。

但是它没有提到为什么它总是给出最优解,为什么其他3个不会给出最优解。

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

由于我的声望低,我不能post任何图像,所以我会尝试绘制它。

‖|---| |---| |---|
|------------------------|
s 的升序 低估的解决方案

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

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

‖|-----| |-----| |-----|

‖|-----| |-----|

‖|-----| |-----|

冲突数量递增。 低估的解决方案

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

如果有人能解释为什么每个贪婪的想法行得通/行不通,那将非常有帮助。

谢谢。

我想我可以解释一下。
比方说,我们有 n 个作业,开始时间为 s[1..n],结束时间为 f[1..n]。所以如果我们按照完成时间排序,那么,我们总能完成最多的任务。让我们看看,如何。

如果一项工作较早完成(即使它在系列中较晚开始,这是一项短期工作),那么,我们总是有更多时间处理较晚的工作。让我们假设,在此间隔内我们还有其他工作可以 start/complete,这样我们的任务数量就会增加。现在,这实际上是不可能的,因为如果有任何任务在此之前完成,那将是完成时间最早的任务,因此我们将处理该任务。而且,如果有任何任务到现在还没有完成(但已经开始),那么如果我们选择它,我们就不会完成任何任务,但现在我们实际上至少完成了一个。所以,无论如何,这都是最优的选择。
有许多可能的解决方案,其中可以在一个时间间隔内完成最大数量的任务,EFT 给出了一个这样的解决方案。但它始终是可能的最大数量。

希望我能解释清楚。

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

  1. 最早开始时间

假设任务 [1,10][2,3][4,5][6,7]。最早的开始时间策略会选择[1,10]然后拒绝其他3个,因为它们都与第一个发生冲突。然而我们可以看到 [2,3], [4,5], [6,7] 是最优解,所以最早开始时间策略并不总是产生最优结果。

  1. 最短执行时间

假设任务 [1,10][11,20][9,12]。该策略会选择[9,12],然后拒绝其他两个,但最优解是[1,10][11,20]。因此,最短执行时间策略并不总是会导致最优结果。

  1. 最少的碰撞次数

这个策略看起来很有希望,但是你的 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].

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