Einführung
Ich möchte eine dynamische Mehrfach-Timeline-Warteschlange implementieren. Der Kontext hier ist allgemeine Terminplanung.
Was ist eine Timeline-Warteschlange?
Das ist noch einfach: Es handelt sich um eine Zeitachse von Aufgaben, bei der jedes Ereignis seine Start- und Endzeit hat. Aufgaben sind als Jobs gruppiert. Diese Gruppe von Aufgaben muss ihre Reihenfolge bewahren, kann aber als Ganzes in der Zeit verschoben werden. Zum Beispiel könnte es so dargestellt werden:
--t1-- ---t2.1-----------t2.2-------
' ' ' ' '
20 30 40 70 120
Ich würde dies als eine Heap-Warteschlange mit einigen zusätzlichen Einschränkungen implementieren. Das Python sched
Modul hat einige grundlegende Ansätze in diese Richtung.
Definition mehrfache Timeline-Warteschlange
Ein Warteschlange steht für eine Ressource und eine Ressource wird von einer Aufgabe benötigt. Grafisches Beispiel:
R1 --t1.1----- --t2.2----- -----t1.3--
/ \ /
R2 --t2.1-- ------t1.2-----
Erklärung "dynamisch"
Es wird interessant, wenn eine Aufgabe eine der mehreren Ressourcen verwenden kann. Eine zusätzliche Einschränkung besteht darin, dass aufeinanderfolgende Aufgaben, die auf derselben Ressource ausgeführt werden können, dieselbe Ressource verwenden müssen.
Beispiel: Wenn (aus obigem Beispiel) die Aufgabe t1.3
auf R1
oder R2
ausgeführt werden kann, sollte die Warteschlange wie folgt aussehen:
R1 --t1.1----- --t2.2-----
/ \
R2 --t2.1-- ------t1.2----------t1.3--
Funktionalität (in Prioritätsreihenfolge)
- ErstesFreiesFeld(Dauer, Start): Finde den ersten freien Zeitschlitz ab
Start
, in dem es freie Zeit fürDauer
gibt (siehe detaillierte Erklärung am Ende). - WarteschlangeEinreihen eines Jobs so früh wie möglich auf den mehreren Ressourcen unter Berücksichtigung der Einschränkungen (hauptsächlich: richtige Reihenfolge der Aufgaben, aufeinanderfolgende Aufgaben auf derselben Ressource) und Verwendung von
ErstesFreiesFeld
. - Platzieren eines Jobs zu einer bestimmten Zeit und Verschieben des Endes nach hinten
- Löschen eines Jobs
- Neuberechnen: Nach dem Löschen überprüfen, ob einige Aufgaben früher ausgeführt werden können.
Schlüsselfrage
Der Punkt ist: Wie kann ich diese Informationen effizient darstellen, um die Funktionalität effizient bereitzustellen? Die Umsetzung liegt bei mir ;-)
Update: Ein weiterer zu berücksichtigender Punkt: Die typischen Intervallstrukturen konzentrieren sich auf "Was ist an Punkt X?" In diesem Fall ist jedoch das einfügen
und somit die Frage "Wo ist der erste leere Slot für Dauer D?" viel wichtiger. Ein Segment-/Intervallbaum oder etwas in dieser Richtung ist wahrscheinlich nicht die richtige Wahl.
Um den Punkt mit den freien Slots weiter zu erläutern: Aufgrund der Tatsache, dass wir mehrere Ressourcen und die Einschränkung gruppierte Aufgaben haben, können freie Zeitslots für einige Ressourcen vorhanden sein. Einfaches Beispiel: t1.1
läuft auf R1 für 40 und dann t1.2
läuft auf R2. Es gibt also ein leeres Intervall von [0, 40]
auf R2, das durch den nächsten Job gefüllt werden kann.
Update 2: Es gibt einen interessanten Vorschlag in einer anderen SO-Frage. Wenn jemand ihn auf mein Problem übertragen und zeigen kann, dass er für diesen Fall funktioniert (insbesondere unter Berücksichtigung mehrerer Ressourcen), wäre dies wahrscheinlich eine gültige Antwort.