这个问题的灵感来自another question关于流程分配的问题。这是对那里讨论的问题的一种扭曲和增强。
我们有 n 进程,我们需要将它们分配给尽可能少的处理器。每个流程都有一个预定的开始和结束时间,我们将根据时间单位定义,从1开始索引;一个进程将运行一些连续的时间单元序列。然后可以安排处理器运行任意数量的非重叠进程。
明显的贪婪算法是:
在每个步骤中,将剩余进程的最大非重叠集安排到下一个处理器上。
如何选择最大非重叠集?我们将算法保留为非确定性,因为这样可以更容易地分析并分成两个子问题。
基本上,前一个问题涉及行为,如果算法运行:这个算法可能生成一个子的最小 n 是什么最佳分配(即需要更多的处理器)?事实证明答案是 n = 4。有些情况下两个处理器就足够了,但贪婪的算法可能需要三个处理器(尽管如果幸运的话,它会分两步完成)。
这个问题涉及如果非决定论总是幸运:
会发生什么n 这个算法保证是次优的是什么?也就是说,最小的 n 是什么,我们可以找到一组进程,其中贪婪算法必须使用比必要更多的进程?
自Stack Overflow actively encourages asking and answering your own question以来,我会在这里这样做,你可以告诉我是否可以改进我的部分答案!
答案 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]
,[2,3,4]
[2]
,[3,4,5]
[1,2,3]
,[4]
,[5]
但贪婪算法会产生以下结果:
[1]
,[2]
,[4]
,[5]
[1,2,3]
[2,3,4]
[3,4,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?