Damit wird das Design and Scheduling Problem (LSNDSP) für das Linienversandnetzwerk aus der gegebenen DesignShippingNetworkRequest
gelöst.
Bei der LSNDSP handelt es sich um ein komplexes Optimierungsproblem, bei dem der optimale Entwurf und die optimale Planung eines Linienversandnetzwerks ermittelt werden soll. Ziel ist es, die Gesamtkosten für den Netzbetrieb zu minimieren und gleichzeitig einen möglichst hohen Frachtbedarf zwischen den Häfen zu decken.
Der LSNDSP lässt sich in zwei Hauptunterprobleme unterteilen: Netzwerkdesign und Planung. Das Teilproblem bezüglich des Netzwerkdesigns bestimmt die Gruppe der Ports, die vom Netzwerk bedient werden, die Anzahl der Schiffe, die auf jeder Route eingesetzt werden sollen, und die Routen, die die Schiffe nehmen werden. Das Teilproblem „Planung“ bestimmt die Fahrpläne für die Schiffe und berücksichtigt dabei die Zeit, die für das Booten zwischen den Häfen benötigt wird, die Zeit für das Be- und Entladen der Fracht und die Nachfrage nach Frachttransport zwischen Häfen.
Einfach ausgedrückt ist die LSNDSP das Problem der Entscheidung, welche Ports bedient und wie viele Schiffe verwendet und wie die Schiffe geplant werden sollen, damit die Betriebskosten des Netzwerks minimiert und gleichzeitig der Umsatz für die Befriedigung der Frachtnachfrage maximiert wird. Eine schwierige Teilkomponente der LSNDSP ist die Routenplanung, die bestimmt, welche Anforderungen erfüllt und welche Routen der Fracht zugewiesen werden, um den Umsatz zu maximieren.
HTTP-Anfrage
POST https://optimization.googleapis.com/v1/shipping:designShippingNetwork
Die URL verwendet die Syntax der gRPC-Transcodierung.
Anfragetext
Der Anfragetext enthält Daten mit folgender Struktur:
JSON-Darstellung |
---|
{ "requestId": string, "solverParameters": { object ( |
Felder | |
---|---|
requestId |
Problem oder Anfrage-ID |
solverParameters |
Parameter für den Solver. |
ports[] |
Liste der möglichen Häfen, die bei Schiffsservices aufgerufen werden können. Die Anfrage darf nur Port-IDs enthalten, die in dieser Liste enthalten sind. |
legCandidates[] |
Liste möglicher Abschnittskandidaten, die in die Schiffsabfertigung aufgenommen werden sollen. Die Anfrage darf nur Streckenkandidat-IDs enthalten, die in dieser Liste enthalten sind. |
vesselClasses[] |
Liste der Schiffsklassen für Dienstleistungen von Schiffen. Beachte, dass alle Gefäße derselben Klasse vollständig austauschbar sind. Der Antrag darf nur Schiffsklassen-IDs enthalten, die in dieser Liste enthalten sind. |
commodityDemands[] |
Liste der potenziellen Waren- (z.B. Container-)Anforderungen, die mit Schiffsservices erfüllt werden sollen. |
vesselServices[] |
Als Ausgangspunkt für die Optimierung kann ein Netz gültiger Schiffsabfertigungen (normalerweise der aktuelle Zustand des Netzwerks) bereitgestellt werden. |
Antworttext
Die Antwort enthält die Lösung für die LSNDSP-Instanz, die in der Anfrage übergeben wurde. Sie umfasst ein gültiges Netz von Schiffsservices und Warennachfragepfaden. Der gesamte Warenbedarf für einen Abschnitt darf die Kapazität der Schiffsklasse für diesen Streckenabschnitt nicht überschreiten. Es ist immer eine praktikable Lösung für das Design- und Planungsproblem des Linienversandnetzwerks, keine Schiffe ohne gefüllte Nachfrage zu haben.
Bei Erfolg enthält der Antworttext Daten mit der folgenden Struktur:
JSON-Darstellung |
---|
{ "requestId": string, "vesselServices": [ { object ( |
Felder | |
---|---|
requestId |
Die ID der Anfrage, mit der diese Antwort verknüpft ist. |
vesselServices[] |
Netz von Schiffstransfers. Die Gesamtzahl der verwendeten Schiffe pro Schiffsklasse darf die verfügbare Anzahl von Schiffen in dieser Klasse nicht überschreiten. |
commodityDemandPaths[] |
Liste aller Warennachfragepfade, über die positive Warennachfrage generiert wird. Beachten Sie, dass einige Nachfrage-IDs nicht angegeben werden, wenn keine Nachfrage versendet wird. Alternativ kann die Nachfrage nach Gütern teilweise gedeckt werden. Für jede Warennachfrage darf die insgesamt erfüllte Menge die Gesamtnachfrage nicht überschreiten. Schließlich hängen commodityDemandPaths von vesselServices ab (siehe Definition für CommodityDemandPath). |
SolverParameters
Parameter, die eine einzelne Lösung der LSNDSP steuern.
JSON-Darstellung |
---|
{ "timeLimit": string } |
Felder | |
---|---|
timeLimit |
Die maximale Zeit, die der Matherechner für das Problem aufwenden sollte. Dieser Wert ist kein festes Limit und berücksichtigt nicht den Kommunikationsaufwand. Die erwartete Latenz zur Lösung des Problems kann diesen Wert leicht überschreiten. Eine Dauer in Sekunden mit bis zu neun Nachkommastellen, die auf „ |
Port
Port, z.B. ein Terminal oder alle Terminals eines Ports.
JSON-Darstellung |
---|
{ "id": string, "minimumPortStayDuration": { object ( |
Felder | |
---|---|
id |
Eindeutige ID, die diesem Anschluss zugewiesen ist. |
minimumPortStayDuration |
Mindestaufenthaltsdauer für einen Portaufruf. In den meisten Studien wird davon ausgegangen, dass sie konstant sind, da größere Schiffe mit hoher Bewegungszahl in der Regel mehr Krane mit mehr Platz in Anspruch nehmen. |
minimumTransshipmentDuration |
Die Mindestdauer einer Umladung an einem bestimmten Hafen, einschließlich der Dauer für das Entladen eines Containers und das Umladen auf ein anderes Schiff. |
transshipmentCost |
Kosten für den Transport eines Containers. Dieser Betrag ist in der Regel niedriger als die Summe von Be- und Entladung, da für den Transport keine Zollpapiere am Hafen erforderlich sind. |
vesselClassCosts |
Kosten, die beim Aufrufen dieses nach Schiffsklassen-ID kartierten Hafens anfallen. Eine Schiffsklasse kann diesen Hafen nur aufrufen, wenn er in dieser Karte einen Eintrag hat. Ein Objekt, das eine Liste von |
Dauer
Die Dauer (Hafenaufenthalt/Umladung, Nachfrageverkehr) wird stündlich definiert.
JSON-Darstellung |
---|
{ "hours": string } |
Felder | |
---|---|
hours |
Anzahl der Stunden, für die die Dauer definiert wird. |
VesselCost
Die Kosten für Fahrten und Aufenthalte an diesem Hafen sind als lineare Funktion der Aufenthaltsdauer definiert (fixedCost
+ hourlyCost
× Stunden).
JSON-Darstellung |
---|
{ "fixedCost": number, "hourlyCost": number } |
Felder | |
---|---|
fixedCost |
Feste Kosten für den Aufruf dieses Ports. |
hourlyCost |
Kosten pro Stunde für den Aufenthalt an diesem Hafen. |
LegCandidate
Kandidat für Schiffsabfertigungsebene. Zwischen den beiden Häfen können mehrere Streckenabschnitte bestehen, die zum Beispiel unterschiedliche Routen und/oder Schiffsgeschwindigkeiten darstellen.
JSON-Darstellung |
---|
{
"id": string,
"departurePortId": string,
"arrivalPortId": string,
"duration": {
object ( |
Felder | |
---|---|
id |
Eindeutige ID, die diesem Beinkandidaten zugewiesen ist. |
departurePortId |
ID des Abflughafens. |
arrivalPortId |
ID des Ankunftsports. |
duration |
Dauer des Streckenabschnitts. |
vesselClassCosts |
Kosten für die Zuweisung dieses Streckenkandidats zu einer bestimmten Schiffsklasse. Dazu gehören Betriebskosten für Schiffe, Bunkerkosten und Charterkosten. Eine Schiffsklasse kann nur dann durch diesen Streckenkandidat segeln, wenn er einen Eintrag in dieser Karte hat. Ein Objekt, das eine Liste von |
VesselClass
Klasse, d.h. eine Gruppe von Schiffen mit identischen Eigenschaften. Es gibt keine Möglichkeit, zwischen zwei Gefäßen aus derselben Klasse zu unterscheiden.
JSON-Darstellung |
---|
{ "id": string, "containerCapacity": string, "vesselCount": string } |
Felder | |
---|---|
id |
Eindeutige ID, die dieser Schiffsklasse zugewiesen ist. |
containerCapacity |
Kapazität der Schiffsklasse (in Containern). |
vesselCount |
Anzahl der Schiffe in dieser Gefäßklasse. |
CommodityDemand
Warennachfrage, d.h. eine potenzielle Nachfrage, die von einem Transportunternehmen erfüllt werden muss.
JSON-Darstellung |
---|
{
"id": string,
"originPortId": string,
"destinationPortId": string,
"containerCount": string,
"freightRate": number,
"maximumTransitDuration": {
object ( |
Felder | |
---|---|
id |
Eindeutige ID, die dieser Warennachfrage zugewiesen ist. |
originPortId |
ID des Ursprungsports. |
destinationPortId |
ID des Zielports. |
containerCount |
Maximale Anzahl der Container, die erfüllt werden sollen. |
freightRate |
Frachtpreis pro Container (kann zu Strafen für nicht erfüllte Nachfrage führen) Dadurch sollten keine Kosten für das Be- und Entladen pro Container am Ausgangs- und Zielort anfallen. |
maximumTransitDuration |
Maximale Laufzeit (falls festgelegt, sollte der Wert strisch positiv sein). Die Laufzeit ist von dem Zeitpunkt definiert, an dem das erste Schiff, mit dem diese Nachfrage bedient wird, den Starthafen verlässt, bis das letzte Schiff, das diese Nachfrage bedient, den Zielhafen erreicht. |
VesselService
Schiffsservice zur Belieferung von Gütern. WICHTIG: Derzeit wird davon ausgegangen, dass die Dienste wöchentlich stattfinden und die Portaufenthaltezeit eine Woche nicht überschreiten darf. Betrachten Sie die folgende Abfolge der Streckenabschnitte des Schiffsverkehrs: vesselServiceLegs { legCandidateId: "0->1" originDepartureTime {}destinationArrivalTime { day: 3 hourOfDay: 12 } } vesselServiceLegs { legCandidateId: "1->0" origin 1->0" abseits: 1-> 0" origine 1 - 1 Abfahrtszeit {day: 4 hour } "destinationArrivalTime" {day: 4 hour } port 1
JSON-Darstellung |
---|
{
"vesselClassId": string,
"vesselServiceLegs": [
{
object ( |
Felder | |
---|---|
vesselClassId |
ID der Schiffsklasse, die den Dienst ausführt. |
vesselServiceLegs[] |
Für einen gültigen Schiffsservice gelten folgende Eigenschaften: 1. Es darf nicht leer sein. 2. Die aufeinanderfolgenden Abschnitte "destinationPortId" und "originPortId" müssen übereinstimmen (auch für den letzten und ersten Abschnitt). |
VesselServiceLeg
Ein einzelner Streckenabschnitt eines Schiffs.
JSON-Darstellung |
---|
{ "legCandidateId": string, "originDepartureTime": { object ( |
Felder | |
---|---|
legCandidateId |
Zugewiesene Etappenkandidaten-ID. |
originDepartureTime |
Abfahrtszeit am Starthafen im Wochenfahrplan. |
destinationArrivalTime |
Ankunftszeit am Zielhafen im Wochenplan. |
ScheduleTime
Eine Fahrplanzeit (Abflug/Nachfrage/Ankunft) wird wöchentlich zu einer bestimmten Stunde definiert.
JSON-Darstellung |
---|
{ "day": string, "hourOfDay": integer } |
Felder | |
---|---|
day |
Tag im Zeitplan. Tag 0 ist der erste mögliche Tag. |
hourOfDay |
Die Tageszeit der geplanten Zeit muss eine Ganzzahl zwischen 0 und 23 (jeweils einschließlich) sein. |
CommodityDemandPath
Die verschiedenen Dienste und Ports, die ein Bruchteil einer bestimmten Güternachfrage nutzt. Die unten verwendeten Indizes basieren auf der Reihenfolge der Fahrten in der Antwort und den Streckenabschnitten der einzelnen Schiffe.
JSON-Darstellung |
---|
{
"commodityDemandId": string,
"containerCount": string,
"vesselServiceLegIds": [
{
object ( |
Felder | |
---|---|
commodityDemandId |
Nachfrage-ID der Waren erfüllt. |
containerCount |
Anzahl der Container, die diesen Pfad durchlaufen. Für jede Warennachfrage darf die insgesamt erfüllte Menge die Gesamtnachfrage nicht überschreiten. |
vesselServiceLegIds[] |
Liste der Teilstrecken-IDs für Schiffe, die über diesen Pfad verwendet werden. Für einen gültigen Pfad für die Warennachfrage sind folgende Properties verfügbar: 1. Die AbfahrtPortId des ersten Abschnitts muss mit der originPortId der Warennachfrage übereinstimmen. 2. „destinationPortId“ des letzten Abschnitts muss mit „destinationPortId“ der Warennachfrage übereinstimmen. 3. Die aufeinanderfolgenden Streckenabschnitte müssen übereinstimmen. 4. Wenn für diese Warennachfrage angegeben wird, muss die maximale Laufzeit größer oder gleich der Gesamtdauer des Pfads sein. |
VesselServiceLegId
Serviceabschnitt eines einzelnen Schiffs, der in einem Waren-Nachfragepfad verwendet wird. Ein Beispiel: Es gibt zwei Anlegestellen für Wasserfahrzeuge. Das erste besteht aus drei Abschnitten (indexiert 0, 1 und 2) und den zweiten beiden (indexiert 0 und 1). Außerdem kommt der erste Abschnitt der ersten Strecke am Abflughafen des zweiten Abschnitts an. Ein Warenpfad bestehend aus den drei folgenden Streckenabschnitt-IDs für Schiffe: {vesselServiceIndex: 0, vesselServiceLegIndex: 2} {vesselServiceIndex: 0, vesselServiceLegIndex: 0} {vesselServiceIndex: 1, vesselServiceLegIndex: 1} bedeutet, dass Container für 2 aufeinanderfolgende Schiffe vom ersten Schiff zu einem einzelnen Schiff fahren.
JSON-Darstellung |
---|
{ "vesselServiceIndex": integer, "vesselServiceLegIndex": integer } |
Felder | |
---|---|
vesselServiceIndex |
Index des Schiffsverkehrs. |
vesselServiceLegIndex |
Index des Streckenabschnitts des Schiffsdienstes, indexiert durch |