进程分配算法

时间:2014-10-17 21:03:12

标签: algorithm data-structures greedy

我阅读了一些关于算法的资料,并遇到了一个问题。

我们有 n 个流程,每个流程都有预定的开始和结束时间。我们希望使用最少数量的处理器来运行所有这些过程。

考虑以下算法:

  

在步骤 i 中,选择不重叠的当前未分配流程的最大数量,并将它们分配给处理器 i

当没有进程未分配时,此算法结束。最大 i 是此算法的输出。 n 的最小值是多少,这样算法不会产生最佳答案?

简答: n = 5。但是,我不知道如何达到这个答案。你能解释一下吗?

1 个答案:

答案 0 :(得分:4)

这里有一个贪心算法。贪婪的算法在每一步都能做到最好,希望这能为整体提供最佳解决方案。它通常提供一种快速算法,而有时,但并非总是如此,这会导致最佳解决方案。

您的算法是贪婪算法的一个很好的例子,它有时提供最佳解决方案,有时不提供。它具有以下优点:它可以快速运行以获得最佳解决方案的近似值;这有时比提供最佳解决方案的非常慢的算法更好。

你的问题中存在一个重要的含糊之处。您说在步骤 i 上,您应该选择可以在处理器 i 上安排的剩余进程的最大数量。让我们假设此时可以安排的最大进程数为2.如果有多种方法可以选择2个非重叠进程,该怎么办?我们如何确定哪两个流程?

我要小心翼翼地解决这种含糊不清的问题。让我们说算法非确定性地选择要在当前处理器上调度的最大进程集。这意味着我们可以将您的问题转换为两个不同的问题:

  1. 此算法可能可能的最小 n 是什么?也就是说,让我们假设算法在选择最大集合时是不吉利的。事情出错的速度有多快?
  2. 该算法保证的最小 n 是什么是次优的?也就是说,让我们假设算法总是幸运的,如果有的话,选择正确的最大集合。那么事情出错的速度有多快?
  3. n = 4的陈述告诉我您将其解释为第一个问题。我认为第二个问题的答案是 n = 7,尽管我不确定。这是一个非常有趣的问题,我想我会就此问题提出一个后续问题!

    n = 4的情况下,如果我们不幸运,可以看出事情可能出错。让我们谈谈时间单位。对于这个例子,我们说有四个时间单位(如果你愿意的话,一天有四个小时,每个过程需要一个小时,一小时开始和结束)。我们假设我们需要运行四个流程:

    • [1](即,该过程只需第一次单位)
    • [2,3,4](即,流程需要时间单位2到4)
    • [1,2,3](等)
    • [4]

    现在,只有两个处理器可以使用分配。在第一个处理器上,我们运行[1][2,3,4];在第二个处理器上,我们运行[1,2,3][4]。而我们贪婪的算法可能找到这个解决方案并给我们一些最佳的东西。但可能计划[1][4]在第一个处理器上运行,因为这也是一个最大集(它将两个进程放到第一个处理器上)。如果它这样做,那么它就会离开[1,2,3][2,3,4],而这些只能一起运行,所以它最终会使用三个处理器。

    然后, n = 4可能会出错。 n = 3会出错吗?我不这么认为。最佳解决方案可能有三种可能性:它只需要1个处理器,或2个处理器,或3个处理器。如果最优解只需要1个处理器,那么这意味着可以在第一步调度所有三个进程,我们的贪婪算法将找到此解决方案。如果需要3个处理器,则不能同时调度两个进程,因此贪婪算法将一次调度一个,并将再次找到最佳(3处理器)解决方案。如果它需要2个处理器,那么它必须是两个进程可以一起运行。如果那是对的,那么贪心算法将在第一步选择两个进程。无论选择哪一个,只剩下一个,这将在第二步安排。所以贪婪的算法需要2个处理器,这也是最佳的。

    正如我所说的,我认为乐观的情况更有趣:这个算法保证是次优的 n 是什么? ?我会问一个关于这个问题的后续问题,并链接到这个问题!


    这里是follow-up question