Vorlesung 09: Netzplantechnik

Grundlagen Operations Research

Prof. Dr. Knut Haase

Netzplantechnik

Ein Projekt planen

Was ist ein Projekt?

Ein zeitlich, räumlich und sachlich begrenztes komplexes Arbeitsvorhaben mit einer bestimmten Zielsetzung.

Netzplantechnik

Zeitliche Planung der Vorgänge eines Projekts: Bestimmung der frühesten und spätesten Anfangs- und Endzeitpunkte.

Methoden im Überblick

  • CPM: Critical Path Method (USA, 1956), vorgangspfeilorientiert.
  • MPM: Metra Potential Method (Frankreich, 1957), vorgangsknotenorientiert.
  • PERT: stochastische Vorgangsdauern (Polaris-Rakete).
  • GERT / Simulation: stochastische Netzstrukturen (F&E-Projekte).

Wir betrachten den MPM-Netzplan: Vorgänge sind Knoten, Pfeile tragen Mindestabstände.

Vom Projekt zum Netzplan

Zwei Phasen der Netzplantechnik:

  • Strukturplanung: Vorgänge, Dauern und Anordnungsbeziehungen erheben; daraus entsteht der Netzplan.
  • Zeitplanung: früheste und späteste Zeitpunkte, Puffer und kritischen Weg berechnen.

Mit einem künstlichen Startvorgang i=0i = 0 und Endvorgang i=ni = n hat jedes Projekt eine eindeutige Quelle und Senke.

Beispiel: Bau einer Lagerhalle

ii Vorgang tit_i Vorgänger (dh,i)(d_{h,i})
1 Fundamente 3 –
2 Erdleitung 2 1 (−1)
3 Mauern 3 1 (1)
4 Dach 2 3 (0)
5 Boden 3 2 (0), 3 (1)
6 Tore einsetzen 1 4 (0)
7 Innen verputzen 2 5 (1), 6 (0)
8 Außen verputzen 2 6 (0)
9 Tor streichen 1 7 (0), 8 (0)

Der MPM-Netzplan

MPM-Netzplan der Lagerhalle: neun Vorgänge als Kästen, oben Nummer und Dauer, darunter noch leere Felder für FAZ und FEZ sowie SAZ und SEZ (Schema links unten), und elf Pfeile mit Mindestabständen: 1→2 −1, 1→3 1, 2→5 0, 3→4 0, 3→5 1, 4→6 0, 5→7 1, 6→7 0, 6→8 0, 7→9 0 und 8→9 0. Vorgang 1 ist die Quelle, Vorgang 9 die Senke.

Knoten = Vorgänge (oben ii und tit_i, die leeren Felder füllt gleich die Zeitplanung), Pfeile = Mindestabstände dh,id_{h,i}.

Mindest- und Maximalabstände

Zwischen zwei Vorgängen hh und ii sind verschiedene Abstände möglich:

  • Anfangsfolge dhiAd^A_{hi}: Anfang hh bis Anfang ii.
  • Normalfolge dhid_{hi}: Ende hh bis Anfang ii.
  • Endfolge dhiEd^E_{hi}: Ende hh bis Ende ii.
  • Sprungfolge dhiSd^S_{hi}: Anfang hh bis Ende ii.

Jeder Abstand existiert auch als Maximalabstand d‾hiA,d‾hi,d‾hiE,d‾hiS\bar d^{\,A}_{hi}, \bar d_{hi}, \bar d^{\,E}_{hi}, \bar d^{\,S}_{hi}: „höchstens so lange“.

Transformationsregeln

Alles wird in Normalfolgen umgerechnet; Maximalabstände werden zu negativen Mindestabständen in Gegenrichtung:

gegeben Umrechnung gegeben Umrechnung
dhiAd^A_{hi} dhi=dhiA−thd_{hi} = d^A_{hi} - t_h d‾hiA\bar d^{\,A}_{hi} dih=−d‾hiA−tid_{ih} = -\bar d^{\,A}_{hi} - t_i
dhid_{hi} dhid_{hi} d‾hi\bar d_{hi} dih=−d‾hi−th−tid_{ih} = -\bar d_{hi} - t_h - t_i
dhiEd^E_{hi} dhi=dhiE−tid_{hi} = d^E_{hi} - t_i d‾hiE\bar d^{\,E}_{hi} dih=−d‾hiE−thd_{ih} = -\bar d^{\,E}_{hi} - t_h
dhiSd^S_{hi} dhi=dhiS−th−tid_{hi} = d^S_{hi} - t_h - t_i d‾hiS\bar d^{\,S}_{hi} dih=−d‾hiSd_{ih} = -\bar d^{\,S}_{hi}

So entstehen Rückwärtspfeile und damit Zyklen im Netzplan.

Kurz geübt: Umrechnung

Zwischen hh (th=2t_h = 2) und ii (ti=3t_i = 3) gilt der maximale Normalabstand d‾hi=10\bar d_{hi} = 10.

Frage: Welcher Pfeil entsteht daraus im Netzplan?

dih=−d‾hi−th−ti=−10−2−3=−15 d_{ih} = -\bar d_{hi} - t_h - t_i = -10 - 2 - 3 = -15

Ein Rückwärtspfeil von ii nach hh mit Bewertung −15-15.

Gleich ausprobieren

Zurück zur Lagerhalle. Auf der nächsten Folie gehen Sie selbst Wege durch ihren Netzplan. Welcher Weg dauert am längsten?

Sie sind dran

Zeitplanung

Vorwärtsrechnung

Im Spiel haben Sie Wege einzeln durchgerechnet. Die Vorwärtsrechnung findet für jeden Vorgang den längsten Weg auf einmal, topologisch von i=0i = 0 bis nn:

