Method: shipping.designShippingNetwork

Rozwiązuje problem związany z projektowaniem i planowaniem sieci przesyłek liniowych (LSNDSP) na podstawie danych DesignShippingNetworkRequest.

LSNDSP to złożony problem optymalizacyjny, który ma na celu znalezienie optymalnego projektu i planowania sieci wysyłkowej linii transportu publicznego. Celem jest zminimalizowanie całkowitego kosztu obsługi sieci przy jednoczesnym zaspokojeniu jak największego zapotrzebowania na ładunek między portami.

LSNDSP można podzielić na 2 główne podproblemy: projektowanie sieci i harmonogramy. Podproblem projektowania sieci określa zestaw portów, które będzie obsługiwać sieć, liczbę statków do rozmieszczenia na każdej trasie oraz trasy, które statki będą przebieżeć. Podproblem planowania określa harmonogramy żeglowania statków, biorąc pod uwagę czas potrzebny na przeprawę między portami, czas załadunku i rozładunku ładunku oraz zapotrzebowanie na transport ładunku między portami.

Mówiąc najprościej, LSNDSP polega na wyborze portów do obsługi i liczbie statków do użycia oraz zaplanowaniu statków w taki sposób, aby zminimalizować koszty obsługi sieci przy jednoczesnej maksymalizacji przychodów z zaspokajania popytu na ładunek. Wymagającym podkomponentem LSNDSP jest kierowanie ładunków, które określa, jakie zapotrzebowanie należy spełnić i które trasy kierować do ładunku w celu zmaksymalizowania przychodów.

Żądanie HTTP

POST https://optimization.googleapis.com/v1/shipping:designShippingNetwork

Adres URL używa składni transkodowania gRPC.

Treść żądania

Treść żądania zawiera dane o następującej strukturze:

Zapis JSON
{
  "requestId": string,
  "solverParameters": {
    object (SolverParameters)
  },
  "ports": [
    {
      object (Port)
    }
  ],
  "legCandidates": [
    {
      object (LegCandidate)
    }
  ],
  "vesselClasses": [
    {
      object (VesselClass)
    }
  ],
  "commodityDemands": [
    {
      object (CommodityDemand)
    }
  ],
  "vesselServices": [
    {
      object (VesselService)
    }
  ]
}
Pola
requestId

string

Identyfikator problemu lub prośby.

solverParameters

object (SolverParameters)

Parametry rozwiązania.

ports[]

object (Port)

Lista możliwych portów, które można wywoływać w usługach statku. Żądanie może zawierać tylko identyfikatory portów, które znajdują się na tej liście.

legCandidates[]

object (LegCandidate)

Lista potencjalnych kandydatów na nogi, które można dodać do usług na statku. Żądanie może zawierać tylko identyfikatory kandydatów nog, które znajdują się na tej liście.

vesselClasses[]

object (VesselClass)

Lista klas statków do świadczenia usług statków. Pamiętaj, że wszystkie statki tej samej klasy są całkowicie wymienne. Żądanie może zawierać tylko identyfikatory klas statków, które znajdują się na tej liście.

commodityDemands[]

object (CommodityDemand)

Lista potencjalnych towarów (tj. kontenerowych) do zaspokojenia przez statki.

vesselServices[]

object (VesselService)

Jako punkt początkowy do optymalizacji można wskazać sieć prawidłowych usług statków (zwykle w obecnym stanie sieci).

Treść odpowiedzi

Odpowiedź zawiera rozwiązanie dla instancji LSNDSP przekazanej w żądaniu. Zawiera prawidłową sieć usług statków i ścieżek popytu. Całkowity popyt na towary przez każdy etap nie może przekraczać pojemności klasy statku obsługującego ten etap. Pamiętaj, że brak obsługi statków, które nie zostały zrealizowane, jest zawsze dobrym rozwiązaniem problemu z projektowaniem i planowaniem sieci przesyłek liniowych.

