Este documento mostra como fazer sua primeira solicitação à API Route Optimization usando um cenário de caso de uso real.
Para simplificar, o exemplo usa HTTP e JSON para demonstrar a API REST. No entanto, para o ambiente de produção, a recomendação geral é usar o gRPC devido aos benefícios de performance. No entanto, o gRPC requer alguma instalação. Para mais informações, consulte Bibliotecas de cliente da API Route Optimization.
Cenário
Você administra um serviço de creche para cachorros das 7h às 19h em São Francisco. Hoje de manhã, você precisa buscar dois cachorros em locais diferentes da cidade. Os dois donos de cachorros deram um período de busca entre 7h30 e 9h30.
Você tem uma van para o trabalho e paga ao motorista US$ 27 por hora. O motorista e a van começam o dia na creche às 7h e precisam voltar das buscas da manhã até as 12h para um intervalo de almoço.
Hoje é 13 de fevereiro de 2024, e o motorista tem as seguintes tarefas:
- Buscar o Bernese Mountain Dog perto da Coit Tower.
- Retirar o Chihuahua no South Sunset Playground Park.
- Deixar os dois cachorros na creche no Mission Dolores Park.
Você precisa de uma rota que minimize o tempo que os cachorros passam na van, atendendo aos requisitos de busca e entrega.
Antes de começar
Para executar o código neste cenário de exemplo, primeiro conclua as instruções em Configurar a API Route Optimization.
1. Escolha sua abordagem de otimização de rotas
A API Route Optimization tem vários métodos para você escolher, dependendo da complexidade do problema de otimização.
Como esse cenário de creche para cachorros é uma solicitação pequena e direta, use
um método de bloqueio, como optimizeTours, que oferece resultados rápidos
para solicitações pequenas. Para mais informações sobre os métodos da API Route Optimization, consulte Endpoints síncronos e assíncronos.
Use o URL a seguir para fazer uma solicitação HTTP POST para o optimizeTours
método:
https://routeoptimization.googleapis.com/v1/projects/PROJECT_OR_ID:optimizeTours
Você também precisa definir as configurações de tempo limite e prazo para serem curtas para reduzir qualquer tempo de espera desnecessário. Para esse cenário de creche para cachorros, o otimizador não precisa de muito tempo para responder à sua solicitação. Portanto, use as seguintes configurações:
- Defina o
timeoutparâmetro como 2 segundos. - Mantenha as configurações de prazo no padrão, que é de 60 segundos para solicitações REST.
2. Construir o corpo da mensagem de solicitação
Depois de escolher o método de bloqueio optimizeTours e definir as configurações de tempo limite
e prazo, a próxima etapa é construir o corpo da mensagem de solicitação.
Para esse cenário, a solicitação é uma mensagem OptimizeToursRequest codificada como JSON na API REST.
Para construir a mensagem de solicitação, siga estas etapas:
Comece com a estrutura de solicitação básica, que é a seguinte:
{ "timeout": ..., "model": { "shipments": [...], "vehicles": [...], "globalStartTime": "...", "globalEndTime": "..." } }Para mais informações sobre a estrutura, consulte o guia de conceitos principais para estrutura básica (ShipmentModel, Shipment e Vehicle).
Defina os envios. No campo
shipments, adicione uma mensagemShipmentpara cada cachorro que precisa ser buscado e entregue pela manhã. É aqui que você define o local e os horários de retirada preferidos de cada dono de cachorro e o local e os horários da creche para deixar os cachorros.Para cada cachorro, crie um
VisitRequestpara buscas e outro para as entregas, que, para esse cenário, é chamado de entrega da creche.Nas retiradas, defina o
arrivalWaypointcomo o local de retirada do cachorro (Coit Tower para o Bernese Mountain Dog ou South Sunset Playground Park para o Chihuahua) e otimeWindowspara o horário de retirada solicitado pelo proprietário (7h30 às 9h30).Nas entregas, defina o
arrivalWaypointcomo a creche e otimeWindowspara o horário de entrega necessário (9h30 às 11h30).
Para mais informações sobre janelas de tempo, consulte Janelas de tempo.
Você pode usar o campo
labelpara adicionar um identificador para cada envio, como "Bernese Mountain Dog" e "Chihuahua". Isso pode ajudar a identificar os envios na resposta.
Para mais informações sobre como definir envios, consulte Envio.
Defina os veículos. No campo
vehicles, adicione uma mensagemVehiclepara sua van com a creche como pontos de partida e de chegada, o custo do salário do motorista e as horas de operação da van.Defina o
startWaypointe oendWaypointda van para os locais de início e término do dia, que é a creche perto do Mission Dolores Park.Para minimizar os custos de operação, você precisa definir as restrições de custo da sua empresa. Defina o parâmetro de custo
costPerHourcomo 27, que é o valor que você paga ao motorista para dirigir a van da creche. Para mais informações sobre parâmetros de custo, consulte Modelo de custo.Para garantir que o otimizador crie um trajeto dentro das horas de operação da van, defina o
startTimeWindowscomo o intervalo aceitável para o motorista começar a operar a van e oendTimeWindowscomo o intervalo aceitável para quando o motorista precisa retornar à creche. Para mais informações sobre janelas de tempo, consulte Janelas de tempo.
Para mais informações sobre como definir veículos, consulte Veículo.
Defina uma janela de tempo global. A janela de tempo global representa o período em que a van pode fazer buscas e entregas para sua creche ao longo do dia. Para esse cenário, defina
globalStartTimecomo 7h eglobalEndTimecomo 19h para 13 de fevereiro de 2024, que representam as horas de operação da creche.
3. Enviar a solicitação
A seguir, apresentamos uma solicitação curl simples com base no cenário de creche para cachorros e que usa o método de bloqueio optimizeTours.
Antes de enviar a solicitação, substitua PROJECT_NUMBER_OR_ID no exemplo de código pelo seu ID do projeto do 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
Parâmetros de solicitação usados na solicitação
A tabela a seguir descreve os parâmetros de solicitação usados no corpo da solicitação do cenário de exemplo. Você pode filtrar o conteúdo por pai ou por pesquisa de texto.
| Com filhos | Parâmetro | Tipo de propriedade | Descrição |
|---|---|---|---|
OptimizeToursRequest |
model |
objeto (ShipmentModel) |
Este é o núcleo da sua solicitação. É um único objeto em que você
define todo o problema, incluindo todos os cachorros que precisam ser buscados e
entregues (shipments)
e a van na sua frota
(vehicles).
Pense nisso como o projeto completo do problema que você precisa otimizar. |
timeout |
Duração | Esse parâmetro especifica o tempo máximo que o servidor trabalha em uma solicitação antes de retornar uma resposta. Use esse parâmetro para encurtar o tempo de espera. Para solicitações pequenas e rápidas, como esse cenário de creche para cachorros, defina esse valor como 2s. | |
ShipmentModel |
shipments[] |
matriz de objetos (Shipment) |
Essa é uma matriz de objetos em que cada objeto representa um cachorro que precisa ser buscado ou entregue. |
vehicles[] |
matriz de objetos (Vehicle) |
Essa é uma matriz de objetos em que cada objeto define um veículo na sua frota. É onde você descreve seus recursos, como a van que faz as buscas e entregas. Você precisa definir pelo menos um veículo para receber um trajeto otimizado. | |
globalStartTime |
Carimbo de data/hora | Esse é o horário mais antigo possível para que qualquer evento em todo o seu modelo ocorra. Esse parâmetro restringe o problema de otimização no tempo, o que é fundamental para cálculos precisos de tráfego e rotas Para esse cenário de creche para cachorros, defina esse valor como o horário mais antigo em que o motorista pode operar a van no dia, que é 7h de 13 de fevereiro de 2024. | |
globalEndTime |
Carimbo de data/hora | Esse é o horário mais recente possível para que qualquer evento em todo o modelo ocorra. Para esse cenário de creche para cachorros, defina esse valor como o horário em que a van deve encerrar a operação, que é 19h de fevereiro de 13 de 2024. | |
Shipment |
pickups[] |
matriz de objetos (VisitRequest) |
Essa é uma lista de todas as opções de retirada possíveis para o envio. O otimizador escolhe a melhor opção para resolver o problema. Para esse cenário de creche para cachorros, liste os locais de retirada e as janelas de tempo que cada proprietário forneceu para cada cachorro. |
deliveries[] |
matriz de objetos (VisitRequest) |
Essa é uma lista de todas as opções de entrega possíveis para o envio. O otimizador escolhe a melhor opção para resolver o problema. Para esse cenário de creche para cachorros, liste o local da creche e a janela de tempo para quando o motorista precisa voltar para o almoço de cada cachorro. | |
label |
string | Esse é um identificador para um envio específico na sua solicitação. Você pode especificar rótulos na solicitação para facilitar a leitura da resposta. Para esse cenário de creche para cachorros, use uma string descritiva como "Chihuahua", "Bernese Mountain Dog" ou o nome do cachorro para corresponder à solução à sua entrada quando você receber a resposta da API. | |
VisitRequest |
arrivalWaypoint[] |
objeto (Waypoint) |
Esse é o local de uma visita específica no trajeto. Você pode definir isso
usando coordenadas de latitude e longitude, um ID de lugar ou um título. Nesse cenário de creche para cachorros, defina esse valor como o local fornecido pelo proprietário para
pickups
e como o endereço da creche para
deliveries. |
timeWindows[] |
matriz de objetos (TimeWindow) |
Essa é uma matriz de objetos que definem as restrições de tempo para uma retirada ou entrega. Para esse cenário, use isso para definir a janela de retirada de cada dos cachorros e a janela aceitável para deixar os cachorros na creche. | |
Vehicle |
startWaypoint[] |
objeto (Waypoint) |
Esse é o local de partida do trajeto do veículo, definido com coordenadas de latitude e longitude ou um ID de lugar. Esse parâmetro informa ao otimizador onde o veículo precisa começar o trajeto. Se você não definir esse waypoint, o otimizador vai escolher uma das buscas ou entregas como o local de partida. Para esse cenário de creche para cachorros, como o motorista começa o dia na creche, use as coordenadas do Mission Dolores Park. |
endWaypoint[] |
objeto (Waypoint) |
Esse é o destino final do trajeto do veículo, definido com coordenadas de latitude e longitude ou um ID de lugar. Esse parâmetro informa ao otimizador onde o veículo precisa terminar o trajeto. Se você não definir esse waypoint, o otimizador vai escolher uma das buscas ou entregas como o final do trajeto. Para esse cenário de creche para cachorros, como o motorista precisa terminar o dia na creche, use as coordenadas do Mission Dolores Park. | |
costPerHour |
número | Esse é o custo incorrido para cada hora em que um veículo é usado, independentemente de estar viajando ou parado. Para esse cenário de creche para cachorros, use isso para modelar o salário por hora de um motorista. | |
startTimeWindows[] |
matriz de objetos (TimeWindow) |
Essa é a janela aceitável para o motorista começar a dirigir a van para as buscas de cachorros da manhã. | |
endTimeWindows[] |
matriz de objetos (TimeWindow) |
Essa é a janela aceitável para o motorista terminar de dirigir a van e estacionar de volta na creche. |