FAZ0:=0FAZi:=maxh∈𝒱(i){FEZh+dhi}FEZi:=FAZi+ti \begin{aligned} \text{FAZ}_0 &:= 0 \\ \text{FAZ}_i &:= \max_{h \in \mathcal{V}(i)}\{\text{FEZ}_h + d_{hi}\} \\ \text{FEZ}_i &:= \text{FAZ}_i + t_i \end{aligned}

FAZi\text{FAZ}_i / FEZi\text{FEZ}_i: frühester Anfangs- / Endzeitpunkt von Vorgang ii.

Kurz geübt: Vorwärts

Vorgang ii hat drei Vorgänger:

Vorgänger hh FEZh\text{FEZ}_h dhid_{hi}
aa 6 3
bb 5 6
cc 12 −4

Frage: Wie groß ist FAZi\text{FAZ}_i?

FAZi=max⁡{6+3,5+6,12−4}=𝟏𝟏 \text{FAZ}_i = \max\{6+3,\; 5+6,\; 12-4\} = \mathbf{11}

Vorwärts im Netzplan

Der Netzplan der Lagerhalle, vorwärts gerechnet bis Vorgang 1: Vorgang 1 FAZ 0 und FEZ 3.

FAZ1=0\text{FAZ}_1 = 0 (Projektstart), FEZ1=0+3=3\text{FEZ}_1 = 0 + 3 = 3.

Der Netzplan der Lagerhalle, vorwärts gerechnet bis Vorgang 2: Vorgang 1 FAZ 0 und FEZ 3, Vorgang 2 FAZ 2 und FEZ 4.

FAZ2=FEZ1+d1,2=3−1=2\text{FAZ}_2 = \text{FEZ}_1 + d_{1,2} = 3 - 1 = 2, FEZ2=2+2=4\text{FEZ}_2 = 2 + 2 = 4.

Der Netzplan der Lagerhalle, vorwärts gerechnet bis Vorgang 3: Vorgang 1 FAZ 0 und FEZ 3, Vorgang 2 FAZ 2 und FEZ 4, Vorgang 3 FAZ 4 und FEZ 7.

FAZ3=FEZ1+d1,3=3+1=4\text{FAZ}_3 = \text{FEZ}_1 + d_{1,3} = 3 + 1 = 4, FEZ3=4+3=7\text{FEZ}_3 = 4 + 3 = 7.

Der Netzplan der Lagerhalle, vorwärts gerechnet bis Vorgang 4: Vorgang 1 FAZ 0 und FEZ 3, Vorgang 2 FAZ 2 und FEZ 4, Vorgang 3 FAZ 4 und FEZ 7, Vorgang 4 FAZ 7 und FEZ 9.

FAZ4=FEZ3+d3,4=7+0=7\text{FAZ}_4 = \text{FEZ}_3 + d_{3,4} = 7 + 0 = 7, FEZ4=7+2=9\text{FEZ}_4 = 7 + 2 = 9.

Der Netzplan der Lagerhalle, vorwärts gerechnet bis Vorgang 5: Vorgang 1 FAZ 0 und FEZ 3, Vorgang 2 FAZ 2 und FEZ 4, Vorgang 3 FAZ 4 und FEZ 7, Vorgang 4 FAZ 7 und FEZ 9, Vorgang 5 FAZ 8 und FEZ 11.

FAZ5=max⁡{FEZ2+d2,5,FEZ3+d3,5}=max⁡{4+0,7+1}=8\text{FAZ}_5 = \max\{\text{FEZ}_2 + d_{2,5},\; \text{FEZ}_3 + d_{3,5}\} = \max\{4 + 0,\; 7 + 1\} = 8, FEZ5=8+3=11\text{FEZ}_5 = 8 + 3 = 11.

Der Netzplan der Lagerhalle, vorwärts gerechnet bis Vorgang 6: Vorgang 1 FAZ 0 und FEZ 3, Vorgang 2 FAZ 2 und FEZ 4, Vorgang 3 FAZ 4 und FEZ 7, Vorgang 4 FAZ 7 und FEZ 9, Vorgang 5 FAZ 8 und FEZ 11, Vorgang 6 FAZ 9 und FEZ 10.

FAZ6=FEZ4+d4,6=9+0=9\text{FAZ}_6 = \text{FEZ}_4 + d_{4,6} = 9 + 0 = 9, FEZ6=9+1=10\text{FEZ}_6 = 9 + 1 = 10.

Der Netzplan der Lagerhalle, vorwärts gerechnet bis Vorgang 7: Vorgang 1 FAZ 0 und FEZ 3, Vorgang 2 FAZ 2 und FEZ 4, Vorgang 3 FAZ 4 und FEZ 7, Vorgang 4 FAZ 7 und FEZ 9, Vorgang 5 FAZ 8 und FEZ 11, Vorgang 6 FAZ 9 und FEZ 10, Vorgang 7 FAZ 12 und FEZ 14.

FAZ7=max⁡{FEZ5+d5,7,FEZ6+d6,7}=max⁡{11+1,10+0}=12\text{FAZ}_7 = \max\{\text{FEZ}_5 + d_{5,7},\; \text{FEZ}_6 + d_{6,7}\} = \max\{11 + 1,\; 10 + 0\} = 12, FEZ7=12+2=14\text{FEZ}_7 = 12 + 2 = 14.

Der Netzplan der Lagerhalle, vorwärts gerechnet bis Vorgang 8: Vorgang 1 FAZ 0 und FEZ 3, Vorgang 2 FAZ 2 und FEZ 4, Vorgang 3 FAZ 4 und FEZ 7, Vorgang 4 FAZ 7 und FEZ 9, Vorgang 5 FAZ 8 und FEZ 11, Vorgang 6 FAZ 9 und FEZ 10, Vorgang 7 FAZ 12 und FEZ 14, Vorgang 8 FAZ 10 und FEZ 12.