W przypadku powodzenia treść żądania zawiera dane o następującej strukturze:

Zapis JSON
{
  "requestId": string,
  "vesselServices": [
    {
      object (VesselService)
    }
  ],
  "commodityDemandPaths": [
    {
      object (CommodityDemandPath)
    }
  ]
}
Pola
requestId

string

Identyfikator żądania, z którym jest powiązana ta odpowiedź.

vesselServices[]

object (VesselService)

Sieć statków. Łączna liczba wykorzystanych statków w poszczególnych klasach nie może przekraczać wartości dostępnej dla danej klasy.

commodityDemandPaths[]

object (CommodityDemandPath)

Lista wszystkich ścieżek popytu, którymi jest realizowany dodatni popyt na towary. Pamiętaj, że niektóre identyfikatory popytu na towary mogą nie zostać uwzględnione, jeśli żadne zapotrzebowanie nie zostało wysłane. Popyt na towary może również być częściowo zaspokajany. W przypadku każdego popytu na towary łączna zrealizowana ilość nie może przekroczyć całkowitego popytu. Natomiast wartości commodityDemandPath zależą od wartości vesselServices (patrz definicja CommodityDemandPath).

SolverParameters

Parametry sterujące jednokrotnym rozwiązaniem LSNDSP.

Zapis JSON
{
  "timeLimit": string
}
Pola
timeLimit

string (Duration format)

Maksymalny czas, który musi poświęcić na rozwiązanie problemu. Ta wartość nie jest sztywnym limitem i nie uwzględnia nakładów związanych z komunikacją. Przewidywany czas oczekiwania na rozwiązanie problemu może nieznacznie przekroczyć tę wartość.

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

Port

Port, np. lub wszystkich złączy portu.

Zapis JSON
{
  "id": string,
  "minimumPortStayDuration": {
    object (Duration)
  },
  "minimumTransshipmentDuration": {
    object (Duration)
  },
  "transshipmentCost": number,
  "vesselClassCosts": {
    string: {
      object (VesselCost)
    },
    ...
  }
}
Pola
id

string

Unikalny identyfikator przypisany do tego gniazda.

minimumPortStayDuration

object (Duration)

Minimalny czas pobytu związany z przeniesieniem. Większość badań zakłada, że mają one stałą wartość, ponieważ porty zwykle przypisują więcej dźwigów do większych statków o dużej liczbie ruchów, ponieważ zajmują one więcej miejsca.

minimumTransshipmentDuration

object (Duration)

Minimalny czas przeładunku w danym porcie, w tym czas potrzebny na wyładowywanie kontenera i przeładowywanie go na inny statek.

transshipmentCost

number

Koszt transportu kontenera. Zwykle będzie ona niższa niż suma załadunku i rozładunku, ponieważ transakcja nie wymaga dokumentów celnych w porcie.

vesselClassCosts

map (key: string, value: object (VesselCost))

Koszty związane z wywołaniem tego portu zmapowanego za pomocą identyfikatora klasy statku. Klasa statku może wywołać ten port tylko wtedy, gdy ma wpis na tej mapie.

Obiekt zawierający listę par "key": value. Przykład: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

Czas trwania

Czas trwania (nocleg w porcie/transport, transport na żądanie) jest określany z dokładnością godzinową.

Zapis JSON
{
  "hours": string
}
Pola
hours

string (int64 format)

Liczba godzin określająca czas trwania.

VesselCost

Koszt statku za wywołanie i pozostawanie w tym porcie jest określony jako funkcja liniowa czasu pobytu (fixedCost + hourlyCost * godz.).

Zapis JSON
{
  "fixedCost": number,
  "hourlyCost": number
}
Pola
fixedCost

number

Stały koszt wywoływania tego gniazda.

hourlyCost

number

Koszt godzinowy za pobyt w tym porcie.

LegCandidate

