Kürzeste Wege

Kapitel 13 · Supply Chain Management & Distribution

Prof. Dr. Thomas Kirschstein

operative Distributionsplanung

Distributionsplanung

  • Kürzeste Wege
  • Tourenplanung

Lernziele

Nach dieser Einheit können Sie …

  • Straßennetze als Graphen mit Knoten, Kanten und Kantengewichten modellieren,
  • verschiedene Varianten des Kürzeste-Wege-Problems unterscheiden,
  • den Dijkstra-Algorithmus von Hand durchführen und in R implementieren,
  • aus kürzesten Wegen eine Distanzmatrix für Transport- und Tourenplanung ableiten.

Literatur zur Vertiefung

Fallstudie – SushiFresh GmbH

Woher kommen eigentlich die Transportkosten?

Rückblick

In der Standort- und der Transportplanung waren die Transportkosten \(c_{ij}\) vorgegeben. Aus der Einheit Verkehrsmittel und Antriebe kennen wir Kostensätze je km. Es fehlen die Entfernungen: \(c_{ij}\) = Kostensatz × Entfernung. Im Januar endet das Weihnachtsgeschäft: Die Zentralküche Raunheim beliefert wieder alle sechs Filialen allein.

Auftrag der Disposition

Die neue Disponentin möchte die Kostensätze selbst nachvollziehen. Dafür braucht sie die Straßenentfernungen

  • von Raunheim zu jeder Filiale und
  • zwischen allen Filialen (für die Tourenplanung in Einheit Tourenplanung).

Erste Idee: Luftlinie (Haversine, Einheit Standortplanung I)

ID Filiale Luftlinie ab Raunheim (km)
C1 Wiesbaden 18,3
C2 Mainz 13,9
C3 Frankfurt 19,8
C4 Rüsselsheim 4,0
C5 Darmstadt 19,4
C6 Offenbach 24,6

Lkw fahren nicht Luftlinie: Rhein- und Mainbrücken, Autobahnkreuze und Ortsdurchfahrten bestimmen die tatsächliche Strecke.

Straßennetz als Graph

Modellierung

Graph \(G = (V, E)\)

  • Knoten \(V\): Orte (Küche, Filialen) und Verknüpfungspunkte (Autobahnkreuze)
  • Kanten \(E\): direkte Straßenverbindungen
  • Kantengewicht \(c_{vw} \geq 0\): Länge, Fahrzeit oder Kosten
  • ungerichtet, wenn beide Richtungen gleich lang sind; sonst gerichtet (Einbahnstraßen, Auffahrten)

Weg von \(s\) nach \(t\): Folge benachbarter Knoten; Länge = Summe der Kantengewichte

Das SushiFresh-Netz hat 10 Knoten und 16 Kanten (vereinfacht).

Kürzeste-Wege-Probleme

Problemvarianten

Variante Frage Verfahren Beispiel
1 → 1 Kürzester Weg von s nach t Dijkstra (mit Abbruch), A* Navigationssystem
1 → alle Kürzeste Wege von s zu allen Knoten Dijkstra, Bellman-Ford Kostensätze ab Zentralküche
alle → alle Kürzeste Wege zwischen allen Knotenpaaren Floyd-Warshall oder n × Dijkstra Distanzmatrix für die Tourenplanung

Als Netzwerkflussproblem

Ein Kürzeste-Wege-Problem ist ein Transportproblem auf einem Netz: Eine Einheit fließt von \(s\) nach \(t\).

\[\min \sum_{(v,w) \in E} c_{vw} \, x_{vw}\] \[\sum_{w} x_{vw} - \sum_{w} x_{wv} = \begin{cases} 1 & v = s \\ -1 & v = t \\ 0 & \text{sonst} \end{cases}\] \[x_{vw} \geq 0\]

Mit spezialisierten Algorithmen geht es aber deutlich schneller als mit einem LP-Solver.

Dijkstra-Algorithmus

Idee

Idee (Dijkstra 1959): Breite dich vom Startknoten \(s\) wie eine Welle aus. Jeder Knoten \(v\) trägt eine Marke \(d(v)\) (bisher kürzeste bekannte Entfernung) und einen Vorgänger \(p(v)\). In jedem Schritt wird der nächstgelegene noch offene Knoten endgültig („permanent“) markiert.

Zwei Arten von Marken

  • temporär: vorläufiger Wert, kann noch verbessert werden
  • permanent: endgültig kürzeste Entfernung

Warum ist der kleinste temporäre Wert endgültig? Jeder andere Weg müsste über einen Knoten mit größerer Marke laufen und kann wegen \(c_{vw} \geq 0\) nicht kürzer werden.

Kernoperation: Markenkorrektur

Für jeden Nachbarn \(w\) des neu permanenten Knotens \(v\): \[d(w) \leftarrow \min\big(d(w),\; d(v) + c_{vw}\big)\] Verbessert sich \(d(w)\), wird \(p(w) \leftarrow v\) gesetzt.

Voraussetzung: keine negativen Kantengewichte.

Dijkstra-Algorithmus

Algorithmus

