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 korzystanie z gRPC ze względu na jego zalety związane z wydajnością. gRPC wymaga jednak instalacji. Więcej informacji znajdziesz w sekcji 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 Playground Park

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.

Do dyspozycji masz 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 podejście do 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 zwraca wyniki w przypadku małych żądań. Więcej informacji o metodach interfejsu Route Optimization API znajdziesz w sekcji 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 żądania

Po wybraniu metody blokującej optimizeTours i zdefiniowaniu ustawień limitu czasu oraz terminu kolejnym krokiem jest utworzenie treści żądania message.

W tym scenariuszu żądanie jest komunikatem OptimizeToursRequest zakodowanym jako JSON w interfejsie REST API.

Aby utworzyć żądanie, 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ących struktury podstawowej (ShipmentModel, Shipment i Vehicle).

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

    1. Dla każdego psa utwórz VisitRequest na potrzeby odbioru i dostawy, która w tym scenariuszu jest określana jako odwiezienie do przedszkola.

      • W przypadku odbioru ustaw arrivalWaypoint na miejsce odbioru psa (Coit Tower w przypadku berneńskiego psa pasterskiego lub South Sunset Playground Park w przypadku chihuahua) oraz timeWindows na żądany przez właściciela czas odbioru (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 sekcji Przedziały czasu.

    2. Możesz użyć pola label, aby 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 sekcji Dostawa.

  3. Zdefiniuj pojazdy. W polu vehicles dodaj komunikat Vehicle dla swojej furgonetki, w którym jako punkty początkowy i końcowy ustawisz przedszkole, określisz koszt wynagrodzenia kierowcy i godziny pracy furgonetki.

    1. Ustaw startWaypoint i endWaypoint dla furgonetki na lokalizacje 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 sekcji 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 sekcji Przedziały czasu.

    Więcej informacji o definiowaniu pojazdów znajdziesz w sekcji 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 i globalEndTime na 19:00 w dniu 13 lutego 2024 r., co odpowiada godzinom pracy 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 tej tabeli opisano parametry żądania użyte w treści żądania w przykładowym scenariuszu. Zawartość możesz filtrować według elementu nadrzędnego lub wyszukiwania tekstowego.

Rodzic 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 odbiera i odwozi psy. 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 w przypadku dokładnych obliczeń dotyczących 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) To jest lista wszystkich możliwych opcji odbioru dostawy. 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 właściciele podali dla każdego psa.
deliveries[] tablica obiektów (VisitRequest) To jest 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 ciąg znaków 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 jej, aby zdefiniować przedział czasu odbioru dla każdego psów oraz dopuszczalny przedział czasu na odwiezienie 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, 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, 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