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
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
timeoutna 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:
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).
Zdefiniuj dostawy. W polu
shipmentsdodaj wiadomośćShipmentdla 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.W przypadku każdego psa utwórz
VisitRequestna potrzeby odbioru i kolejny na potrzeby dostawy, który w tym scenariuszu jest określany jako odwiezienie do przedszkola.W przypadku odbioru ustaw
arrivalWaypointna lokalizację odbioru psa (Coit Tower w przypadku berneńskiego psa pasterskiego lub South Sunset Playground Park w przypadku chihuahua) oraztimeWindowsna czas odbioru wskazany przez właściciela (od 7:30 do 9:30).W przypadku dostawy ustaw
arrivalWaypointna przedszkole, atimeWindowsna wymagany czas odwiezienia (od 9:30 do 11:30).
Więcej informacji o przedziałach czasu znajdziesz w artykule Przedziały czasu.
Za pomocą pola
labelmoż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.
Zdefiniuj pojazdy. W polu
vehiclesdodaj wiadomośćVehicledla swojej furgonetki, w której przedszkole jest punktem początkowym i punktem końcowym, koszt wynagrodzenia kierowcy oraz godziny otwarcia furgonetki.Ustaw
startWaypointiendWaypointfurgonetki na lokalizację początkową i końcową dnia, czyli przedszkole w pobliżu parku Mission Dolores.Aby zminimalizować koszty operacyjne, musisz zdefiniować ograniczenia kosztów swojej firmy. Ustaw parametr kosztu
costPerHourna 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.Aby optymalizator utworzył trasę w godzinach pracy furgonetki , zdefiniuj
startTimeWindowsjako dopuszczalny zakres czasu, w którym kierowca może rozpocząć prowadzenie furgonetki, orazendTimeWindowsjako 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.
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
globalStartTimena 7:00, aglobalEndTimena 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. |