Propozycja odcinka obsługi statku. Między tymi samymi 2 portami może być kilka kandydatów na nogi, np. reprezentują różne trasy oceaniczne i/lub prędkości statków.

Zapis JSON
{
  "id": string,
  "departurePortId": string,
  "arrivalPortId": string,
  "duration": {
    object (Duration)
  },
  "vesselClassCosts": {
    string: number,
    ...
  }
}
Pola
id

string

Unikalny identyfikator przypisany do tego odcinka.

departurePortId

string

Identyfikator portu wylotu.

arrivalPortId

string

Identyfikator portu przylotu.

duration

object (Duration)

Czas trwania noga.

vesselClassCosts

map (key: string, value: number)

Koszt przypisania tego odcinka do określonej klasy statku. Mogą to być koszty operacyjne statku, Bunkerów i czarteru. Klasa okrętu może przepłynąć ten kandydujący odcinek statku tylko wtedy, gdy ma on wpis na tej mapie.

Obiekt zawierający listę par "key": value. Przykład: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

VesselClass

Klasa statku, czyli grupa statków o tych samych nieruchomościach. Nie da się rozróżnić 2 statków tej samej klasy.

Zapis JSON
{
  "id": string,
  "containerCapacity": string,
  "vesselCount": string
}
Pola
id

string

Unikalny identyfikator przypisany do tej klasy statku.

containerCapacity

string (int64 format)

Pojemność klasy statku (w kontenerach).

vesselCount

string (int64 format)

Liczba statków w tej klasie statków.

CommodityDemand

Popyt na towary, tj. potencjalne zapotrzebowanie na zaspokojenie przez spedytora.

Zapis JSON
{
  "id": string,
  "originPortId": string,
  "destinationPortId": string,
  "containerCount": string,
  "freightRate": number,
  "maximumTransitDuration": {
    object (Duration)
  }
}
Pola
id

string

Unikalny identyfikator przypisany do tego popytu na towary.

originPortId

string

Identyfikator portu źródłowego.

destinationPortId

string

Identyfikator portu docelowego.

containerCount

string (int64 format)

Maksymalna liczba kontenerów do wypełnienia.

freightRate

number

Stawka przewozu na kontener (która może obejmować karę za niewypełniony popyt). Powinno zmniejszyć koszty ładowania i rozładowywania kontenera w miejscu początkowym i docelowym.

maximumTransitDuration

object (Duration)

Maksymalny czas przewozu (jeśli jest ustawiony, powinien być wartością dodatnią). Czas przewozu jest definiowany od chwili, gdy pierwszy statek obsługujący to żądanie opuści port początkowy do momentu przybycia do portu docelowego ostatniego statku obsługującego to żądanie.

VesselService

Sprzedaż statków, które mogą być wykorzystywane do realizacji zapotrzebowania na towary. WAŻNE: obecnie zakładamy, że usługi są świadczone z częstotliwością tygodniową, a czas pobytu na port nie może przekraczać tygodnia. Rozważmy następującą sekwencję etapów obsługi statku: vesselServiceLegs { legCandidateId: "0->1" originDepartureTime {} destinationArrivalTime { day: 3 hourOfDay: 12 } } vesselServiceLegs { legCandidateId: "1->0" originDepartureTime { dzień: 4 } destinationArrivalTime { dzień: 7 hourOfDay: 12 } } Te etapy wyznaczają tygodniowe linie usługowe przebiegające przez dwa porty, przy których czas pobytu na oba porty wynosi 12 godzin.

Zapis JSON
{
  "vesselClassId": string,
  "vesselServiceLegs": [
    {
      object (VesselServiceLeg)
    }
  ]
}
Pola
vesselClassId

string

Identyfikator klasy statku wykonującego usługę.

vesselServiceLegs[]

object (VesselServiceLeg)

Aby zapewnić odpowiednią usługę na statku, wymagane są następujące właściwości: 1. Pole nie może być puste. 2. Kolejne nogi Identyfikator destinationPortId i originPortId muszą być takie same (łącznie z ostatnim i pierwszym etapem).

