如果我有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
最好的情况实际上是#3将#1推回一天,如下图所示:
答案 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。维基为这个问题提供了一些解决方案,但大部分是通过动态编程解决的。