序章
動的な複数のタイムライン キューを実装したいと思います。ここでのコンテキストは、一般的なスケジューリングです。
タイムライン キューとは何ですか?
これはまだ単純です。これはタスクのタイムラインであり、各イベントには開始時刻と終了時刻があります。タスクはジョブとしてグループ化されます。このグループのタスクは、その順序を維持する必要がありますが、全体として時間内に移動できます。たとえば、次のように表すことができます。
--t1-- ---t2.1-----------t2.2-------
' ' ' ' '
20 30 40 70 120
これをヒープ キューとして実装し、いくつかの制約を追加します。Pythonsched
モジュールには、この方向へのいくつかの基本的なアプローチがあります。
複数のタイムライン キューの定義
1 つのキューはリソースを表し、リソースはタスクに必要です。グラフィカルな例:
R1 --t1.1----- --t2.2----- -----t1.3--
/ \ /
R2 --t2.1-- ------t1.2-----
「ダイナミック」を解説
タスクが複数のリソースの 1 つを使用できる場合、興味深いものになります。追加の制約として、同じリソースで実行できる連続するタスクは同じリソースを使用する必要があります。
例: (上から) タスクがまたはで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 で実行します。[0, 40]
そのため、次のジョブで埋めることができる R2の空の間隔があります。
更新 2 :別の SO の質問に興味深い提案があります。誰かがそれを私の問題に移植し、このケースで機能していることを示すことができれば(特に複数のリソースに詳しく説明されている場合)、これはおそらく有効な答えになるでしょう。