Wyślij pierwsze żądanie optymalizacji trasy

Deweloperzy z Europejskiego Obszaru Gospodarczego (EOG)

Z tego dokumentu dowiesz się, jak wysłać pierwsze żądanie do interfejsu Route Optimization API na podstawie rzeczywistego scenariusza użycia.

Dla uproszczenia w przykładzie używamy protokołu HTTP i formatu JSON, aby zademonstrować interfejs REST API. W środowisku produkcyjnym zalecamy jednak używanie protokołu gRPC ze względu na jego zalety w zakresie wydajności. gRPC wymaga jednak instalacji. Więcej informacji znajdziesz w artykule Biblioteki klienta interfejsu Route Optimization API.

Scenariusz

Mapa San Francisco z pinezkami oznaczającymi wieżę Coit Tower, park Mission Dolores i plac zabaw South Sunset

Prowadzisz w San Francisco przedszkole dla psów, które jest otwarte od 7:00 do 19:00. Dziś rano musisz odebrać 2 psy z różnych lokalizacji w mieście. Obaj właściciele psów podali przedział czasu odbioru od 7:30 do 9:30.

Masz do dyspozycji 1 furgonetkę, a kierowcy płacisz 27 dolarów za godzinę. Kierowca i furgonetka zaczynają dzień w Twoim przedszkolu o 7:00 i muszą wrócić z porannych odbiorów do 12:00, aby zrobić sobie przerwę na lunch.

Dziś jest 13 lutego 2024 r., a kierowca ma do wykonania te zadania:

  • Odebrać berneńskiego psa pasterskiego w pobliżu Coit Tower.
  • Odebrać chihuahua w parku South Sunset Playground.
  • Odwieźć oba psy do przedszkola w parku Mission Dolores.

Potrzebujesz trasy, która zminimalizuje czas spędzony przez psy w furgonetce, a jednocześnie spełni wymagania dotyczące odbioru i wysiadki.

Zanim zaczniesz

Aby uruchomić kod w tym przykładowym scenariuszu, musisz najpierw wykonać instrukcje opisane w Konfigurowanie interfejsu Route Optimization API.

1. Wybierz metodę optymalizacji trasy

Interfejs Route Optimization API ma kilka metod, które możesz wybrać w zależności od złożoności problemu optymalizacji.

Ponieważ ten scenariusz przedszkola dla psów jest małym i prostym żądaniem, użyj metody blokującej, takiej jak optimizeTours, która szybko dostarcza wyniki w przypadku małych żądań. Więcej informacji o metodach interfejsu Route Optimization API znajdziesz w artykule Synchroniczne i asynchroniczne punkty końcowe.

Aby wysłać żądanie HTTP POST do optimizeTours metody, użyj tego adresu URL:

https://routeoptimization.googleapis.com/v1/projects/PROJECT_OR_ID:optimizeTours

Musisz też ustawić krótkie wartości limitu czasu i terminu, aby skrócić niepotrzebny czas oczekiwania. W tym scenariuszu przedszkola dla psów optymalizator nie potrzebuje dużo czasu na odpowiedź na Twoje żądanie, więc użyj tych ustawień:

  • Ustaw parametr timeout na 2 sekundy.
  • Pozostaw ustawienia terminu na wartości domyślne, czyli 60 sekund w przypadku żądań REST.

2. Utwórz treść wiadomości z żądaniem

Po wybraniu metody blokującej optimizeTours i zdefiniowaniu ustawień limitu czasu oraz terminu następnym krokiem jest utworzenie treści wiadomości z żądaniem.

W tym scenariuszu żądanie jest wiadomością OptimizeToursRequest zakodowaną jako JSON w interfejsie REST API.