Initialisierung: \(d(s) = 0\), \(d(v) = \infty\) für alle \(v \neq s\); alle Marken temporär; \(p(v) = \text{–}\)

Wiederhole, bis alle Knoten permanent sind:

  1. Wähle den temporär markierten Knoten \(v\) mit kleinstem \(d(v)\).
  2. Markiere \(v\) permanent.
  3. Für jeden temporär markierten Nachbarn \(w\) von \(v\):
    • falls \(d(v) + c_{vw} < d(w)\): setze \(d(w) = d(v) + c_{vw}\) und \(p(w) = v\)

Ergebnis: \(d(v)\) = kürzeste Entfernung von \(s\) nach \(v\); der Weg ergibt sich durch Rückverfolgung der Vorgänger \(p(v)\).

Aufwand

  • \(n\) Iterationen, je Iteration Minimumsuche über \(n\) Knoten → \(\mathcal{O}(n^2)\)
  • mit Prioritätswarteschlange (Heap) → \(\mathcal{O}(|E| + n \log n)\)
  • Ein Navigationssystem durchsucht so Millionen Knoten in Millisekunden (mit Beschleunigungen wie A*).

Notation im Fallbeispiel

Marke „\(d\) | \(p\)“, z. B. „15 | MH“ = 15 km, Vorgänger Mönchhof-Dreieck

Dijkstra-Algorithmus

Fallbeispiel – Iteration 1: Start in Raunheim

Schritt

  • R hat die kleinste Marke (0) → permanent
  • Nachbarn erhalten erste Marken:
    • MH: \(0 + 5 = 5\)
    • C4: \(0 + 6 = 6\)
    • C3: \(0 + 33 = 33\) (Bundesstraße direkt nach Frankfurt)

Legende

  • ● permanent
  • ● temporär markiert
  • ○ in dieser Iteration verbessert
  • graue Knoten: noch \(d = \infty\)

Dijkstra-Algorithmus

Fallbeispiel – Iteration 3: Rüsselsheim

Schritt

  • Iteration 2: MH (5) wurde permanent → WK = 18, FK = 15
  • Iteration 3: kleinste temporäre Marke ist C4 (6) → permanent
  • Nachbarn von C4:
    • C2: \(6 + 16 = 22\) → neu
    • C5: \(6 + 33 = 39\) → neu
    • MH ist bereits permanent → keine Prüfung

Die Marke von C4 bleibt 6: Der Umweg über MH (\(5 + 10 = 15\)) war nie besser.

Dijkstra-Algorithmus

Fallbeispiel – Iteration 4: Markenkorrektur in Frankfurt

Schritt

  • FK (15) wird permanent
  • Nachbarn von FK:
    • C3: \(15 + 13 = 28 < 33\) → Korrektur! neue Marke 28, Vorgänger FK
    • C6: \(15 + 12 = 27\) → neu
    • C5: \(15 + 29 = 44 > 39\) → keine Änderung

Der direkte Weg nach Frankfurt (33 km) wird durch den Weg über die Autobahn (28 km) ersetzt. Temporäre Marken sind eben nur vorläufig.

Dijkstra-Algorithmus

Fallbeispiel – Tableau aller Iterationen

It. perm. R MH WK FK C1 C2 C3 C4 C5 C6
1 R 0 5 | R ∞ ∞ ∞ ∞ 33 | R 6 | R ∞ ∞
2 MH 5 18 | MH 15 | MH ∞ ∞ 33 | R 6 | R ∞ ∞
3 C4 18 | MH 15 | MH ∞ 22 | C4 33 | R 6 39 | C4 ∞
4 FK 18 | MH 15 ∞ 22 | C4 28 | FK 39 | C4 27 | FK
5 WK 18 26 | WK 22 | C4 28 | FK 39 | C4 27 | FK
6 C2 26 | WK 22 28 | FK 39 | C4 27 | FK
7 C1 26 28 | FK 39 | C4 27 | FK
8 C6 28 | FK 39 | C4 27
9 C3 28 39 | C4
10 C5 39

Zellen: „\(d\) | \(p\)“ (temporäre Marke), grün = wird in dieser Iteration permanent, rot = in dieser Iteration verbessert, leer = bereits permanent.

Nach 10 Iterationen sind alle Knoten permanent. Die Reihenfolge entspricht aufsteigenden Entfernungen.

Dijkstra-Algorithmus

Ergebnis: Kürzeste-Wege-Baum ab Raunheim

Filiale Kürzester Weg km Luftlinie Umweg-faktor
C1 R → MH → WK → C1 26 18,3 1,42
C2 R → C4 → C2 22 13,9 1,59
C3 R → MH → FK → C3 28 19,8 1,41
C4 R → C4 6 4,0 1,51
C5 R → C4 → C5 39 19,4 2,01
C6 R → MH → FK → C6 27 24,6 1,10

Die Vorgänger bilden einen Baum (grün): Von jedem Knoten führt genau ein kürzester Weg zurück nach Raunheim. Der mittlere Umwegfaktor liegt bei 1,51. Typische Werte in Deutschland liegen bei 1,2–1,4.