FAZ8=FEZ6+d6,8=10+0=10\text{FAZ}_8 = \text{FEZ}_6 + d_{6,8} = 10 + 0 = 10, FEZ8=10+2=12\text{FEZ}_8 = 10 + 2 = 12.

Der Netzplan der Lagerhalle, vorwärts gerechnet bis Vorgang 9: Vorgang 1 FAZ 0 und FEZ 3, Vorgang 2 FAZ 2 und FEZ 4, Vorgang 3 FAZ 4 und FEZ 7, Vorgang 4 FAZ 7 und FEZ 9, Vorgang 5 FAZ 8 und FEZ 11, Vorgang 6 FAZ 9 und FEZ 10, Vorgang 7 FAZ 12 und FEZ 14, Vorgang 8 FAZ 10 und FEZ 12, Vorgang 9 FAZ 14 und FEZ 15.

FAZ9=max⁡{FEZ7+d7,9,FEZ8+d8,9}=max⁡{14+0,12+0}=14\text{FAZ}_9 = \max\{\text{FEZ}_7 + d_{7,9},\; \text{FEZ}_8 + d_{8,9}\} = \max\{14 + 0,\; 12 + 0\} = 14, FEZ9=14+1=15\text{FEZ}_9 = 14 + 1 = 15: Projektdauer 15.

Rückwärtsrechnung

Späteste Zeitpunkte, von i=ni = n zurück bis 00:

SEZn:=FEZnSEZi:=minj∈𝒩(i){SAZj−dij}SAZi:=SEZi−ti \begin{aligned} \text{SEZ}_n &:= \text{FEZ}_n \\ \text{SEZ}_i &:= \min_{j \in \mathcal{N}(i)}\{\text{SAZ}_j - d_{ij}\} \\ \text{SAZ}_i &:= \text{SEZ}_i - t_i \end{aligned}

SAZi\text{SAZ}_i / SEZi\text{SEZ}_i: spätester Anfangs- / Endzeitpunkt von Vorgang ii.

Kurz geübt: Rückwärts

Vorgang ii hat zwei Nachfolger:

Nachfolger jj SAZj\text{SAZ}_j dijd_{ij}
aa 14 2
bb 12 −2

Frage: Wie groß ist SEZi\text{SEZ}_i?

SEZi=min⁡{14−2,12−(−2)}=𝟏𝟐 \text{SEZ}_i = \min\{14-2,\; 12-(-2)\} = \mathbf{12}

Rückwärts im Netzplan

Der vorwärts gerechnete Netzplan, rückwärts bis Vorgang 9: Vorgang 9 SAZ 14 und SEZ 15.

SEZ9=FEZ9=15\text{SEZ}_9 = \text{FEZ}_9 = 15 (Projektende), SAZ9=15−1=14\text{SAZ}_9 = 15 - 1 = 14.

Der vorwärts gerechnete Netzplan, rückwärts bis Vorgang 8: Vorgang 9 SAZ 14 und SEZ 15, Vorgang 8 SAZ 12 und SEZ 14.

SEZ8=SAZ9−d8,9=14−0=14\text{SEZ}_8 = \text{SAZ}_9 - d_{8,9} = 14 - 0 = 14, SAZ8=14−2=12\text{SAZ}_8 = 14 - 2 = 12.

Der vorwärts gerechnete Netzplan, rückwärts bis Vorgang 7: Vorgang 9 SAZ 14 und SEZ 15, Vorgang 8 SAZ 12 und SEZ 14, Vorgang 7 SAZ 12 und SEZ 14.

SEZ7=SAZ9−d7,9=14−0=14\text{SEZ}_7 = \text{SAZ}_9 - d_{7,9} = 14 - 0 = 14, SAZ7=14−2=12\text{SAZ}_7 = 14 - 2 = 12.

Der vorwärts gerechnete Netzplan, rückwärts bis Vorgang 6: Vorgang 9 SAZ 14 und SEZ 15, Vorgang 8 SAZ 12 und SEZ 14, Vorgang 7 SAZ 12 und SEZ 14, Vorgang 6 SAZ 11 und SEZ 12.

SEZ6=min⁡{SAZ7−d6,7,SAZ8−d6,8}=min⁡{12−0,12−0}=12\text{SEZ}_6 = \min\{\text{SAZ}_7 - d_{6,7},\; \text{SAZ}_8 - d_{6,8}\} = \min\{12 - 0,\; 12 - 0\} = 12, SAZ6=12−1=11\text{SAZ}_6 = 12 - 1 = 11.

Der vorwärts gerechnete Netzplan, rückwärts bis Vorgang 5: Vorgang 9 SAZ 14 und SEZ 15, Vorgang 8 SAZ 12 und SEZ 14, Vorgang 7 SAZ 12 und SEZ 14, Vorgang 6 SAZ 11 und SEZ 12, Vorgang 5 SAZ 8 und SEZ 11.

SEZ5=SAZ7−d5,7=12−1=11\text{SEZ}_5 = \text{SAZ}_7 - d_{5,7} = 12 - 1 = 11, SAZ5=11−3=8\text{SAZ}_5 = 11 - 3 = 8.

Der vorwärts gerechnete Netzplan, rückwärts bis Vorgang 4: Vorgang 9 SAZ 14 und SEZ 15, Vorgang 8 SAZ 12 und SEZ 14, Vorgang 7 SAZ 12 und SEZ 14, Vorgang 6 SAZ 11 und SEZ 12, Vorgang 5 SAZ 8 und SEZ 11, Vorgang 4 SAZ 9 und SEZ 11.

