任务/作业调度问题

时间:2011-04-15 08:37:05

标签: algorithm scheduled-tasks scheduling scheduler

我有一个任务/作业调度问题,我想找到最有效的算法来解决它。

假设有一些工人。每个工人都能够完成不同的任务/工作。以下示例可以说清楚:

  Worker A (can do): T2, T3
  Worker B         : T1, T3, T4
  Worker C         : T3, T5

现在我们有一个必须完成的任务列表。例如,列表类似于:T1,T3,T5

有一些限制:

  1. 每个任务必须由一名工作人员执行
  2. 可以同时执行多项任务
  3. 但是一个工人只能同时完成一项任务。 (他/她在完成任务之前不可用)
  4. 对于上面的例子,我们可能会有这样的时间表:

      T1 --> Worker B
      T3 --> Worker C   T5 --> Worker C
    

    您可能已经注意到,上述时间表并非最佳。因为T5必须等待工人C完成T3。以下解决方案更好:

      T1 --> Worker B
      T3 --> Worker A
      T5 --> Worker C
    

    因为没有等待。

    现在假设我知道了worker-tasks矩阵(什么工人可以做什么任务)。 任务将逐一进行,但不知道它会是什么。我被要求设计一个调度程序,为每个即将到来的任务自动找到一个空闲工作程序。最后所有任务完成后,等待时间最短。

    所以我需要一个这个调度程序的算法。如果完美的车轮已经存在,我不想重新发明轮子。任何人都可以帮忙吗?

    感谢。

2 个答案:

答案 0 :(得分:3)

听起来你正在寻找一种“Bin Packing”算法 -

http://en.wikipedia.org/wiki/Bin_packing

一般的装箱问题,与你所说的非常类似,是NP-Hard,所以如果你的输入尺寸超过微不足道,你就会忘记一个最佳的解决方案。

您可以找到的解决方案保证与最佳解决方案相差不远,通常是我的一些因素。那篇维基百科文章是一个很好的起点。

答案 1 :(得分:3)

对输入进行操作的算法称为on-line algorithms,这些算法不是预先知道的,而是“随你而去”。它们自然只是次优的。它们通过比最优算法更差而不是通过常数因子来衡量(例如,如果最佳解决方案(不是在线,即预先有整个输入)采取X步骤,那么您的在线应该不采用超过k * X步,k越小当然越好。

在您的情况下,要求不明确 - “最短等待时间”与什么相比?

可以帮助您的一个想法是选择具有最小任务列表的可用工作人员,为将来的任务保存更多“多样化”的工作人员。