这是流行的El Goog问题的一种变体。
考虑以下调度问题:有n个作业,i = 1..n。有1台超级计算机和无限制的电脑。每个作业需要先由超级计算机预处理,然后在PC上处理。超级计算机上作业i所需的时间是si,i = 1..n。对于PC,它是pi,i = 1..n。 PC可以并行工作,但超级计算机一次只能处理1个工作。创建时间表S,超级计算机将根据该时间表处理作业。时间表S中的完成时间Ti(S)由作业在PC上完成的时钟时间给出。我们希望找到一个最小化Maxi [Ti(s)] 的时间表(读作:我们需要找到一个最小化最高完成时间的时间表)。提出了以下贪婪算法:按照处理时间的递减顺序在PC上排列作业。该算法的复杂性为O(nlogn)。要么证明这个算法产生了一个最优解,要么提供一个反例来证明它没有。
我的解决方案(不确定这是否正确):我认为我们如何订购工作并不重要。最高完成时间仍然是相同的。考虑PC上处理作业列表的处理时间的示例:&lt; 5,7,17,8,10&gt;。这将产生完成时间为&lt; 5,12,29,37,47&gt;。根据算法,我们将列表排序为&lt; 17,18,8,5&gt;并且将产生<17,27,35,42,47>的完成时间。因此,从技术上讲,贪婪算法确实提供了最佳排序,这需要花费时间,而简单地遍历作业列表会给我们带来相同的结果。
如果有人认为贪婪算法会更好或者我的方法有缺陷,我会很感激你的想法。 谢谢!
更新:我想我可能会得到答案。超级计算机所用的时间并不重要。这里的关键是PC在 parallel 中运行。从pi =&lt; 5,7,17,8,10&gt;的初始示例,加上si =&lt; 8,5,1,12,9&gt;。现在,在默认的未排序顺序中,我们的处理时间为&lt; 13,20,(8 + 5 + 1 + 17 =)31,34,45&gt;。所以45是完成时间。假设pi正在减少的排序顺序。输出为:&lt; 18,20,30,34,40&gt;。 [分类输入:pi =&lt; 17,1,10,8,5&gt;,si =&lt; 1,9,12,5,8&gt;]。
这是一个可能清除整个事情的例子: si =&lt; 17,10&gt;,pi =&lt; 10,17&gt;。未排序情况下的输出(也恰好按si的降序排序)将是&lt; 27,44&gt;。基于pi的排序,输入是:si =&lt; 10,17&gt;,pi =&lt; 17,2&gt;。输出<27,37>。由于PC并行运行,您希望最后发送最短的作业。
答案 0 :(得分:1)
对于有限数量的PC:
w.l.o.g假设没有超级计算机,您的问题将转换为Minmum Makespan Scheduling问题(或ppt),即NP-Hard。因此,您当前的算法不起作用或P = NP。
但贪婪算法对于近似值很有用,你也可以将Bin Packing转换为这个问题,并通过固定的误差量来获得良好的结果,但运行时不是很好的多项式(例如n ^ 10)。
P.S:您可以简单地假设没有超级计算机,因为这假设实例使得Max(s i )&lt;分钟(P <子> I 子>)。
P.S2:我一开始并没有看到无限数量的个人电脑,所以我写了这个,我会考虑无限数量的个人电脑。无限制案例
您当前的算法是错误的,假设这样的条件:
For PCs: <5, 7, 17, 8, 10>
For super computer: <1000,800,500,600,700).
您当前的解决方案将失败。
答案 1 :(得分:0)
S={a1,a2,...,an} of n
单位时间任务。单位时间任务只需要1个单位时间即可完成
截止日期d1,d2,...,dn, 1<=di<=n
处罚w1,w2,...,wn
。如果任务wi
未按时间ai
完成,则会产生罚款di
,如果任务在截止日期结束,则不会受到处罚。
问题是找到S的时间表,以最大限度地减少错过最后期限所产生的总罚款
我遇到了这个问题。如下
ai 1 2 3 4 5 6 7
di 4 2 4 3 1 4 6
wi 70 60 50 40 30 20 10
此问题的解决方案是
{a2,a4,a1,a3,a7,a5,a6}
penalty, w5+w6=50
答案 2 :(得分:0)
答案 3 :(得分:0)
在找到这个问题之前,我在cs.stackexchange问了同样的问题。 Jaeyoon Kim的答案证明了贪婪解的最优性。