SEZ4=SAZ6−d4,6=11−0=11\text{SEZ}_4 = \text{SAZ}_6 - d_{4,6} = 11 - 0 = 11, SAZ4=11−2=9\text{SAZ}_4 = 11 - 2 = 9.

Der vorwärts gerechnete Netzplan, rückwärts bis Vorgang 3: Vorgang 9 SAZ 14 und SEZ 15, Vorgang 8 SAZ 12 und SEZ 14, Vorgang 7 SAZ 12 und SEZ 14, Vorgang 6 SAZ 11 und SEZ 12, Vorgang 5 SAZ 8 und SEZ 11, Vorgang 4 SAZ 9 und SEZ 11, Vorgang 3 SAZ 4 und SEZ 7.

SEZ3=min⁡{SAZ4−d3,4,SAZ5−d3,5}=min⁡{9−0,8−1}=7\text{SEZ}_3 = \min\{\text{SAZ}_4 - d_{3,4},\; \text{SAZ}_5 - d_{3,5}\} = \min\{9 - 0,\; 8 - 1\} = 7, SAZ3=7−3=4\text{SAZ}_3 = 7 - 3 = 4.

Der vorwärts gerechnete Netzplan, rückwärts bis Vorgang 2: Vorgang 9 SAZ 14 und SEZ 15, Vorgang 8 SAZ 12 und SEZ 14, Vorgang 7 SAZ 12 und SEZ 14, Vorgang 6 SAZ 11 und SEZ 12, Vorgang 5 SAZ 8 und SEZ 11, Vorgang 4 SAZ 9 und SEZ 11, Vorgang 3 SAZ 4 und SEZ 7, Vorgang 2 SAZ 6 und SEZ 8.

SEZ2=SAZ5−d2,5=8−0=8\text{SEZ}_2 = \text{SAZ}_5 - d_{2,5} = 8 - 0 = 8, SAZ2=8−2=6\text{SAZ}_2 = 8 - 2 = 6.

Der vorwärts gerechnete Netzplan, rückwärts bis Vorgang 1: Vorgang 9 SAZ 14 und SEZ 15, Vorgang 8 SAZ 12 und SEZ 14, Vorgang 7 SAZ 12 und SEZ 14, Vorgang 6 SAZ 11 und SEZ 12, Vorgang 5 SAZ 8 und SEZ 11, Vorgang 4 SAZ 9 und SEZ 11, Vorgang 3 SAZ 4 und SEZ 7, Vorgang 2 SAZ 6 und SEZ 8, Vorgang 1 SAZ 0 und SEZ 3.

SEZ1=min⁡{SAZ2−d1,2,SAZ3−d1,3}=min⁡{6−(−1),4−1}=3\text{SEZ}_1 = \min\{\text{SAZ}_2 - d_{1,2},\; \text{SAZ}_3 - d_{1,3}\} = \min\{6 - (-1),\; 4 - 1\} = 3, SAZ1=3−3=0\text{SAZ}_1 = 3 - 3 = 0.

Der Terminplan

Alle Werte als Tabelle:

ii 1 2 3 4 5 6 7 8 9
FAZi\text{FAZ}_i 0 2 4 7 8 9 12 10 14
FEZi\text{FEZ}_i 3 4 7 9 11 10 14 12 15
SAZi\text{SAZ}_i 0 6 4 9 8 11 12 12 14
SEZi\text{SEZ}_i 3 8 7 11 11 12 14 14 15

Projektdauer FEZ9=15\text{FEZ}_9 = 15; bei 1,3,5,7,91, 3, 5, 7, 9 gilt FAZi=SAZi\text{FAZ}_i = \text{SAZ}_i, dazu gleich mehr.

Gleich ausprobieren

Auf der nächsten Folie rechnen Sie selbst, Vorgang für Vorgang, erst vorwärts, dann rückwärts. Unter „Neu“ kommen weitere Netzpläne: Welche Vorgänge sind dort kritisch?

Sie sind dran

Kritischer Weg

Der kritische Weg

Kritischer Weg

Der längste Weg im Netzplan. Für jeden kritischen Vorgang gilt FAZi=SAZi\text{FAZ}_i = \text{SAZ}_i (kein Spielraum).

Derselbe Netzplan mit allen Terminen; hervorgehoben ist der kritische Weg 1→3→5→7→9 mit seinen vier Pfeilen und fünf Vorgängen, bei denen FAZ und SAZ übereinstimmen. Die Vorgänge 2, 4, 6 und 8 liegen nicht auf diesem Weg.

Kritische Vorgänge

Der kritische Weg ist 1→3→5→7→91 \to 3 \to 5 \to 7 \to 9.

Konsequenz

Verzögert sich ein kritischer Vorgang, verzögert sich das gesamte Projekt.

Pufferzeiten

Zeitspannen, um die ein Vorgang verschoben werden kann, ohne die Projektdauer zu erhöhen:

  • Gesamte Pufferzeit: GPi=SAZi−FAZi\text{GP}_i = \text{SAZ}_i - \text{FAZ}_i.
  • Freie Pufferzeit: FPi=min⁡j∈𝒩(i){FAZj−dij}−FEZi\text{FP}_i = \min_{j \in \mathcal{N}(i)}\{\text{FAZ}_j - d_{ij}\} - \text{FEZ}_i: Spielraum, wenn alle Nachfolger frühestmöglich beginnen.

