介绍
我想实现一个动态的多个时间轴队列。这里的环境一般是安排。
什么是时间轴队列?
这仍然是简单的:它是任务的时间线,每个事件的起始和结束时间。任务分组为作业。这组任务需要保持其顺序,但可以作为一个整体在时间上移动。例如,它可以表示为:
--t1-- ---t2.1-----------t2.2-------
' ' ' ' '
20 30 40 70 120
我将实施这个作为一个heap queue与一些额外的限制。 Python sched模块在这方面有一些基本的方法。
定义多个时间轴队列
一个队列代表一个资源,一个任务需要一个资源。图形示例:
R1 --t1.1----- --t2.2----- -----t1.3--
/ \ /
R2 --t2.1-- ------t1.2-----
解释“动态”
当任务可以使用多个资源之一时变得有趣。另外一个约束是可以在同一资源上运行的连续任务必须使用相同的资源。
示例:如果(从上),任务t1.3可以在R1或R2上运行,队列应如下所示:
R1 --t1.1----- --t2.2-----
/ \
R2 --t2.1-- ------t1.2----------t1.3--
功能(优先顺序)
> FirstFreeSlot(持续时间,开始):查找从开始的空闲时间开始的第一个空闲时间段(请参阅末尾的详细说明)。
通过关于约束(主要是:正确的任务顺序,相同资源上的连续任务)和使用FirstFreeSlot,尽可能早地在多个资源上排队工作。
>把工作放在特定的时间,向后移动尾巴
>删除作业
>重新计算:删除后,测试是否可以执行某些任务。
关键问题
要点是:如何表示这些信息以提供有效的功能?执行取决于我;-)
更新:另一点要考虑:典型的间隔结构将重点放在“什么是X点?但是在这种情况下,这个排队是因此问题“持续时间D的第一个空槽在哪里?更重要所以一个段/间隔树或这个方向上的其他东西可能不是正确的选择。
要进一步阐述自由插槽的一点:由于我们有多个资源和分组任务的约束,在某些资源上可以有空闲时间。简单的例子:t1.1在R1上运行40,然后在R2上运行t1.2。所以在R2上有一个空的间隔[0,40],可以由下一个工作填充。
更新2:有一个interesting proposal in another SO question.如果有人可以将其移植到我的问题,并表明它正在为这种情况(特别是详细阐述到多个资源),这可能是一个有效的答案。