这种贪婪的调度算法在哪里变得次优?

时间:2014-10-18 20:16:17

标签: algorithm math greedy bin-packing

这个问题的灵感来自another question关于流程分配的问题。这是对那里讨论的问题的一种扭曲和增强。

我们有 n 进程,我们需要将它们分配给尽可能少的处理器。每个流程都有一个预定的开始和结束时间,我们将根据时间单位定义,从1开始索引;一个进程将运行一些连续的时间单元序列。然后可以安排处理器运行任意数量的非重叠进程。

明显的贪婪算法是:

  

在每个步骤中,将剩余进程的最大非重叠集安排到下一个处理器上。

如何选择最大非重叠集?我们将算法保留为非确定性,因为这样可以更容易地分析并分成两个子问题。

基本上,前一个问题涉及行为,如果算法运行:这个算法可能生成一个子的最小 n 是什么最佳分配(即需要更多的处理器)?事实证明答案是 n = 4。有些情况下两个处理器就足够了,但贪婪的算法可能需要三个处理器(尽管如果幸运的话,它会分两步完成)。

这个问题涉及如果非决定论总是幸运

会发生什么
  

n 这个算法保证是次优的是什么?也就是说,最小的 n 是什么,我们可以找到一组进程,其中贪婪算法必须使用比必要更多的进程?

自Stack Overflow actively encourages asking and answering your own question以来,我会在这里这样做,你可以告诉我是否可以改进我的部分答案!

1 个答案:

答案 0 :(得分:0)

认为答案是 n = 7。我会尝试用 n = 7来证明问题出错了;但这只给出一个上限。 n = 6可能会出错吗?我不这么认为,但我不确定。

上限

假设我们要安排以下流程:

  • [1](即,该过程在时间单位1期间运行)
  • [2]
  • [4]
  • [5]
  • [1,2,3](即,流程在时间单元1到3中运行)
  • [2,3,4]
  • [3,4,5]

最佳分配看起来需要三个处理器:

  1. [1][2,3,4]
  2. [2][3,4,5]
  3. [1,2,3][4][5]
  4. 但贪婪算法会产生以下结果:

    1. [1][2][4][5]
    2. [1,2,3]
    3. [2,3,4]
    4. [3,4,5]
    5. 这里的关键点是它会在第一步安排四个(因为它很贪婪),然后我们留下三个成对重叠的过程。

      下界

      n = 6会出错吗?我不这么认为,但我不确定。在我看来,好像相关案例将是最佳解决方案需要三个处理器的地方,每个处理器运行两个进程。我们能否找到一个案例,其中贪婪算法在第一个处理器上调度三个,然后留下三个重叠的进程,因此总共需要四个处理器?

      我们需要三对,以获得最佳解决方案;但是我们需要以这样的方式构建这些过程:如果你在第一步安排其中三个,那么你就不能分两步完成。显然,这三个过程不能包括其中一个,或者解决方案可以继续,就像它对配对一样,但将其中一个留作单例。所以它必须从每对中取一个。

      如果进程可能需要非连续的时间块,我们可以这样做:

      • [1]
      • [2]
      • [3]
      • [1,2]
      • [2,3]
      • [1,3](这是不允许的,因为它会停止并重新开始!)

      最优解将每个单体与其补体配对;贪婪算法会在第一步将所有单例放在一起,然后我们留下的成对重叠过程将需要三个以上的处理器。但是我们已经作弊了,因为上面列出的最后一个进程不会连续运行一段时间。

      我们无法将最后一个更改为[3,4],因为它可以在与[1,2]相同的处理器上运行。实际上,除非它们的交点非空,否则我们不能有三个成对重叠的连续块。因此,我们最终得到类似[1,2,3][2,3,4][3,4,5]的内容,就像我们对七个流程案例一样。问题是,似乎不可能再添加三个可以一起安排的进程,并且仍然允许三处理器最优解决方案,而不允许使用三元组之一调度两个单例。如果我们尝试

      • [1]
      • [2]
      • [4]
      • [1,2,3]
      • [2,3,4]
      • [3,4,5]

      然后贪婪算法可能计划第一步[1][2][3,4,5],这将导致最佳解决方案(我们是寻找非确定性保证导致次优解的情况。)

      如果我们尝试

      • [2]
      • [3]
      • [4]
      • [1,2,3]
      • [2,3,4]
      • [3,4,5]

      然后我们在三个处理器上没有最佳解决方案,因为其中四个进程需要时间单元3。

      所有这些思考都告诉我,在 n = 6的情况下,贪婪算法将是最优的,因此 n = 7的上限是严格;但它缺乏证据。我们怎样才能证明它总是最适合 n = 6?