Weitere Pufferzeiten

  • Freie Rückwärtspufferzeit: FRPi=SAZi−max⁡h∈𝒱(i){SEZh+dhi}\text{FRP}_i = \text{SAZ}_i - \max_{h \in \mathcal{V}(i)}\{\text{SEZ}_h + d_{hi}\}: Spielraum, wenn alle Vorgänger spätestmöglich enden.
  • Unabhängige Pufferzeit: UPi=max⁡{0,FPi+FRPi−GPi}\text{UP}_i = \max\{0,\; \text{FP}_i + \text{FRP}_i - \text{GP}_i\}: Spielraum unabhängig von allen anderen Vorgängen.

Es gilt stets UPi≤FPi,FRPi≤GPi\text{UP}_i \le \text{FP}_i, \text{FRP}_i \le \text{GP}_i.

Puffer im Beispiel

ii 1 2 3 4 5 6 7 8 9
GPi\text{GP}_i 0 4 0 2 0 2 0 2 0
FPi\text{FP}_i 0 4 0 0 0 0 0 2 0
FRPi\text{FRP}_i 0 4 0 2 0 0 0 0 0
UPi\text{UP}_i 0 4 0 0 0 0 0 0 0

Genau die Vorgänge mit GPi=0\text{GP}_i = 0 sind kritisch: 1,3,5,7,91, 3, 5, 7, 9.

Nur Vorgang 2 (Erdleitung) ist völlig frei verschiebbar (UP2=4\text{UP}_2 = 4).

Zyklen

Wenn Maximalabstände gelten

Enthält der Netzplan Zyklen (z. B. durch Maximalabstände), versagt die topologische Reihenfolge. Dann rechnet ein FIFO-Verfahren wie bei den kürzesten Wegen (Vorlesung 6):

  • erst vorwärts, dann rückwärts;
  • vorwärts wird geprüft, ob Zeitpunkte zu klein sind, rückwärts, ob sie zu groß sind;
  • wer aktualisiert wird, kommt hinten in die Liste, sofern er nicht schon darin steht.

Voraussetzung: alle Zyklen haben nichtpositive Länge. Ein Zyklus positiver Länge macht den Plan unzulässig.

Beispiel: Maximalabstand

Neue Vorgabe für die Lagerhalle: Vom Ende des Mauerns (3) bis zur Fertigstellung des Außenputzes (8) dürfen höchstens 6 ZE vergehen: d‾3,8E=6\bar d^{\,E}_{3,8} = 6.

Frage: Welcher Pfeil entsteht daraus?

Transformationsregel dih=−d‾hiE−thd_{ih} = -\bar d^{\,E}_{hi} - t_h:

d8,3=−6−t3=−6−3=−9 d_{8,3} = -6 - t_3 = -6 - 3 = -9

Der erweiterte Netzplan

Der Netzplan mit einem zusätzlichen Rückwärtspfeil von Vorgang 8 zu Vorgang 3 mit der Bewertung −9, unten um den Plan herumgeführt. Er schließt den Zyklus 3→4→6→8→3.

Der Zyklus 3→4→6→8→33 \to 4 \to 6 \to 8 \to 3 hat die Länge 3+0+2+0+1+0+2−9=−1≤03 + 0 + 2 + 0 + 1 + 0 + 2 - 9 = -1 \le 0: der Plan bleibt zulässig.

FIFO vorwärts

Liste mit Kopf HH und Ende TT. Start: FAZ1:=0\text{FAZ}_1 := 0, FEZ1:=t1\text{FEZ}_1 := t_1, alle anderen FAZj:=−∞\text{FAZ}_j := -\infty; H=T=1H = T = 1.

  • Für jeden Nachfolger j∈𝒩(H)j \in \mathcal{N}(H): ist FAZj<FEZH+dHj\text{FAZ}_j < \text{FEZ}_H + d_{Hj}?
  • Falls ja: FAZj:=FEZH+dHj\text{FAZ}_j := \text{FEZ}_H + d_{Hj}, jj hinten einreihen (falls nicht bereits enthalten).
  • Ist H=TH = T: Liste leer ⇒\Rightarrow Abbruch.
  • Sonst HH := nächster Knoten der Liste, FEZH:=FAZH+tH\text{FEZ}_H := \text{FAZ}_H + t_H.

Vorwärts mit der FIFO-Liste

jj 1 2 3 4 5 6 7 8 9
FAZj\text{FAZ}_j 0 −∞ −∞ −∞ −∞ −∞ −∞ −∞ −∞
FEZj\text{FEZ}_j 3 – – – – – – – –

L = (1)

Start: FAZ1=0\text{FAZ}_1 = 0, FEZ1=3\text{FEZ}_1 = 3, alle anderen FAZj=−∞\text{FAZ}_j = -\infty; H=T=1H = T = 1.

jj 1 2 3 4 5 6 7 8 9
FAZj\text{FAZ}_j 0 2 4 −∞ −∞ −∞ −∞ −∞ −∞
FEZj\text{FEZ}_j 3 – – – – – – – –

L = (1, 2, 3)

H=1H = 1: FAZ2=3−1=2\text{FAZ}_2 = 3 - 1 = 2, 2 stellt sich an; FAZ3=3+1=4\text{FAZ}_3 = 3 + 1 = 4, 3 stellt sich an.

jj 1 2 3 4 5 6 7 8 9
FAZj\text{FAZ}_j 0 2 4 −∞ 4 −∞ −∞ −∞ −∞
FEZj\text{FEZ}_j 3 4 – – – – – – –

L = (1, 2, 3, 5)

H=2H = 2: FEZ2=2+2=4\text{FEZ}_2 = 2 + 2 = 4; FAZ5=4+0=4\text{FAZ}_5 = 4 + 0 = 4, 5 stellt sich an.

