Kapitel 14 · Supply Chain Management & Distribution
Nach dieser Einheit können Sie …
Literatur zur Vertiefung
Pendelverkehr oder Rundtour?
Ausgangslage
Im Normalbetrieb liefert ein Kühltransporter (Kapazität 900 Boxen) jeden Morgen 845 Boxen aus Raunheim an die sechs Filialen. Der Fahrer fährt bisher jede Filiale einzeln an und kehrt danach zur Küche zurück (Pendelverkehr).
Täglich gefahrene Strecke: \(2 \cdot \sum_j d_{Rj} =\) 296 km (Straßennetz; Schätzung aus der Standortplanung II: 204 km)
Idee
Da alle Boxen auf einmal in den Transporter passen, kann er die Filialen in einer Rundtour nacheinander anfahren.
Frage: In welcher Reihenfolge ist die Tour am kürzesten?
Die Distanzen \(d_{ij}\) stammen aus der Distanzmatrix von Einheit Kürzeste Wege (kürzeste Wege im Straßennetz).
Problembeschreibung
Problemstellung
Gegeben sind \(n\) Orte (ein Depot und \(n-1\) Kunden) und die Entfernungen \(d_{ij}\) zwischen allen Paaren. Gesucht ist eine Rundreise, die jeden Ort genau einmal besucht, zum Ausgangspunkt zurückkehrt und minimale Gesamtlänge hat.
Begriffe
Abgrenzung
Distanzmatrix \(d_{ij}\) (km) aus Einheit Kürzeste Wege
| 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 |
Mathematisches Modell
Binäres Optimierungsmodell (Dantzig et al. 1954)
\(x_{ij} = 1\), falls direkt von \(i\) nach \(j\) gefahren wird
\[\min \rightarrow \sum_{i} \sum_{j \neq i} d_{ij} \cdot x_{ij}\]
Nebenbedingungen \[ \begin{align} \sum_{j \neq i} x_{ij} &= 1 && \forall i \\ \sum_{i \neq j} x_{ij} &= 1 && \forall j \\ \sum_{i \in S} \sum_{j \in S} x_{ij} &\leq |S| - 1 && \forall S \subset V,\ 2 \leq |S| < n \\ x_{ij} &\in \{0,1\} && \forall i \neq j \end{align} \]
Zeilen 1–2: jeden Ort genau einmal verlassen und erreichen. Zeile 3: keine Kurzzyklen.
Ohne die dritte Bedingung wären zwei getrennte Kreise zulässig: Jeder Ort hat genau einen Vorgänger und Nachfolger, aber die Filialen C3, C5, C6 sind nicht mit der Küche verbunden.
Warum nicht einfach alle Touren ausprobieren?
| Orte n | Touren (n−1)!/2 | Rechenzeit bei 10⁹ Touren/s |
|---|---|---|
| 5 | 12 | < 1 Sekunde |
| 7 | 360 | < 1 Sekunde |
| 10 | 181.440 | < 1 Sekunde |
| 15 | 4,4 · 1010 | 44 Sekunden |
| 20 | 6,1 · 1016 | 1,9 Jahre |
| 30 | 4,4 · 1030 | 1,4 · 1014 Jahre |
| 50 | 3,0 · 1062 | 9,6 · 1045 Jahre |
Kombinatorische Explosion
Das TSP ist NP-schwer: Es ist kein Verfahren bekannt, das jede Instanz in polynomieller Zeit optimal löst. Für SushiFresh (\(n = 7\)) gibt es nur 360 verschiedene Touren, ein Paketdienst mit 150 Stopps pro Fahrzeug hat dagegen unvorstellbar viele.
Lösungsansätze
Idee und Algorithmus
Idee: Fahre vom aktuellen Ort immer zum nächstgelegenen noch nicht besuchten Ort. Sind alle besucht, kehre zum Depot zurück.
Algorithmus
Initialisierung: Tour \(T = (v_1)\) mit Startort (Depot) \(v_1\)
Wiederhole, bis alle Orte in \(T\) enthalten sind:
Abschluss: Kante vom letzten Ort zurück zu \(v_1\)
Eigenschaften
Typische Schwäche
Die letzten Orte liegen oft verstreut. Am Ende werden lange Wege und der Rückweg zum Depot „erzwungen“.
Fallbeispiel – Start in Raunheim
| # | von | offene Orte: d (km) | nach | km | Σ km |
|---|---|---|---|---|---|
| 1 | R | C4: 6, C2: 22, C1: 26, C6: 27, C3: 28, C5: 39 | C4 | 6 | 6 |
| 2 | C4 | C2: 16, C1: 30, C6: 32, C3: 33, C5: 33 | C2 | 16 | 22 |
| 3 | C2 | C1: 14, C6: 48, C3: 49, C5: 49 | C1 | 14 | 36 |
| 4 | C1 | C6: 43, C3: 44, C5: 60 | C6 | 43 | 79 |
| 5 | C6 | C3: 10, C5: 24 | C3 | 10 | 89 |
| 6 | C3 | C5: 34 | C5 | 34 | 123 |
| 7 | C5 | Rückkehr zum Depot | R | 39 | 162 |
NN-Tour: R → C4 → C2 → C1 → C6 → C3 → C5 → R mit 162 km, gegenüber 296 km im Pendelverkehr.
Kritische Würdigung
Was ist schiefgelaufen?
Merkregel
In einer optimalen Tour eines euklidischen TSP gibt es keine Kreuzungen. Kreuzungen sind ein deutliches Zeichen für Verbesserungspotenzial.
NN-Tourlänge je nach Startort
| Start | Tour (ab Depot gelesen) | km |
|---|---|---|
| R | R → C4 → C2 → C1 → C6 → C3 → C5 → R | 162 |
| C1 | R → C6 → C3 → C5 → C1 → C2 → C4 → R | 167 |
| C2 | R → C4 → C6 → C3 → C5 → C2 → C1 → R | 171 |
| C3 | R → C2 → C1 → C3 → C6 → C5 → C4 → R | 153 |
| C4 | R → C2 → C1 → C6 → C3 → C5 → C4 → R | 162 |
| C5 | R → C4 → C2 → C1 → C5 → C6 → C3 → R | 158 |
| C6 | R → C4 → C2 → C1 → C5 → C6 → C3 → R | 158 |
Eine einfache Verbesserung: NN von jedem Startort aus rechnen und die beste Tour wählen.
Idee: zwei Kanten austauschen (Croes 1958)
Idee: Entferne zwei nicht benachbarte Kanten \((a,b)\) und \((c,d)\) aus der Tour und verbinde die Teilstücke neu über \((a,c)\) und \((b,d)\). Das Teilstück zwischen \(b\) und \(c\) wird dabei in umgekehrter Richtung durchlaufen.
Ersparnis eines 2-opt-Zugs
\[\Delta = \underbrace{d_{ab} + d_{cd}}_{\text{entfernt}} - \underbrace{d_{ac} + d_{bd}}_{\text{hinzugefügt}}\] Der Zug lohnt sich, wenn \(\Delta > 0\).
Bei \(n\) Orten gibt es \(n(n-3)/2\) mögliche 2-opt-Züge, bei SushiFresh also 14.
Algorithmus
Initialisierung: Starttour \(T = (v_1, \ldots, v_n)\), z. B. aus Nearest Neighbor
Wiederhole:
Varianten
Lokales Optimum
Eine 2-optimale Tour lässt sich durch keinen einzelnen 2-opt-Zug verbessern. Sie muss aber nicht global optimal sein.
Fallbeispiel – alle Züge für die NN-Tour
| entfernte Kanten | neue Kanten | alt | neu | Δ |
|---|---|---|---|---|
| (C1,C6) (C3,C5) | (C1,C3) (C6,C5) | 77 | 68 | 9 |
| (C4,C2) (C5,R) | (C4,C5) (C2,R) | 55 | 55 | 0 |
| (C6,C3) (C5,R) | (C6,C5) (C3,R) | 49 | 52 | -3 |
| (C1,C6) (C5,R) | (C1,C5) (C6,R) | 82 | 87 | -5 |
| (R,C4) (C1,C6) | (R,C1) (C4,C6) | 49 | 58 | -9 |
| (C4,C2) (C1,C6) | (C4,C1) (C2,C6) | 59 | 78 | -19 |
| (R,C4) (C3,C5) | (R,C3) (C4,C5) | 40 | 61 | -21 |
| (C2,C1) (C5,R) | (C2,C5) (C1,R) | 53 | 75 | -22 |
| (R,C4) (C2,C1) | (R,C2) (C4,C1) | 20 | 52 | -32 |
| (C4,C2) (C3,C5) | (C4,C3) (C2,C5) | 50 | 82 | -32 |
| (R,C4) (C6,C3) | (R,C6) (C4,C3) | 16 | 60 | -44 |
| (C4,C2) (C6,C3) | (C4,C6) (C2,C3) | 26 | 81 | -55 |
| (C2,C1) (C3,C5) | (C2,C3) (C1,C5) | 48 | 109 | -61 |
| (C2,C1) (C6,C3) | (C2,C6) (C1,C3) | 24 | 92 | -68 |
Einziger verbessernder Zug
Entferne (C1, C6) und (C3, C5), füge (C1, C3) und (C6, C5) ein:
\[\Delta = (43 + 34) - (44 + 24) = 9\ \text{km}\]
Das Teilstück C6 → C3 wird umgedreht zu C3 → C6.
Neue Tour: R → C4 → C2 → C1 → C3 → C6 → C5 → R mit 153 km
Fallbeispiel – vorher und nachher
Nearest Neighbor: 162 km
nach 2-opt: 153 km
Die Kreuzung ist aufgelöst. Danach findet 2-opt keinen weiteren verbessernden Zug: Die Tour ist 2-optimal.
Vergleich mit der Optimallösung
Ergebnis
Grenze von 2-opt
Die optimale Tour unterscheidet sich von der 2-opt-Lösung in drei Kanten. Dafür ist ein 3-opt-Zug nötig, jeder einzelne 2-opt-Zug verlängert die Tour. 2-opt bleibt im lokalen Optimum stecken.
Gegenüber dem Pendelverkehr spart die Tour täglich 143 km. Was das in Euro und für den E-Kühl-Lkw bedeutet, zeigen die nächsten beiden Folien.
Bewertung mit den Kostensätzen aus der Einheit Verkehrsmittel und Antriebe
| Variante | km/Tag | Stunden/Tag | Kosten/Tag | € je Box |
|---|---|---|---|---|
| Pendelverkehr | 296 | 9,6 | 550,8 € | 0,652 € |
| Nearest Neighbor | 162 | 5,3 | 345,7 € | 0,409 € |
| NN + 2-opt | 153 | 5,2 | 334,6 € | 0,396 € |
Fahrzeugfixkosten 90,3 €/Tag, 0,536 €/km, Fahrer 31,5 €/h; Ø 45 km/h, 15 min je Filiale, 15 min je Beladung in Raunheim.
Ergebnis
Die optimierte Rundtour senkt die Kosten je Box um 39 %, das sind rund 64.863 € pro Jahr. Gespart werden Kilometer und Fahrerstunden, weil nur einmal beladen wird.
Der lineare Satz von 0,02 €/(Box·km) aus der Standortplanung unterstellt Pendelverkehr. Bündelungseffekte der Tour kann er nicht abbilden.
Klappt die Tour mit dem E-Kühl-Lkw?
| Tour | km | Sommer (0,62 kWh/km) | Winter (0,70 kWh/km) |
|---|---|---|---|
| Pendelverkehr | 296 | 184 kWh ✗ | 207 kWh ✗ |
| Nearest Neighbor | 162 | 100 kWh ✓ | 113 kWh ✗ |
| NN + 2-opt | 153 | 95 kWh ✓ | 107 kWh ✓ |
| Optimum | 151 | 94 kWh ✓ | 106 kWh ✓ |
Nutzbare Energie je Tour: \(Q =\) 110 kWh (vgl. Einheit Verkehrsmittel und Antriebe).
Ergebnis
Lehre
Beim E-Lkw entscheidet die Qualität der Tourenplanung über die Machbarkeit, nicht nur über die Kosten. Modelle mit Energie-Nebenbedingung heißen E-VRP (Schneider et al. 2014).
Implementierung
nearest_neighbor <- function(D, start = 1) {
tour <- start
while (length(tour) < nrow(D)) {
offen <- setdiff(seq_len(nrow(D)), tour)
letzte <- tail(tour, 1)
naechster <- offen[which.min(D[letzte, offen])]
tour <- c(tour, naechster)
}
rownames(D)[tour]
}
tour_length <- function(tour, D)
sum(D[cbind(tour, c(tour[-1], tour[1]))])two_opt <- function(tour, D) {
n <- length(tour)
repeat {
best <- 0
for (i in 1:(n - 1)) for (k in (i + 1):n) {
a <- tour[i]; b <- tour[i + 1]
c <- tour[k]; d <- tour[k %% n + 1]
if (b == c || a == d) next
delta <- D[a, b] + D[c, d] - D[a, c] - D[b, d]
if (delta > best) {
best <- delta; bi <- i; bk <- k
}
}
if (best <= 0) break # 2-optimal
tour <- c(tour[1:bi], rev(tour[(bi + 1):bk]),
if (bk < n) tour[(bk + 1):n])
}
tour
}MTZ-Formulierung mit ompr
library(ompr); library(ompr.roi)
library(ROI.plugin.glpk)
n <- nrow(D)
tsp_model <- MIPModel() |>
add_variable(x[i, j], i = 1:n, j = 1:n,
type = "binary") |>
add_variable(u[i], i = 1:n, lb = 1, ub = n) |>
set_objective(sum_expr(D[i, j] * x[i, j],
i = 1:n, j = 1:n), "min") |>
add_constraint(x[i, i] == 0, i = 1:n) |>
add_constraint(sum_expr(x[i, j], j = 1:n) == 1,
i = 1:n) |>
add_constraint(sum_expr(x[i, j], i = 1:n) == 1,
j = 1:n) |>
# MTZ: Reihenfolgevariablen verhindern Kurzzyklen
add_constraint(u[i] - u[j] + 1 <= (n - 1) * (1 - x[i, j]),
i = 2:n, j = 2:n, i != j)
tsp_sol <- solve_model(tsp_model,
with_ROI(solver = "glpk"))MTZ-Bedingungen (Miller et al. 1960)
Statt exponentiell vieler Kurzzyklus-Bedingungen erhält jeder Kunde eine Position \(u_i\) in der Tour. Fährt man von \(i\) nach \(j\), muss \(u_j \geq u_i + 1\) gelten. Ein Kreis ohne Depot ist damit unmöglich.
Ergebnis: R → C1 → C2 → C4 → C5 → C6 → C3 → R mit 151 km, identisch zur Enumeration.
Die MTZ-Formulierung ist einfach, aber schwach. Für große Instanzen werden Spezialverfahren eingesetzt (z. B. der Concorde-Solver).
Vom TSP zum Vehicle Routing Problem
Neue Flotte
Der 900-Boxen-Transporter wird durch zwei Kühlvans à 500 Boxen ersetzt (Führerscheinklasse B, leichter zu besetzen). Die Tagesmenge von 845 Boxen passt nicht mehr in ein Fahrzeug.
Capacitated VRP (CVRP): Teile die Kunden so auf mehrere Touren auf, dass die Kapazität eingehalten wird und die Gesamtstrecke minimal ist. Das TSP ist der Spezialfall mit einem Fahrzeug ohne Kapazitätsgrenze.
Savings-Verfahren (Clarke and Wright 1964)
Start: jede Filiale in einer eigenen Pendeltour. Verbinde schrittweise Touren mit der größten Ersparnis \(s_{ij} = d_{Ri} + d_{Rj} - d_{ij}\), solange die Kapazität reicht und \(i\), \(j\) Tourenden sind.
Weitere Erweiterungen: Zeitfenster (Anlieferung vor 8 Uhr), maximale Tourdauer (Kühlkette, Lenkzeiten), heterogene Flotte, mehrere Depots
Das Wichtigste in Kürze
Übungsaufgaben zu dieser Einheit
Aufgaben zur Klausurvorbereitung (Teil 1) und eine vertiefende Fallstudie (Teil 2) finden Sie in Fallstudie 10: Tourenplanung.

Supply Chain Management