Der Routing-Löser nutzt ein Objekt, eine sogenannte Dimension, Mengen an, die sich entlang der Route eines Fahrzeugs ansammeln, z. B. Fahrzeit oder bei Abhol- und Lieferungen: das Gesamtgewicht, das es transportiert. . Wenn ein Routing-Problem eine solche Menge beinhaltet, entweder in den der Zielfunktion ist, müssen Sie dafür eine Dimension definieren.
In diesem Abschnitt wird erläutert, wie Dimensionen definiert und verwendet werden.
Beispiele für Dimensionen
Hier sind einige Beispiele für Dimensionen aus den vorherigen Abschnitten.
Mit dem Beispiel für VRPTW wird eine Dimension für das Tracking erstellt. kumulierte Fahrtzeit jedes Fahrzeugs ermitteln. Der Matherechner verwendet die Dimension, um die Einschränkung, dass ein Fahrzeug nur einen Standort innerhalb der Zeitfenster.
Im Beispiel für CVRP wird eine Dimension für die Anforderungen (z.B. Gewicht oder Menge der abzuholenden Pakete), die die die kumulative Last, die das Fahrzeug auf seiner Route trägt. Der Solver nutzt die Dimension, um die Einschränkung zu erzwingen, dass die Last eines Fahrzeugs ihre Kapazität nicht überschreiten darf.
In den folgenden Beispielen wird eine Dimension für das VRPTW mithilfe der Methode
AddDimension
.
Python
routing.AddDimension( callback_index, slack_max, capacity, fix_start_cumul_to_zero, dimension_name)
C++
routing.AddDimension( callback_index, slack_max, capacity, fix_start_cumul_to_zero, dimension_name)
Java
routing.addDimension( callbackIndex, slackMax, capacity, fixStartCumulToZero, dimensionName)
C#
routing.AddDimension( callbackIndex, slackMax, capacity, fixStartCumulToZero, dimensionName)
Die Methode AddDimension
hat folgende Eingaben:
callback_index
: Der Index für den Callback, der die Menge zurückgibt. Die -Index, also der interne Verweis des Solver zum Callback, wird durch wieRegisterTransitCallback
oderRegisterUnitaryTransitCallback
.slack_max
: Maximum für den Leerlauf (Slack), eine Variable, die für Wartezeiten steht Uhrzeiten an den Orten. Siehe Slack-Variablen unten für Informationen zu Details. Wenn das Problem keine Wartezeit beinhaltet, können Sie in der Regelslack_max
festlegen. auf 0 gesetzt.capacity
: Maximum für die entlang jeder Route akkumulierte Gesamtmenge. Verwenden Siecapacity
, um Einschränkungen wie die im CVRP Wenn Ihr Problem nicht über können Sie fürcapacity
einen Wert festlegen, der groß genug ist, keine Einschränkungen für die Routen auferlegen, z. B. die Summe aller Einträge der Matrix oder des Arrays, die zur Definition des Callbacks verwendet werden.fix_start_cumulative_to_zero
: Boolescher Wert. Falls wahr, der kumulierte Wert beginnt bei 0. In den meisten Fällen sollte dieser Wert aufTrue
festgelegt werden. Für die VRPTW oder Probleme mit Ressourceneinschränkungen, einige Fahrzeuge möglicherweise aufgrund von Zeiteinschränkungen nach der Zeit 0 beginnen müssen, daher sollten Siefix_start_cumulative_to_zero
für diese Probleme aufFalse
festlegen.dimension_name
: String für den Namen der Dimension, z. B.'Distance'
mit dem Sie an anderer Stelle im Programm auf die Variablen zugreifen können.
Das CVRP-Programm erstellt mithilfe der Funktion
AddDimensionWithVehicleCapacity
. Diese Methode verwendet ein Array von Kapazitäten mit einem Eintrag für jedes Fahrzeug.
(Im Gegensatz dazu verwendet AddDimension
einen einzelnen Wert für capacity
, sodass alle
wird davon ausgegangen, dass die Fahrzeuge die gleiche Kapazität haben.)
Weitere Informationen finden Sie in der RoutingModel
.
für andere Methoden zum Erstellen von Dimensionen.
Der Abschnitt Zeitfenster für die Lösung in einer Liste oder einem Array speichern stellt Funktionen zum Speichern der kumulativen Daten in einer Dimension in einer Liste oder einem Array dar.
Slack-Variablen
Hier ist ein Beispiel, das Slack-Variablen für ein Problem mit Reisezeit. Angenommen, ein Fahrzeug in einem Schritt seiner Route von Ort i zu Ort J bewegt, und dass
- Die kumulierte Fahrtzeit des Fahrzeugs bei i beträgt 100 Minuten.
- Die kumulierte Fahrzeit des Fahrzeugs bei j beträgt 200 Minuten.
- Die Fahrzeit von i nach j beträgt 75 Minuten.
Das Fahrzeug kann den Ort nicht sofort nach der Ankunft oder nicht sofort verlassen. an Ort j 175. Stattdessen muss das Fahrzeug 25 Minuten Ort i vor der Abreise; mit anderen Worten, das Spiel beträgt an Position i 25.
Sie müssen das Spielraum in einem VRPTW zulassen, da Fahrzeuge möglicherweise warten müssen, bevor
aufgrund von begrenzten Zeitfenstern nicht besucht. Stellen Sie bei einem solchen Problem
slack_max
bis zur maximalen Wartezeit von Fahrzeugen
nach einem Standort suchen, bevor Sie mit dem nächsten fortfahren. Wenn es keine Rolle spielt, wie lange
warten Sie. Setzen Sie einfach slack_max
auf eine sehr hohe Zahl.
Für den CVRP hingegen ist die Änderung der akkumulierten Last von i
zu
j
entspricht immer dem Bedarf um i
, also gibt es kein Spiel. Bei Problemen wie
setzen Sie slack_max
auf 0.
Als Nächstes geben wir die formale Definition von Slack. Intern speichert eine Dimension zwei Typen von Variablen, die sich auf Mengen beziehen, die sich entlang der Routen ansammeln:
- Variablen für öffentliche Verkehrsmittel: Die Erhöhung oder Verringerung der Menge in jedem Schritt
eine Route berechnen.
Wenn
i -> j
ein Schritt in einer Route ist, ist die Variable für öffentliche Verkehrsmittel entwederi
,j
-Eintrag der Transit-Matrix (für einen Transit-Callback) oder einfach den Callback-Wert an Standort i (wenn der Callback von nur einem Standort abhängt). - Kumulative Variablen: Die an jedem Standort akkumulierte Gesamtmenge. Ich
auf die kumulative Variable an Position i zugreifen,
dimension_name.CumulVar(i)
Ein Beispiel finden Sie in der Zeitfenstereinschränkungen im VRPTW-Beispiel an.
Wenn ein Fahrzeug in einem Schritt von Standort i
zu Standort j
fährt,
hängt mit diesen Variablen zusammen:
slack(i) = cumul(j) - cumul(i) - transit(i, j)
Weitere Informationen zu Dimensionen finden Sie unter
RoutingDimension
im Referenzabschnitt.