jj 1 2 3 4 5 6 7 8 9
FAZj\text{FAZ}_j 0 2 4 7 8 −∞ −∞ −∞ −∞
FEZj\text{FEZ}_j 3 4 7 – – – – – –

L = (1, 2, 3, 5, 4)

H=3H = 3: FEZ3=4+3=7\text{FEZ}_3 = 4 + 3 = 7; FAZ4=7+0=7\text{FAZ}_4 = 7 + 0 = 7, 4 stellt sich an; FAZ5=7+1=8\text{FAZ}_5 = 7 + 1 = 8 statt 4: korrigiert, 5 wartet schon.

jj 1 2 3 4 5 6 7 8 9
FAZj\text{FAZ}_j 0 2 4 7 8 −∞ 12 −∞ −∞
FEZj\text{FEZ}_j 3 4 7 – 11 – – – –

L = (1, 2, 3, 5, 4, 7)

H=5H = 5: FEZ5=8+3=11\text{FEZ}_5 = 8 + 3 = 11; FAZ7=11+1=12\text{FAZ}_7 = 11 + 1 = 12, 7 stellt sich an.

jj 1 2 3 4 5 6 7 8 9
FAZj\text{FAZ}_j 0 2 4 7 8 9 12 −∞ −∞
FEZj\text{FEZ}_j 3 4 7 9 11 – – – –

L = (1, 2, 3, 5, 4, 7, 6)

H=4H = 4: FEZ4=7+2=9\text{FEZ}_4 = 7 + 2 = 9; FAZ6=9+0=9\text{FAZ}_6 = 9 + 0 = 9, 6 stellt sich an.

jj 1 2 3 4 5 6 7 8 9
FAZj\text{FAZ}_j 0 2 4 7 8 9 12 −∞ 14
FEZj\text{FEZ}_j 3 4 7 9 11 – 14 – –

L = (1, 2, 3, 5, 4, 7, 6, 9)

H=7H = 7: FEZ7=12+2=14\text{FEZ}_7 = 12 + 2 = 14; FAZ9=14+0=14\text{FAZ}_9 = 14 + 0 = 14, 9 stellt sich an.

jj 1 2 3 4 5 6 7 8 9
FAZj\text{FAZ}_j 0 2 4 7 8 9 12 10 14
FEZj\text{FEZ}_j 3 4 7 9 11 10 14 – –

L = (1, 2, 3, 5, 4, 7, 6, 9, 8)

H=6H = 6: FEZ6=9+1=10\text{FEZ}_6 = 9 + 1 = 10; für 7: 10+0=10≤FAZ7=1210 + 0 = 10 \le \text{FAZ}_7 = 12, keine Änderung; FAZ8=10+0=10\text{FAZ}_8 = 10 + 0 = 10, 8 stellt sich an.

jj 1 2 3 4 5 6 7 8 9
FAZj\text{FAZ}_j 0 2 4 7 8 9 12 10 14
FEZj\text{FEZ}_j 3 4 7 9 11 10 14 – 15

L = (1, 2, 3, 5, 4, 7, 6, 9, 8)

H=9H = 9: FEZ9=14+1=15\text{FEZ}_9 = 14 + 1 = 15; 9 hat keine Nachfolger.

jj 1 2 3 4 5 6 7 8 9
FAZj\text{FAZ}_j 0 2 4 7 8 9 12 10 14
FEZj\text{FEZ}_j 3 4 7 9 11 10 14 12 15

L = (1, 2, 3, 5, 4, 7, 6, 9, 8)

H=8H = 8: FEZ8=10+2=12\text{FEZ}_8 = 10 + 2 = 12; für 9: 12+0=12≤FAZ9=1412 + 0 = 12 \le \text{FAZ}_9 = 14, keine Änderung; für 3: 12−9=3≤FAZ3=412 - 9 = 3 \le \text{FAZ}_3 = 4, keine Änderung. Liste leer: Abbruch.

Ergebnis vorwärts

Der Netzplan mit dem Rückwärtspfeil 8→3 und den frühesten Zeitpunkten aus der FIFO-Vorwärtsrechnung, dieselben wie ohne den Pfeil: FAZ und FEZ 0 und 3, 2 und 4, 4 und 7, 7 und 9, 8 und 11, 9 und 10, 12 und 14, 10 und 12, 14 und 15 für die Vorgänge 1 bis 9.

Der Rückwärtspfeil hat vorwärts nichts geändert (12−9=3≤412 - 9 = 3 \le 4): Die frühesten Zeitpunkte sind dieselben wie ohne Zyklus.

FIFO rückwärts

Start: SEZn:=FEZn\text{SEZ}_n := \text{FEZ}_n, SAZn:=SEZn−tn\text{SAZ}_n := \text{SEZ}_n - t_n, alle anderen SEZj:=∞\text{SEZ}_j := \infty; H=T=nH = T = n.

  • Für jeden Vorgänger j∈𝒱(H)j \in \mathcal{V}(H): ist SEZj>SAZH−djH\text{SEZ}_j > \text{SAZ}_H - d_{jH}?
  • Falls ja: SEZj:=SAZH−djH\text{SEZ}_j := \text{SAZ}_H - d_{jH}, jj hinten einreihen (falls nicht bereits enthalten).
  • Ist H=TH = T: Liste leer ⇒\Rightarrow Abbruch.
  • Sonst HH := nächster Knoten der Liste, SAZH:=SEZH−tH\text{SAZ}_H := \text{SEZ}_H - t_H.

Rückwärts mit der FIFO-Liste

Jetzt greift der Zyklus: Zu den Vorgängern von 3 gehört auch 8.

