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 ( |
Pola | |
---|---|
requestId |
Identyfikator problemu lub prośby. |
solverParameters |
Parametry rozwiązania. |
ports[] |
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[] |
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[] |
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[] |
Lista potencjalnych towarów (tj. kontenerowych) do zaspokojenia przez statki. |
vesselServices[] |
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 ( |
Pola | |
---|---|
requestId |
Identyfikator żądania, z którym jest powiązana ta odpowiedź. |
vesselServices[] |
Sieć statków. Łączna liczba wykorzystanych statków w poszczególnych klasach nie może przekraczać wartości dostępnej dla danej klasy. |
commodityDemandPaths[] |
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 |
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ą „ |
Port
Port, np. lub wszystkich złączy portu.
Zapis JSON |
---|
{ "id": string, "minimumPortStayDuration": { object ( |
Pola | |
---|---|
id |
Unikalny identyfikator przypisany do tego gniazda. |
minimumPortStayDuration |
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 |
Minimalny czas przeładunku w danym porcie, w tym czas potrzebny na wyładowywanie kontenera i przeładowywanie go na inny statek. |
transshipmentCost |
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 |
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 |
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 |
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 |
Stały koszt wywoływania tego gniazda. |
hourlyCost |
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 ( |
Pola | |
---|---|
id |
Unikalny identyfikator przypisany do tego odcinka. |
departurePortId |
Identyfikator portu wylotu. |
arrivalPortId |
Identyfikator portu przylotu. |
duration |
Czas trwania noga. |
vesselClassCosts |
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 |
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 |
Unikalny identyfikator przypisany do tej klasy statku. |
containerCapacity |
Pojemność klasy statku (w kontenerach). |
vesselCount |
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 ( |
Pola | |
---|---|
id |
Unikalny identyfikator przypisany do tego popytu na towary. |
originPortId |
Identyfikator portu źródłowego. |
destinationPortId |
Identyfikator portu docelowego. |
containerCount |
Maksymalna liczba kontenerów do wypełnienia. |
freightRate |
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 |
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 ( |
Pola | |
---|---|
vesselClassId |
Identyfikator klasy statku wykonującego usługę. |
vesselServiceLegs[] |
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 ( |
Pola | |
---|---|
legCandidateId |
Identyfikator kandydata przypisanego nogi. |
originDepartureTime |
Godzina odjazdu z portu początkowego zgodnie z tygodniowym harmonogramem. |
destinationArrivalTime |
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 |
Dzień w harmonogramie. Dzień 0 jest pierwszym możliwym dniem. |
hourOfDay |
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 ( |
Pola | |
---|---|
commodityDemandId |
Zrealizowano identyfikator popytu na towary. |
containerCount |
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[] |
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 |
Indeks usługi statku. |
vesselServiceLegIndex |
Indeks odcinka usługi statku zindeksowany przez |