算法:如何在每周小时配额内安排/分配小时数?

时间:2013-01-24 23:22:04

标签: algorithm date math time

如果我有5天*(8小时工作日 - 2小时意外工作)=每周30小时的使用时间,我如何以编程方式安排任务以填补30小时?

例如,我有5个任务,我估计每个任务需要花费以下时间:

#1:  2h
#2:  4h
#3:  6h
#4:  8h
#5: 10h

我如何对此进行排序:

M: #1 @ 2h + #2 @ 4h
T: #3 @ 6h
W: #4 @ 6h
H: #4 @ 2h + #5 @ 4h
F: #5 @ 6h

换句话说,如何解释'迭代和容器溢出'?

最终我还需要能够解决一周内溢出的任务,例如,如果上一个例子我有一个任务#6: 40h(本身比一周多10小时,并带来每周总和需要40小时才能进入前两周。)

编辑:

第二个更复杂的例子,同样有5个任务,这次是(可选)一周的要求:

#1:  2h, W[0][M]
#2:  4h, W[0][T]
#3:  6h, W[0][M]
#4:  8h, W[0][F]
#5: 40h, W[0][F]

我如何对此进行排序,比方说,

W[-1][M]: #5 @ 6h
W[-1][T]: #5 @ 6h
W[-1][W]: #5 @ 6h
W[-1][H]: #5 @ 6h
W[-1][F]: #3 @ 2h + #5 @ 4h
W[ 0][M]: #1 @ 2h + #3 @ 4h
W[ 0][T]: #2 @ 4h + #5 @ 2h
W[ 0][W]: #5 @ 6h
W[ 0][H]: #4 @ 2h + #5 @ 4h
W[ 0][F]: #4 @ 6h

Illustration #1

最好的情况实际上是#3将#1推回一天,如下图所示: Illustration #2

进一步澄清:

  • 对于每周指定的每一天(MTWHF),最多可填写6小时。
  • 如果有溢出,溢出到前一天。
  • 理想情况下,这种泄漏将以背包或类似优化的方式发生,因此整个/不间断的任务将尽可能完全填充6小时。
  • 同样地,对于那些被泄漏的日子,他们应该调整他们的溢出来完成任务 - 不破坏。

2 个答案:

答案 0 :(得分:2)

除非我遗漏了什么,否则这似乎是一个已解决的问题。如果动态分配任务(在现实环境中似乎很可能),earliest deadline first调度可以满足所有期限,前提是utlization仍然可管理。由于作业仅在新作业进入时被抢占,因此应该导致较低的上下文切换开销和相当好的工作连续性。这是一个简单的启发式方法,在文献中引起了一些关注,因此很多猜测都是从这个方程式中剔除的。

编辑:示例。

#1:  2h, W[0][M]
#2:  4h, W[0][T]
#3:  6h, W[0][M]
#4:  8h, W[0][F]
#5: 40h, W[0][F]

EDF order: #1, #3, #2, #4, #5.

Schedule: 113333332222444444445555555555555555555555555555555555555555

In days: 113333 332222 444444 445555 555555 555555 555555 555555 555555 555555

请注意,通过采用此先验计划并对EDF计划的结果进行后处理,我们可以在连续性方面做得更好。假设我们在开始这一天时有一些上下文切换开销,并且每当数字发生变化时,这个时间表产生13个上下文切换,其中只有10个是强制性的。通过时间表#3,#1,#2,#4,#5,我们得到12个上下文切换。我知道最初开始的问题是想要最小化上下文切换。然而,在这方面的最佳调度算法将仅通过在强制性上下文切换(在一天开始时发生)中隐藏真正的上下文切换来比EDF做得更好。如果可以满足最后期限,EDF的优势在于保证您始终满足最后期限。这是一个权衡,但我认为点头是EDF。

同时考虑rate monotonic scheduling(作为截止日期),这可能更适合静态确定的时间表,特别是如果分配的任务有任何规律性。

答案 1 :(得分:1)

听起来像Knapsack problem。维基为这个问题提供了一些解决方案,但大部分是通过动态编程解决的。