jj 1 2 3 4 5 6 7 8 9
SEZj\text{SEZ}_j ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ 15
SAZj\text{SAZ}_j – – – – – – – – 14

L = (9)

Start: SEZ9=FEZ9=15\text{SEZ}_9 = \text{FEZ}_9 = 15, SAZ9=15−1=14\text{SAZ}_9 = 15 - 1 = 14, alle anderen SEZj=∞\text{SEZ}_j = \infty; H=T=9H = T = 9.

jj 1 2 3 4 5 6 7 8 9
SEZj\text{SEZ}_j ∞ ∞ ∞ ∞ ∞ ∞ 14 14 15
SAZj\text{SAZ}_j – – – – – – – – 14

L = (9, 7, 8)

H=9H = 9: SEZ7=14−0=14\text{SEZ}_7 = 14 - 0 = 14, 7 stellt sich an; SEZ8=14−0=14\text{SEZ}_8 = 14 - 0 = 14, 8 stellt sich an.

jj 1 2 3 4 5 6 7 8 9
SEZj\text{SEZ}_j ∞ ∞ ∞ ∞ 11 12 14 14 15
SAZj\text{SAZ}_j – – – – – – 12 – 14

L = (9, 7, 8, 5, 6)

H=7H = 7: SAZ7=14−2=12\text{SAZ}_7 = 14 - 2 = 12; SEZ5=12−1=11\text{SEZ}_5 = 12 - 1 = 11, 5 stellt sich an; SEZ6=12−0=12\text{SEZ}_6 = 12 - 0 = 12, 6 stellt sich an.

jj 1 2 3 4 5 6 7 8 9
SEZj\text{SEZ}_j ∞ ∞ ∞ ∞ 11 12 14 14 15
SAZj\text{SAZ}_j – – – – – – 12 12 14

L = (9, 7, 8, 5, 6)

H=8H = 8: SAZ8=14−2=12\text{SAZ}_8 = 14 - 2 = 12; für 6: 12−0=12≥SEZ6=1212 - 0 = 12 \ge \text{SEZ}_6 = 12, keine Änderung.

jj 1 2 3 4 5 6 7 8 9
SEZj\text{SEZ}_j ∞ 8 7 ∞ 11 12 14 14 15
SAZj\text{SAZ}_j – – – – 8 – 12 12 14

L = (9, 7, 8, 5, 6, 2, 3)

H=5H = 5: SAZ5=11−3=8\text{SAZ}_5 = 11 - 3 = 8; SEZ2=8−0=8\text{SEZ}_2 = 8 - 0 = 8, 2 stellt sich an; SEZ3=8−1=7\text{SEZ}_3 = 8 - 1 = 7, 3 stellt sich an.

jj 1 2 3 4 5 6 7 8 9
SEZj\text{SEZ}_j ∞ 8 7 11 11 12 14 14 15
SAZj\text{SAZ}_j – – – – 8 11 12 12 14

L = (9, 7, 8, 5, 6, 2, 3, 4)

H=6H = 6: SAZ6=12−1=11\text{SAZ}_6 = 12 - 1 = 11; SEZ4=11−0=11\text{SEZ}_4 = 11 - 0 = 11, 4 stellt sich an.

jj 1 2 3 4 5 6 7 8 9
SEZj\text{SEZ}_j 7 8 7 11 11 12 14 14 15
SAZj\text{SAZ}_j – 6 – – 8 11 12 12 14

L = (9, 7, 8, 5, 6, 2, 3, 4, 1)

H=2H = 2: SAZ2=8−2=6\text{SAZ}_2 = 8 - 2 = 6; SEZ1=6−(−1)=7\text{SEZ}_1 = 6 - (-1) = 7, 1 stellt sich an.

jj 1 2 3 4 5 6 7 8 9
SEZj\text{SEZ}_j 3 8 7 11 11 12 14 13 15
SAZj\text{SAZ}_j – 6 4 – 8 11 12 12 14

L = (9, 7, 8, 5, 6, 2, 3, 4, 1, 8)

H=3H = 3: SAZ3=7−3=4\text{SAZ}_3 = 7 - 3 = 4; SEZ1=4−1=3\text{SEZ}_1 = 4 - 1 = 3 statt 7: korrigiert, 1 wartet schon; SEZ8=4−(−9)=13\text{SEZ}_8 = 4 - (-9) = 13 statt 14, 8 stellt sich erneut an.

jj 1 2 3 4 5 6 7 8 9
SEZj\text{SEZ}_j 3 8 7 11 11 12 14 13 15
SAZj\text{SAZ}_j – 6 4 9 8 11 12 12 14

L = (9, 7, 8, 5, 6, 2, 3, 4, 1, 8)

H=4H = 4: SAZ4=11−2=9\text{SAZ}_4 = 11 - 2 = 9; für 3: 9−0=9≥SEZ3=79 - 0 = 9 \ge \text{SEZ}_3 = 7, keine Änderung.

jj 1 2 3 4 5 6 7 8 9
SEZj\text{SEZ}_j 3 8 7 11 11 12 14 13 15
SAZj\text{SAZ}_j 0 6 4 9 8 11 12 12 14

L = (9, 7, 8, 5, 6, 2, 3, 4, 1, 8)

H=1H = 1: SAZ1=3−3=0\text{SAZ}_1 = 3 - 3 = 0; 1 hat keine Vorgänger.

jj 1 2 3 4 5 6 7 8 9
SEZj\text{SEZ}_j 3 8 7 11 11 11 14 13 15
SAZj\text{SAZ}_j 0 6 4 9 8 11 12 11 14

L = (9, 7, 8, 5, 6, 2, 3, 4, 1, 8, 6)

