Löst das Problem bezüglich des Entwurfs und der Planung des Liner Shipping Network (LSNDSP) anhand der angegebenen DesignShippingNetworkRequest
.
Das LSNDSP ist ein komplexes Optimierungsproblem, das darauf abzielt, das optimale Design und die optimale Planung für ein Linienschiffnetzwerk zu finden. Ziel ist es, die Gesamtkosten für den Betrieb des Netzes zu minimieren und gleichzeitig den Frachtbedarf zwischen den Häfen so weit wie möglich zu decken.
Das LSNDSP kann in zwei Hauptunterprobleme unterteilt werden: Netzwerkdesign und Planung. Das Teilproblem beim Netzwerkdesign bestimmt die Gruppe der Ports, die vom Netzwerk bedient werden, die Anzahl der auf jeder Route zu setzenden Schiffe und die Routen, die die Schiffe nehmen werden. Durch das Teilproblem werden die Fahrpläne für die Schiffe festgelegt. Dabei werden die Fahrtzeit zwischen den Häfen, die Zeit zum Be- und Entladen der Fracht sowie die Nachfrage nach Gütertransport zwischen den Häfen berücksichtigt.
Mit einfachen Worten: Bei der LSNDSP geht es darum, zu entscheiden, welche Ports bedient werden, wie viele Schiffe zu nutzen sind und wie die Schiffe geplant werden, damit die Betriebskosten minimiert und gleichzeitig der Umsatz für die Befriedigung der Frachtnachfrage maximiert wird. Eine schwierige Unterkomponente des LSNDSP ist die Frachtroute. Sie bestimmt, welche Anforderungen erfüllt und welche Routen der Fracht zugewiesen werden müssen, 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 Ports, die in Schiffsdiensten aufgerufen werden können. Die Anfrage darf nur Port-IDs aus dieser Liste enthalten. |
legCandidates[] |
Liste der möglichen Streckenabschnitte, die in den Schiffsverkehr aufgenommen werden können. Die Anfrage darf nur Streckenkandidat-IDs enthalten, die in dieser Liste enthalten sind. |
vesselClasses[] |
Liste der Schiffsklassen, die Dienstleistungen für Schiffe ausführen Beachte, dass alle Schiffe derselben Klasse vollständig austauschbar sind. Die Anfrage darf nur Schiffsklassen-IDs enthalten, die in dieser Liste enthalten sind. |
commodityDemands[] |
Liste der potenziellen Güteranforderungen (z.B. Containeranforderungen), die von Schiffsdiensten gedeckt werden müssen. |
vesselServices[] |
Es kann ein Netzwerk gültiger Schiffsdienste (in der Regel der aktuelle Status des Netzwerks) als Ausgangspunkt für die Optimierung bereitgestellt werden. |
Antworttext
Die Antwort enthält die Lösung für die in der Anfrage übergebene LSNDSP-Instanz. Sie umfasst ein gültiges Netz aus Schiffsdiensten und Güternachfragepfaden. Die gesamte Güternachfrage durch die einzelnen Streckenabschnitte darf die Kapazität der Schiffsklasse, die diesen Streckenabschnitt bedient, nicht überschreiten. Es ist immer eine praktikable Lösung für das Design und die Planung von Linienversandnetzen, wenn keine Schiffsdienste ohne gedeckte Nachfrage verfügbar sind.
Bei Erfolg enthält der Antworttext Daten mit der folgenden Struktur:
JSON-Darstellung |
---|
{ "requestId": string, "vesselServices": [ { object ( |
Felder | |
---|---|
requestId |
Die ID der Anfrage, der diese Antwort zugeordnet ist. |
vesselServices[] |
Netzwerk von Schiffsdiensten Die Gesamtzahl der verwendeten Schiffe darf die für diese Klasse verfügbare Anzahl nicht überschreiten. |
commodityDemandPaths[] |
Liste aller Warennachfragepfade, über die die positive Warennachfrage versendet wird. Beachten Sie, dass einige Nachfrage-IDs für Waren möglicherweise nicht enthalten sind, wenn keine Nachfrage versendet wird. Alternativ kann eine Warennachfrage teilweise gedeckt werden. Für jede Warenachfrage darf die gesamte erfüllte Menge die Gesamtnachfrage nicht übersteigen. Schließlich hängen commodityDemandPaths von vesselServices ab (siehe CommodityDemandPath-Definition). |
SolverParameters
Parameter, die eine einzelne Lösung des LSNDSP steuern.
JSON-Darstellung |
---|
{ "timeLimit": string } |
Felder | |
---|---|
timeLimit |
Maximale Zeit, die der Rechner mit der Aufgabe verbringen sollte. Dieser Wert ist kein fester Grenzwert und berücksichtigt nicht den Kommunikationsaufwand. Die erwartete Latenz zur Behebung des Problems kann diesen Wert geringfügig überschreiten. Die Dauer in Sekunden mit bis zu neun Nachkommastellen und am Ende mit " |
Port
Port, z.B. oder alle Anschlüsse 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 von einem konstanten Wert ausgegangen, da in den Häfen größeren Schiffen mit hoher Bewegungsanzahl in der Regel mehr Kräne zugewiesen werden, da diese mehr Platz beanspruchen. |
minimumTransshipmentDuration |
Mindestdauer eines Umschlags an einem bestimmten Hafen, einschließlich der Dauer, um einen Container zu entladen und in ein anderes Schiff aufzuladen. |
transshipmentCost |
Kosten für das Transshipping eines Containers. Dieser ist in der Regel niedriger als die Summe von Be- und Entladung, da für den Transportvorgang keine Zolldokumente am Hafen erforderlich sind. |
vesselClassCosts |
Kosten, die beim Aufrufen dieses Ports anfallen, der nach der Schiffsklassen-ID zugeordnet ist. Eine Schiffsklasse kann diesen Port nur aufrufen, wenn sie einen Eintrag in dieser Karte hat. Ein Objekt, das eine Liste von |
Dauer
Eine Dauer (Portaufenthalt/Transport, Nachfrageverkehr) wird auf stündlicher Ebene definiert.
JSON-Darstellung |
---|
{ "hours": string } |
Felder | |
---|---|
hours |
Anzahl der Stunden, durch die die Dauer definiert wird. |
VesselCost
Die Schiffskosten für den Aufruf und den Aufenthalt an diesem Anschluss sind als lineare Funktion der Aufenthaltsdauer (fixedCost
+ hourlyCost
* Stunden) definiert.
JSON-Darstellung |
---|
{ "fixedCost": number, "hourlyCost": number } |
Felder | |
---|---|
fixedCost |
Feste Kosten für das Aufrufen dieses Anschlusses. |
hourlyCost |
Kosten pro Stunde für den Aufenthalt an diesem Anschluss. |
LegCandidate
Kandidaten für Serviceabschnitte. Zwischen denselben Ports können mehrere Etappenkandidaten vorhanden sein, z.B. für verschiedene Meeresrouten und/oder Schiffsgeschwindigkeiten.
JSON-Darstellung |
---|
{
"id": string,
"departurePortId": string,
"arrivalPortId": string,
"duration": {
object ( |
Felder | |
---|---|
id |
Eindeutige ID, die diesem Streckenabschnitt zugewiesen ist. |
departurePortId |
ID des Abreisehafens. |
arrivalPortId |
ID des Ankunftshafens. |
duration |
Dauer des Abschnitts. |
vesselClassCosts |
Kosten für die Zuweisung dieses Streckenkandidats zu einer bestimmten Schiffsklasse. Dazu können die Betriebskosten der Schiffe, die Bunkerkosten und die Charterkosten gehören. Eine Schiffsklasse kann nur dann durch diesen Streckenabschnitt segeln, wenn es einen Eintrag in dieser Karte gibt. Ein Objekt, das eine Liste von |
VesselClass
Schiffsklasse, d.h. eine Gruppe von Schiffen mit denselben Eigenschaften. Es gibt keine Möglichkeit, zwischen zwei Gefäßen 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 Schiffsklasse. |
CommodityDemand
Warennachfrage, d.h. eine potenzielle Nachfrage, die von einem Versandunternehmen gedeckt werden soll.
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 von Containern, die erfüllt werden sollen. |
freightRate |
Frachtpreis pro Container (kann eine Strafe für nicht erfüllte Nachfrage enthalten). Die Kosten für das Verladen und Entladen pro Container am Start- und Zielort sollten entfallen. |
maximumTransitDuration |
Maximale Transitdauer (falls festgelegt, sollte stark positiv sein). Die Laufzeit wird definiert von dem Zeitpunkt, an dem das erste für diese Anforderung bediente Boot den Starthafen verlässt, bis zu dem Zeitpunkt, an dem das letzte Schiff, das diese Anforderung bedient, am Zielhafen ankommt. |
VesselService
Schiffsverkehr, der zur Befriedigung der Ware genutzt werden kann. WICHTIG: Derzeit wird davon ausgegangen, dass die Dienste wöchentlich stattfinden und die Portaufenthaltszeiten eine Woche nicht überschreiten. Sehen Sie sich die folgende Abfolge von Serviceabschnitten an: vesselServiceLegs { legCandidateId: "0->1" originDepartureTime {} destinationArrivalTime { day: 3 hourOfDay: 12 } } vesselServiceLegs { legCandidateId: "1->0" originDepartureTime { day: 4 } destinationArrivalTime { day: 7 hourOfDay: 12 } } Diese Streckenabschnitte definieren eine einwöchige Linien, die durch zwei Häfen verlaufen, wobei beide Ports jeweils 12 Stunden halten.
JSON-Darstellung |
---|
{
"vesselClassId": string,
"vesselServiceLegs": [
{
object ( |
Felder | |
---|---|
vesselClassId |
ID der Schiffsklasse, die den Dienst ausführt. |
vesselServiceLegs[] |
Für einen gültigen Schiffsverkehr gelten folgende Eigenschaften: 1. Das Feld darf nicht leer sein. 2. Aufeinanderfolgende Beine „destinationPortId“ und „originPortId“ müssen übereinstimmen (auch für den letzten und den ersten Abschnitt). |
VesselServiceLeg
Ein einzelner Abschnitt eines Schiffsverkehrs.
JSON-Darstellung |
---|
{ "legCandidateId": string, "originDepartureTime": { object ( |
Felder | |
---|---|
legCandidateId |
Zugewiesene Streckenkandidaten-ID. |
originDepartureTime |
Abfahrtszeit am Starthafen im Wochenfahrplan. |
destinationArrivalTime |
Zeitpunkt der Ankunft am Zielhafen im Wochenfahrplan. |
ScheduleTime
Eine Fahrplanzeit (Abfahrt/Ankunft des Schiffes/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 sein. |
CommodityDemandPath
Die verschiedenen Dienste und Ports, die ein Bruchteil einer bestimmten Rohstoffnachfrage beansprucht. Die unten verwendeten Indizes basieren auf der Reihenfolge der Dienstabschnitte in der Antwort und der einzelnen Serviceabschnitte auf den einzelnen Schiffen.
JSON-Darstellung |
---|
{
"commodityDemandId": string,
"containerCount": string,
"vesselServiceLegIds": [
{
object ( |
Felder | |
---|---|
commodityDemandId |
Warennachfrage-ID erfüllt. |
containerCount |
Anzahl der Container, die diesen Pfad durchlaufen. Für jede Warenachfrage darf die gesamte erfüllte Menge die Gesamtnachfrage nicht übersteigen. |
vesselServiceLegIds[] |
Liste der Routen-IDs für Schiffsdienste, die über diesen Pfad genommen wurden. Für einen gültigen Pfad für die Rohstoffnachfrage gelten folgende Properties: 1. Die departurePortId des ersten Abschnitts muss mit der originPortId der Warennachfrage übereinstimmen. 2. Die "destinationPortId" des letzten Abschnitts muss mit der "destinationPortId" der Warennachfrage übereinstimmen. 3. Aufeinanderfolgende Beine „AnkunftPortID“ und „AbflugportID“ müssen übereinstimmen. 4. Wenn für diese Warennachfrage angegeben, sollte die maximale Laufzeit größer oder gleich der Gesamtdauer des Pfads sein. |
VesselServiceLegId
Serviceabschnitt eines einzelnen Schiffs, der in einem Warennachfragepfad verwendet wird. Angenommen, es gibt zwei Schiffsdienste. Der erste besteht aus drei Beinen (indexiert 0, 1 und 2) und den zweiten beiden (indexiert 0 und 1). Außerdem kommt der erste Abschnitt des ersten Streckenabschnitts am Starthafen des zweiten Abschnitts an. Ein Warenkorbpfad besteht aus den drei folgenden Service-Strecken-IDs von Schiffen: {vesselServiceIndex: 0, vesselServiceLegIndex: 2} {vesselServiceIndex: 0, vesselServiceLegIndex: 0} {vesselServiceIndex: 1, vesselServiceLegIndex: 1} bedeutet, dass zwischen zwei aufeinanderfolgenden Schiffen zwischen einem Schiff und einem Schiff vom ersten Schiff und jeweils einem Schiff ein Zwischenschiff und jeweils ein Schiff von einem Schiff zu einem Schiff besteht
JSON-Darstellung |
---|
{ "vesselServiceIndex": integer, "vesselServiceLegIndex": integer } |
Felder | |
---|---|
vesselServiceIndex |
Index des Schiffsverkehrs. |
vesselServiceLegIndex |
Index des Abschnitts des Schiffsverkehrs, indexiert durch |