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
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
timeoutna 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:
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).
Zdefiniuj dostawy. W polu
shipmentsdodaj komunikatShipmentdla 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.Dla każdego psa utwórz
VisitRequestna potrzeby odbioru i dostawy, która w tym scenariuszu jest określana jako odwiezienie do przedszkola.W przypadku odbioru ustaw
arrivalWaypointna miejsce odbioru psa (Coit Tower w przypadku berneńskiego psa pasterskiego lub South Sunset Playground Park w przypadku chihuahua) oraztimeWindowsna żądany przez właściciela czas odbioru (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 sekcji Przedziały czasu.
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.
Zdefiniuj pojazdy. W polu
vehiclesdodaj komunikatVehicledla swojej furgonetki, w którym jako punkty początkowy i końcowy ustawisz przedszkole, określisz koszt wynagrodzenia kierowcy i godziny pracy furgonetki.Ustaw
startWaypointiendWaypointdla furgonetki na lokalizacje 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 sekcji 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 sekcji Przedziały czasu.
Więcej informacji o definiowaniu pojazdów znajdziesz w sekcji 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 iglobalEndTimena 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. |