H=8H = 8: SAZ8=13−2=11\text{SAZ}_8 = 13 - 2 = 11; SEZ6=11−0=11\text{SEZ}_6 = 11 - 0 = 11 statt 12, 6 stellt sich erneut an.

jj 1 2 3 4 5 6 7 8 9
SEZj\text{SEZ}_j 3 8 7 10 11 11 14 13 15
SAZj\text{SAZ}_j 0 6 4 9 8 10 12 11 14

L = (9, 7, 8, 5, 6, 2, 3, 4, 1, 8, 6, 4)

H=6H = 6: SAZ6=11−1=10\text{SAZ}_6 = 11 - 1 = 10; SEZ4=10−0=10\text{SEZ}_4 = 10 - 0 = 10 statt 11, 4 stellt sich erneut an.

jj 1 2 3 4 5 6 7 8 9
SEZj\text{SEZ}_j 3 8 7 10 11 11 14 13 15
SAZj\text{SAZ}_j 0 6 4 8 8 10 12 11 14

L = (9, 7, 8, 5, 6, 2, 3, 4, 1, 8, 6, 4)

H=4H = 4: SAZ4=10−2=8\text{SAZ}_4 = 10 - 2 = 8; für 3: 8−0=8≥SEZ3=78 - 0 = 8 \ge \text{SEZ}_3 = 7, keine Änderung. Liste leer: Abbruch.

Neue späteste Zeitpunkte

Die Vorwärtsrechnung ändert sich nicht (FEZ8−9=3<4\text{FEZ}_8 - 9 = 3 < 4), aber rückwärts zieht der Pfeil die späten Zeitpunkte zusammen:

ii 1 2 3 4 5 6 7 8 9
SAZi\text{SAZ}_i (ohne) 0 6 4 9 8 11 12 12 14
SAZi\text{SAZ}_i (mit Zyklus) 0 6 4 8 8 10 12 11 14

SEZ8=min⁡{SAZ9−0,SAZ3−(−9)}=min⁡{14,13}=13\text{SEZ}_8 = \min\{\text{SAZ}_9 - 0,\; \text{SAZ}_3 - (-9)\} = \min\{14, 13\} = 13: die Puffer von 4,6,84, 6, 8 schrumpfen auf 11.

Kontrolle mit Julia

Projektdauer als LP

Die Projektdauer ist der längste Weg, als LP formuliert:

using JuMP, HiGHS

t = Dict(1=>3,2=>2,3=>3,4=>2,5=>3,6=>1,7=>2,8=>2,9=>1)
# (Vorgänger h, Vorgang i, Mindestabstand d_hi)
kanten = [(1,2,-1),(1,3,1),(3,4,0),(2,5,0),(3,5,1),(4,6,0),
          (5,7,1),(6,7,0),(6,8,0),(7,9,0),(8,9,0)]

modell = Model(HiGHS.Optimizer); set_silent(modell)
@variable(modell, S[keys(t)] >= 0)   # Anfangszeitpunkte (FAZ)
@variable(modell, C >= 0)            # Projektdauer
@constraint(modell, [(h,i,d) in kanten], S[i] >= S[h] + t[h] + d)
@constraint(modell, [i in keys(t)], C >= S[i] + t[i])
@objective(modell, Min, C)

optimize!(modell)
println("Projektdauer = ", objective_value(modell))
Projektdauer = 15.0

Vorwärtsrechnung als LP

Frühestmögliche Zeitpunkte: minimiere die Summe aller Endzeitpunkte:

tv = [3, 2, 3, 2, 3, 1, 2, 2, 1]

modell = Model(HiGHS.Optimizer); set_silent(modell)
@variable(modell, FAZ[1:9] >= 0)
@constraint(modell, FAZ[1] == 0)
@constraint(modell, [(h,i,d) in kanten], FAZ[i] >= FAZ[h] + tv[h] + d)
@objective(modell, Min, sum(FAZ[i] + tv[i] for i in 1:9))   # min Σ FEZ
optimize!(modell)
println("FAZ = ", round.(Int, value.(FAZ)))
FAZ = [0, 2, 4, 7, 8, 9, 12, 10, 14]

Rückwärtsrechnung als LP

Spätestmögliche Zeitpunkte: maximiere, bei fixiertem Projektende:

modell = Model(HiGHS.Optimizer); set_silent(modell)
@variable(modell, SAZ[1:9] >= 0)
@constraint(modell, SAZ[9] + tv[9] == 15)                 # SEZ_9 = FEZ_9*
@constraint(modell, [(h,i,d) in kanten], SAZ[i] >= SAZ[h] + tv[h] + d)
@objective(modell, Max, sum(SAZ))
optimize!(modell)
println("SAZ = ", round.(Int, value.(SAZ)))
SAZ = [0, 6, 4, 9, 8, 11, 12, 12, 14]

Beide Vektoren stimmen mit dem Terminplan von vorhin überein.

Zusammenfassung

Das Wichtigste auf einen Blick

  • MPM-Netzplan: Vorwärtsrechnung liefert früheste, Rückwärtsrechnung späteste Zeitpunkte.
  • Der kritische Weg ist der längste Weg; kritische Vorgänge haben GPi=0\text{GP}_i = 0.
  • Pufferzeiten (GP, FP, FRP, UP) zeigen den Spielraum unkritischer Vorgänge.
  • Maximalabstände werden zu negativen Rückwärtspfeilen; die Zyklen löst ein FIFO-Verfahren.

Literatur

Literaturverzeichnis

Domschke, Wolfgang, Andreas Drexl, Robert Klein, und Armin Scholl. 2015. Einführung in Operations Research. 9. Aufl. Springer Gabler. https://doi.org/10.1007/978-3-662-48216-2.