Dijkstra-Algorithmus

Implementierung in R

# W: Gewichtsmatrix (0 = keine Kante)
dijkstra <- function(W, start) {
  ids  <- rownames(W)
  d    <- setNames(rep(Inf, nrow(W)), ids)
  pred <- setNames(rep(NA, nrow(W)), ids)
  perm <- setNames(rep(FALSE, nrow(W)), ids)
  d[start] <- 0
  while (!all(perm)) {
    # 1. kleinste temporäre Marke
    v <- names(which.min(ifelse(perm, Inf, d)))
    # 2. permanent markieren
    perm[v] <- TRUE
    # 3. Markenkorrektur der Nachbarn
    for (w in ids[W[v, ] > 0 & !perm]) {
      if (d[v] + W[v, w] < d[w]) {
        d[w]    <- d[v] + W[v, w]
        pred[w] <- v
      }
    }
  }
  list(d = d, pred = pred)
}
res <- dijkstra(sp_W, start = "R")
res$d[c("C1", "C2", "C3",
        "C4", "C5", "C6")]
C1 C2 C3 C4 C5 C6 
26 22 28  6 39 27 

Alternative mit Paketen

igraph::distances(g, weights = ...) oder osrm::osrmTable() für echte Straßendaten (Einheit Standortplanung II).

Distanzmatrix für die Tourenplanung

Alle Paare: \(n\)-mal Dijkstra

nach (km)
von R C1 C2 C3 C4 C5 C6
R 0 26 22 28 6 39 27
C1 26 0 14 44 30 60 43
C2 22 14 0 49 16 49 48
C3 28 44 49 0 33 34 10
C4 6 30 16 33 0 33 32
C5 39 60 49 34 33 0 24
C6 27 43 48 10 32 24 0
stops <- c("R", paste0("C", 1:6))
D <- t(sapply(stops, function(s)
  dijkstra(sp_W, s)$d[stops]))

Eigenschaften der Distanzmatrix

  • symmetrisch (ungerichtetes Netz)
  • erfüllt die Dreiecksungleichung \(d_{ik} \leq d_{ij} + d_{jk}\), denn jede Direktverbindung ist bereits ein kürzester Weg
  • enthält nur noch die relevanten Orte, die Autobahnknoten sind „herausgerechnet“

Ausblick auf Einheit Tourenplanung

Fährt der Kühltransporter jede Filiale einzeln an (Pendelverkehr), legt er täglich \(2 \cdot \sum_j d_{Rj} =\) 296 km zurück, 45 % mehr als mit den geschätzten Distanzen der Standortplanung II (204 km, Einheit Verkehrsmittel und Antriebe). Geht das mit einer Rundtour kürzer?

Kürzeste Wege in der Praxis

Varianten und Erweiterungen

Weitere Algorithmen

  • Bellman-Ford: erlaubt negative Kantengewichte (z. B. Rückfrachten mit Erlös), \(\mathcal{O}(n \cdot |E|)\)
  • Floyd-Warshall: alle Paare auf einmal, \(\mathcal{O}(n^3)\)
  • A*: Dijkstra mit Schätzung der Restentfernung (z. B. Luftlinie) → durchsucht viel weniger Knoten

Was ist „kurz“?

  • Distanz (km): Kraftstoff, Verschleiß
  • Fahrzeit: Personal, Frische der Ware, Lieferfenster
  • Kosten: Maut, Fahrzeugkosten
  • zeitabhängig: Berufsverkehr auf der A3 um 7 Uhr ≠ um 4 Uhr

Je nach Zielgröße ergeben sich unterschiedliche kürzeste Wege.

Kernaussagen

Das Wichtigste in Kürze

  • Straßennetze werden als Graphen modelliert. Transportkosten \(c_{ij}\) ergeben sich aus kürzesten Wegen im Netz, nicht aus der Luftlinie.
  • Der Dijkstra-Algorithmus markiert schrittweise den nächstgelegenen offenen Knoten permanent und korrigiert die Marken seiner Nachbarn. Voraussetzung: nichtnegative Gewichte.
  • Temporäre Marken können sich noch verbessern (SushiFresh: Frankfurt von 33 auf 28 km).
  • Mehrfaches Anwenden liefert eine symmetrische, metrische Distanzmatrix, die Grundlage der Tourenplanung.

Übung

Übungsaufgaben zu dieser Einheit

Aufgaben zur Klausurvorbereitung (Teil 1) und eine vertiefende Fallstudie (Teil 2) finden Sie in Fallstudie 9: Kürzeste Wege.

Dijkstra, Edsger W. 1959. “A Note on Two Problems in Connexion with Graphs.” Numerische Mathematik 1 (1): 269–71.
Domschke, Wolfgang. 2007. Logistik: Transport. Grundlagen, Lineare Transport- Und Umladeprobleme. 5th ed. Oldenbourg.
Günther, Hans-Otto, and Horst Tempelmeier. 2012. Produktion Und Logistik. 9th ed. Springer-Lehrbuch. Springer.