Aby utworzyć wiadomość z żądaniem, wykonaj te czynności:

  1. Zacznij od podstawowej struktury żądania, która wygląda tak:

    {
      "timeout": ...,
      "model": {
        "shipments": [...],
        "vehicles": [...],
        "globalStartTime": "...",
        "globalEndTime": "..."
      }
    }
    

    Więcej informacji o strukturze znajdziesz w przewodniku po kluczowych pojęciach dotyczącym podstawowej struktury (ShipmentModel, Shipment i Vehicle).

  2. Zdefiniuj dostawy. W polu shipments dodaj wiadomość Shipment dla każdego psa, który ma zostać odebrany i odwieziony rano. W tym miejscu określasz preferowaną lokalizację i czas odbioru każdego właściciela psa oraz lokalizację i czas odwiezienia psów do przedszkola.

    1. W przypadku każdego psa utwórz VisitRequest na potrzeby odbioru i kolejny na potrzeby dostawy, który w tym scenariuszu jest określany jako odwiezienie do przedszkola.

      • W przypadku odbioru ustaw arrivalWaypoint na lokalizację odbioru psa (Coit Tower w przypadku berneńskiego psa pasterskiego lub South Sunset Playground Park w przypadku chihuahua) oraz timeWindows na czas odbioru wskazany przez właściciela (od 7:30 do 9:30).

      • W przypadku dostawy ustaw arrivalWaypoint na przedszkole, a timeWindows na wymagany czas odwiezienia (od 9:30 do 11:30).

      Więcej informacji o przedziałach czasu znajdziesz w artykule Przedziały czasu.

    2. Za pomocą pola label możesz dodać identyfikator każdej dostawy, np. „Berneński pies pasterski” i „Chihuahua”. Pomoże Ci to zidentyfikować dostawy w odpowiedzi.

    Więcej informacji o definiowaniu dostaw znajdziesz w artykule Dostawa.

  3. Zdefiniuj pojazdy. W polu vehicles dodaj wiadomość Vehicle dla swojej furgonetki, w której przedszkole jest punktem początkowym i punktem końcowym, koszt wynagrodzenia kierowcy oraz godziny otwarcia furgonetki.

    1. Ustaw startWaypoint i endWaypoint furgonetki na lokalizację początkową i końcową dnia, czyli przedszkole w pobliżu parku Mission Dolores.

    2. Aby zminimalizować koszty operacyjne, musisz zdefiniować ograniczenia kosztów swojej firmy. Ustaw parametr kosztu costPerHour na 27, czyli kwotę, którą płacisz kierowcy za prowadzenie furgonetki przedszkola dla psów. Więcej informacji o parametrach kosztów znajdziesz w artykule Model kosztów.

    3. Aby optymalizator utworzył trasę w godzinach pracy furgonetki , zdefiniuj startTimeWindows jako dopuszczalny zakres czasu, w którym kierowca może rozpocząć prowadzenie furgonetki, oraz endTimeWindows jako dopuszczalny zakres czasu, w którym kierowca musi wrócić do przedszkola. Więcej informacji o przedziałach czasu znajdziesz w artykule Przedziały czasu.

    Więcej informacji o definiowaniu pojazdów znajdziesz w artykule Pojazd.

  4. Ustaw globalny przedział czasu. Globalny przedział czasu to okres, w którym furgonetka może odbierać i odwozić psy do przedszkola w ciągu dnia. W tym scenariuszu ustaw globalStartTime na 7:00, a globalEndTime na 19:00 w dniu 13 lutego 2024 r., co odpowiada godzinom otwarcia przedszkola dla psów.

3. Wysyłanie żądania

Poniżej znajdziesz proste żądanie curl oparte na scenariuszu przedszkola dla psów, które korzysta z metody blokującej optimizeTours.

Zanim wyślesz żądanie, zastąp PROJECT_NUMBER_OR_ID w przykładowym kodzie swoim identyfikatorem projektu Google Cloud.