VesselServiceLeg

Jeden odcinek statku.

Zapis JSON
{
  "legCandidateId": string,
  "originDepartureTime": {
    object (ScheduleTime)
  },
  "destinationArrivalTime": {
    object (ScheduleTime)
  }
}
Pola
legCandidateId

string

Identyfikator kandydata przypisanego nogi.

originDepartureTime

object (ScheduleTime)

Godzina odjazdu z portu początkowego zgodnie z tygodniowym harmonogramem.

destinationArrivalTime

object (ScheduleTime)

Godzina przybycia do portu docelowego zgodnie z tygodniowym harmonogramem.

ScheduleTime

Harmonogram (odloty/odloty/przyloty statków/na żądanie) jest zdefiniowany z częstotliwością tygodniową o określonej godzinie.

Zapis JSON
{
  "day": string,
  "hourOfDay": integer
}
Pola
day

string (int64 format)

Dzień w harmonogramie. Dzień 0 jest pierwszym możliwym dniem.

hourOfDay

integer

Godzina dnia harmonogramu powinna być liczbą całkowitą z zakresu od 0 do 23 włącznie.

CommodityDemandPath

Różne usługi i porty dostępne w przypadku części zapotrzebowania na dany towar. Indeksy używane poniżej są oparte na kolejności usług statków zgłaszanych w odpowiedzi na zgłoszenie i kolejności etapów obsługi poszczególnych statków.

Zapis JSON
{
  "commodityDemandId": string,
  "containerCount": string,
  "vesselServiceLegIds": [
    {
      object (VesselServiceLegId)
    }
  ]
}
Pola
commodityDemandId

string

Zrealizowano identyfikator popytu na towary.

containerCount

string (int64 format)

Liczba kontenerów przechodzących tę ścieżkę. W przypadku każdego popytu na towary łączna zrealizowana ilość nie może przekroczyć całkowitego popytu.

vesselServiceLegIds[]

object (VesselServiceLegId)

Lista identyfikatorów odcinków statku przebytych tą ścieżką. W przypadku prawidłowej ścieżki popytu na towary dostępne są te właściwości: 1. Wartość ExitPortId pierwszego etapu musi być zgodna z identyfikatorem originPortId popytu na towary. 2. Wartość parametru destinationPortId ostatniego etapu musi być zgodna z identyfikatorem atrybutu destinationPortId popytu na towary. 3. Kolejne nogi Identyfikator portu przylotu i identyfikator portu wyjazdu musi być taki sam. 4. Jeśli został podany w przypadku tego popytu na towary, maksymalny czas przewozu powinien być większy lub równy łączny czas trwania ścieżki.

VesselServiceLegId

Jeden odcinek statku używany na ścieżce popytu na towary. Weźmy na przykład 2 usługi pływające. Pierwsza składa się z trzech części (zindeksowana 0, 1 i 2), a druga z dwóch (zindeksowana 0 i 1). Dodatkowo pierwszy etap pierwszej usługi dociera do portu wylotu drugiego etapu drugiej usługi. Ścieżka towarowa składająca się z trzech następujących identyfikatorów etapów obsługi statku: {vesselServiceIndex: 0, vesselServiceLegIndex: 2} {vesselServiceIndex: 0, vesselServiceLegIndex: 0} {vesselServiceIndex: 1, vesselServiceIndex: 1} oznacza, że od jednego cyklu usługi do jednego statku ciągnie się 2 kolejnymi cyklami transportu (od 2 kolejnych etapów statku)

Zapis JSON
{
  "vesselServiceIndex": integer,
  "vesselServiceLegIndex": integer
}
Pola
vesselServiceIndex

integer

Indeks usługi statku.

vesselServiceLegIndex

integer

Indeks odcinka usługi statku zindeksowany przez vesselServiceIndex.