Vorlesung 09: Netzplantechnik

Grundlagen Operations Research

Netzplantechnik

Ein Projekt planen

Was ist ein Projekt?

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

HinweisNetzplantechnik

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

Knoten = Vorgänge (mit Dauer tit_i), 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 dhiA,dhi,dhiE,dhiS\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=dhiAthd_{hi} = d^A_{hi} - t_h dhiA\bar d^{\,A}_{hi} dih=dhiAtid_{ih} = -\bar d^{\,A}_{hi} - t_i
dhid_{hi} dhid_{hi} dhi\bar d_{hi} dih=dhithtid_{ih} = -\bar d_{hi} - t_h - t_i
dhiEd^E_{hi} dhi=dhiEtid_{hi} = d^E_{hi} - t_i dhiE\bar d^{\,E}_{hi} dih=dhiEthd_{ih} = -\bar d^{\,E}_{hi} - t_h
dhiSd^S_{hi} dhi=dhiSthtid_{hi} = d^S_{hi} - t_h - t_i dhiS\bar d^{\,S}_{hi} dih=dhiSd_{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 dhi=10\bar d_{hi} = 10.

Frage: Welcher Pfeil entsteht daraus im Netzplan?

dih=dhithti=1023=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.

Zeitplanung

Vorwärtsrechnung

Früheste Zeitpunkte, topologisch von i=0i = 0 bis nn:

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

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,124}=𝟏𝟏 \text{FAZ}_i = \max\{6+3,\; 5+6,\; 12-4\} = \mathbf{11}

Rückwärtsrechnung

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

SEZn:=FEZn,SEZi:=minj𝒩(i){SAZjdij},SAZi:=SEZiti \text{SEZ}_n := \text{FEZ}_n, \qquad \text{SEZ}_i := \min_{j \in \mathcal{N}(i)}\{\text{SAZ}_j - d_{ij}\}, \qquad \text{SAZ}_i := \text{SEZ}_i - t_i

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{142,12(2)}=𝟏𝟐 \text{SEZ}_i = \min\{14-2,\; 12-(-2)\} = \mathbf{12}

Der Terminplan

Erst die Vorwärts-, dann die Rückwärtsrechnung:

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
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
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

Vorwärts, z. B. FAZ5=max{FEZ2+0,FEZ3+1}=max{4,8}=8\text{FAZ}_5 = \max\{\text{FEZ}_2 + 0,\; \text{FEZ}_3 + 1\} = \max\{4, 8\} = 8.

Rückwärts, z. B. SEZ3=min{SAZ40,SAZ51}=min{9,7}=7\text{SEZ}_3 = \min\{\text{SAZ}_4 - 0,\; \text{SAZ}_5 - 1\} = \min\{9, 7\} = 7.

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.

Kritischer Weg & Puffer

Der kritische Weg

HinweisKritischer Weg

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

Kritische Vorgänge

Der kritische Weg ist 135791 \to 3 \to 5 \to 7 \to 9.

WichtigKonsequenz

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=SAZiFAZi\text{GP}_i = \text{SAZ}_i - \text{FAZ}_i.
  • Freie Pufferzeit: FPi=minj𝒩(i){FAZjdij}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=SAZimaxh𝒱(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+FRPiGPi}\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 UPiFPi,FRPiGPi\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).

Netzpläne mit Zyklen

Wenn Maximalabstände gelten

Enthält der Netzplan Zyklen (z. B. durch Maximalabstände), versagt die topologische Reihenfolge.

Dann hilft ein FIFO-Verfahren wie bei den kürzesten Wegen: erst Vorwärts-, dann Rückwärtsrechnung, Knoten bei jeder Aktualisierung erneut in die FIFO-Liste aufnehmen.

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: d3,8E=6\bar d^{\,E}_{3,8} = 6.

Frage: Welcher Pfeil entsteht daraus?

Transformationsregel dih=dhiEthd_{ih} = -\bar d^{\,E}_{hi} - t_h:

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

Der erweiterte Netzplan

Der Zyklus 346833 \to 4 \to 6 \to 8 \to 3 hat die Länge 3+0+2+0+1+0+29=103 + 0 + 2 + 0 + 1 + 0 + 2 - 9 = -1 \le 0: der Plan bleibt zulässig.

Neue späteste Zeitpunkte

Die Vorwärtsrechnung ändert sich nicht (FEZ89=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{SAZ90,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.