curl -X POST 'https://routeoptimization.googleapis.com/v1/projects/PROJECT_NUMBER_OR_ID:optimizeTours' \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
--data @- << EOM
{
  "timeout": "2s",
  "model": {
    "shipments": [
      {
        "pickups": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.802395,
                  "longitude": -122.405822
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T07:30:00Z",
                "endTime": "2024-02-13T09:30:00Z"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.760202,
                  "longitude": -122.426796
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T09:30:00Z",
                "endTime": "2024-02-13T11:30:00Z"
              }
            ]
          }
        ],
        "label": "Bernese mountain dog"
      },
      {
        "pickups": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.738067,
                  "longitude": -122.498593
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T07:30:00Z",
                "endTime": "2024-02-13T09:30:00Z"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.760202,
                  "longitude": -122.426796
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T09:30:00Z",
                "endTime": "2024-02-13T11:30:00Z"
              }
            ]
          }
        ],
        "label": "Chihuahua"
      }
    ],
    "vehicles": [
      {
        "startWaypoint": {
          "location": {
            "latLng": {
              "latitude": 37.760202,
              "longitude": -122.426796
            }
          }
        },
        "endWaypoint": {
          "location": {
            "latLng": {
              "latitude": 37.760202,
              "longitude": -122.426796
            }
          }
        },
        "costPerHour": 27,
        "startTimeWindows": [
          {
            "startTime": "2024-02-13T07:00:00Z",
            "endTime": "2024-02-13T07:15:00Z"
          }
        ],
        "endTimeWindows": [
          {
            "startTime": "2024-02-13T11:45:00Z",
            "endTime": "2024-02-13T12:00:00Z"
          }
        ]
      }
    ],
    "globalStartTime": "2024-02-13T07:00:00Z",
    "globalEndTime": "2024-02-13T19:00:00Z"
  }
}
EOM

Parametry żądania użyte w żądaniu

W tabeli poniżej opisujemy parametry żądania użyte w treści żądania w przykładowym scenariuszu. Zawartość możesz filtrować według elementu nadrzędnego lub wyszukiwania tekstowego.

