【发布时间】:2012-06-24 14:58:55
【问题描述】:
简介
我想实现一个动态多时间线队列。这里的上下文一般是调度。
什么是时间线队列?
这仍然很简单:它是一个任务时间线,其中每个事件都有其开始和结束时间。任务被分组为作业。这组任务需要保持其顺序,但可以作为一个整体及时移动。例如它可以表示为:
--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(duration, start):找到从
start开始的第一个空闲时间段,duration有空闲时间(详见文末说明)。 -
通过考虑约束条件(主要是:任务的正确顺序、同一资源上的连续任务)并使用
FirstFreeSlot,尽可能早地将作业入队。 - 在特定时间放置工作并向后移动尾巴
- 删除工作
- 重新计算:删除后,测试一些任务是否可以提前执行。
关键问题
重点是:我如何表示这些信息以有效地提供功能?实施取决于我;-)
更新:需要考虑的另一点:典型的区间结构关注“X 点是什么?”但在这种情况下,enqueue 以及因此的问题“持续时间 D 的第一个空槽在哪里?”重要得多。所以这个方向的段/区间树或其他东西可能不是正确的选择。
进一步详细说明空闲时隙:由于我们有多个资源和分组任务的限制,某些资源上可以有空闲时隙。简单示例:t1.1 在 R1 上运行 40,然后t1.2 在 R2 上运行。所以R2上有一个空的区间[0, 40],可以被下一个job填满。
更新 2:有一个 interesting proposal in another SO question。如果有人可以将它移植到我的问题并表明它适用于这种情况(特别是针对多种资源进行详细阐述),那么这可能是一个有效的答案。
【问题讨论】:
-
您能举例说明其中一项任务可能是什么吗?
-
@327 No :) 我将分析/评估调度算法。因此,任务只是一个抽象对象,具有持续时间和一组可能运行的资源。
-
我还有一些疑问: 1.什么是工作:t1.1 和 t1.2 是工作? 2.为什么t1.3可以同时在R1和R2上运行?这是否意味着 t1.2 可以在 R1 和 R2 上运行?
-
@zinking 1.
t1.x是一组任务。 2. 这只是一个例子,这是动态的。 3. 不可以。如果t1.2可以在R1上运行,由于组限制,它将被安排在那里。 -
你无法在不知道如何使用数据结构的情况下单独评估它。这也使您对算法产生疑问。选择一个调度算法,并根据一个简单的数据结构评估它的时间复杂度。复杂度是由算法的逻辑还是数据结构决定的?只有数据结构限制了复杂性,才值得改进。
标签: python performance algorithm data-structures intervals