调度最多间隔而不是调度大多数任务

时间:2014-05-03 20:50:08

标签: algorithm

区间调度倾向于考虑如何安排最大数量的任务,而不是安排尽可能多的时间。有关如何修改典型贪婪算法以优化时间使用而不是任务数量的任何想法吗?

1 个答案:

答案 0 :(得分:0)

这是一个O(nlog n)动态编程算法:

假设存在n个任务,从时间b(j)开始并且在时间e(j)结束,其中1 <= j <= n。设f(x)是可以在没有任何计划任务在x时间之后的任何时间使用的约束下调度(使用)的最长时间。(x不必是整数。)我们将计算f(max(e(j))),其中最大值取自所有任务:这将是最终答案。

不是在数组中记录f()的值,而是由数组的第x个元素给出f(x),我们将仅以x的递增顺序记录对(x,y)的数组,但允许x值中的间隙。调用此数组S.对于每个最佳(&#34;最完整&#34;)解决方案,在S中将有一个(x,y)对,其最后使用的时间间隔在时间x结束时正好,并且总共使用y个单位时间。为了找到f(x),我们将在这个对数组中进行二分搜索以找到对(x&#39;,y)与x&#39; &lt; = x但尽可能大。直观地说,这意味着当寻找在x之后没有时间的最佳解决方案时,如果没有最佳解决方案使用时间&#34;直到&#34;时间x,然后我们退回&#34;到那时结束的最佳解决方案。

  1. 按结束时间排序所有n个任务。
  2. 对于从1到n的j:
    • 想法:尝试将任务j添加到可以容纳它的最佳时间表,即f(b(j))。我们将此计划与f(e(j))进行比较,以确定是否更好地包含任务j。计算f(b(j))需要通过S进行二元搜索,但f(e(j))可以在恒定时间内计算,因为它始终是S中最右边的一对。
    • 如果f(b(j))+ e(j)-b(j)> f(e(j))然后删除S中的任何尾随对(e(j),y)并将(e(j),f(b(j))+ e(j) - b(j))附加到S
  3. 返回S的最后一个元素,对应于f(max(e(j)))。
  4. 要实际恢复计划,可以向阵列S中的每个对添加第三个元素,以记录刚刚添加的最右边任务的标识。然后,一旦上面的算法运行,只需从末尾开始追溯数组S,在每一步中二进制搜索在b(j)或之前结束的最完整解,其中j是上一步中报告的任务