Ma dzieci Parametr Typ usługi Opis
OptimizeToursRequest model obiekt (ShipmentModel) To jest główna część Twojego żądania. Jest to pojedynczy obiekt, w którym definiujesz cały problem, w tym wszystkie psy, które musisz odebrać i odwieźć (shipments) oraz furgonetkę w swojej flocie (vehicles). Można go traktować jako kompletny plan problemu, który musisz zoptymalizować.
timeout Czas trwania Ten parametr określa maksymalny czas, przez jaki serwer przetwarza żądanie, zanim zwróci odpowiedź. Użyj tego parametru, aby skrócić czas oczekiwania. W przypadku małych i szybkich żądań, takich jak ten scenariusz przedszkola dla psów, ustaw tę wartość na 2 s.
ShipmentModel shipments[] tablica obiektów (Shipment) Jest to tablica obiektów, w której każdy obiekt reprezentuje psa, który ma zostać odebrany lub odwieziony.
vehicles[] tablica obiektów (Vehicle) Jest to tablica obiektów, w której każdy obiekt definiuje pojazd w Twojej flocie. W tym miejscu opisujesz swoje zasoby, np. furgonetkę, która wykonuje odbiory i odwozy. Aby uzyskać zoptymalizowaną trasę, musisz zdefiniować co najmniej 1 pojazd.
globalStartTime Sygnatura czasowa Jest to najwcześniejszy możliwy czas wystąpienia dowolnego zdarzenia w całym modelu. Ten parametr zawęża problem optymalizacji w czasie, co jest kluczowe dla dokładnych obliczeń ruchu i wyznaczania tras. W tym scenariuszu przedszkola dla psów ustaw tę wartość na najwcześniejszy czas, w którym kierowca może prowadzić furgonetkę w danym dniu, czyli 7:00 w dniu 13 lutego 2024 r.
globalEndTime Sygnatura czasowa Jest to najpóźniejszy możliwy czas wystąpienia dowolnego zdarzenia w całym modelu. W tym scenariuszu przedszkola dla psów ustaw tę wartość na czas, w którym furgonetka ma zakończyć pracę, czyli 19:00 w dniu 13 lutego 2024 r.
Shipment pickups[] tablica obiektów (VisitRequest) Jest to lista wszystkich możliwych opcji odbioru dostawy dla przesyłki. Optymalizator wybiera najlepszą opcję, aby rozwiązać Twój problem. W tym scenariuszu przedszkola dla psów podaj lokalizacje odbioru i przedziały czasu, które każdy właściciel podał dla każdego psa.
deliveries[] tablica obiektów (VisitRequest) Jest to lista wszystkich możliwych opcji odwiezienia dostawy dostawy. Optymalizator wybiera najlepszą opcję, aby rozwiązać Twój problem. W tym scenariuszu przedszkola dla psów podaj lokalizację przedszkola i przedział czasu, w którym kierowca musi wrócić na lunch dla każdego psa.
label tekst Jest to identyfikator konkretnej dostawy w Twoim żądaniu. W żądaniu możesz określić etykiety, aby ułatwić odczytanie odpowiedzi. W tym scenariuszu przedszkola dla psów użyj opisowego ciągu znaków, np. "Chihuahua", "Berneński pies pasterski" lub imienia psa, aby dopasować rozwiązanie do danych wejściowych po otrzymaniu odpowiedzi interfejsu API.
VisitRequest arrivalWaypoint[] obiekt (Waypoint) Jest to lokalizacja konkretnej wizyty na trasie. Możesz ją zdefiniować za pomocą współrzędnych geograficznych, identyfikatora miejsca lub kierunku. W tym scenariuszu przedszkola dla psów ustaw tę wartość na lokalizację podaną przez właściciela w przypadku pickups oraz na adres przedszkola w przypadku deliveries.
timeWindows[] tablica obiektów (TimeWindow) Jest to tablica obiektów, które definiują ograniczenia czasowe dotyczące odbioru lub dostawy. W tym scenariuszu użyj tego parametru, aby zdefiniować przedział czasu odbioru każdego psa oraz dopuszczalny przedział czasu odwiezienia psów do przedszkola.
Vehicle startWaypoint[] obiekt (Waypoint) Jest to lokalizacja początkowa trasy pojazdu, zdefiniowana za pomocą współrzędnych geograficznych lub identyfikatora miejsca. Ten parametr informuje optymalizator, gdzie pojazd musi rozpocząć trasę. Jeśli nie zdefiniujesz tego punktu na trasie, optymalizator wybierze jako lokalizację początkową jeden z odbiorów lub dostaw. W tym scenariuszu przedszkola dla psów, ponieważ kierowca zaczyna dzień w przedszkolu, użyj współrzędnych parku Mission Dolores.
endWaypoint[] obiekt (Waypoint) Jest to miejsce docelowe trasy pojazdu, zdefiniowane za pomocą współrzędnych geograficznych lub identyfikatora miejsca. Ten parametr informuje optymalizator, gdzie pojazd musi zakończyć trasę. Jeśli nie zdefiniujesz tego punktu na trasie, optymalizator wybierze jako koniec trasy jeden z odbiorów lub dostaw. W tym scenariuszu przedszkola dla psów, ponieważ kierowca musi zakończyć dzień w przedszkolu, użyj współrzędnych parku Mission Dolores.
costPerHour liczba Jest to koszt ponoszony za każdą godzinę korzystania z pojazdu, niezależnie od tego, czy jest on w ruchu, czy stoi. W tym scenariuszu przedszkola dla psów użyj tego parametru, aby modelować stawkę godzinową kierowcy.
startTimeWindows[] tablica obiektów (TimeWindow) Jest to dopuszczalny przedział czasu, w którym kierowca może rozpocząć prowadzenie furgonetki na potrzeby porannych odbiorów psów.
endTimeWindows[] tablica obiektów (TimeWindow) Jest to dopuszczalny przedział czasu, w którym kierowca może zakończyć prowadzenie furgonetki i zaparkować ją z powrotem w przedszkolu.

Dalej

Interpretowanie odpowiedzi