Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este guia explica como usar o Azure Mapas e o NVIDIA cuOpt para criar um serviço de otimização de itinerário. Este serviço automatiza o processo de criação de itinerários para múltiplos agentes e frotas mistas, usando o motor de otimização de rotas NVIDIA cuOpt para otimizar trajetos através de múltiplos destinos.
Esse é um processo de duas etapas que necessita de uma matriz de custos para o tempo de deslocamento e um solucionador para otimizar o problema e gerar um resultado. A matriz de custos representa o custo de deslocamento entre cada par de locais no problema, incluindo o custo do tempo de viagem e outros gastos associados.
Este artigo descreve como:
- Começar com o NVIDIA cuOpt no Azure Marketplace.
- Usar a API de Matriz de Rotas do Azure Mapas para calcular o custo de viagem.
- Mapear o problema para as chamadas à API do cuOpt.
- Usar a resposta do cuOpt.
- Chamar a API de Direções de Rotas do Azure Mapas para roteiros.
Veja o exemplo de código Otimização de vários itinerários para começar rapidamente.
Pré-requisitos
- Uma Conta do Azure Mapas
- Uma chave de assinatura ou outra forma de autenticação no Azure Mapas
Suporte ao serviço
Esse serviço oferece suporte aos seguintes funcionalidades e restrições.
Funcionalidades de otimização de rotas | Com suporte? |
---|---|
Caminhão e automóveis | Sim |
Vários itinerários | Sim |
Vários motoristas | Sim |
Vários dias | Sim |
Frota mista | Sim |
Janela de tempo do veículo | Sim |
Limites de tempo | Sim |
Prioridade | Sim |
Pausas dos agentes | Sim |
Entregas com coleta | Sim |
Custo por veículo | Sim |
Número mínimo e máximo de veículos | Sim |
Para conferir a lista completa de funcionalidades com suporte, confira Funcionalidades compatíveis com o cuOpt.
Introdução ao NVIDIA cuOpt no Azure Marketplace
O NVIDIA cuOpt usa um solucionador logístico acelerado por GPU e otimizações para calcular problemas complexos de roteamento de veículos, considerando uma variedade de restrições. Para mais informações, confira a Lista de recursos suportados pelo cuOpt.
O cuOpt está incluído no NVIDIA AI Enterprise. Acesse o Azure Marketplace para começar.
Calcule o custo de viagem
A otimização de itinerários requer uma matriz quadrada que contenha alguma métrica de viagem, a qual será fornecida ao solucionador cuOpt. Isso pode incluir o tempo da viagem ou o custo da distância percorrida. Uma matriz de custos é uma matriz quadrada que representa o custo de deslocamento entre cada par de locais no problema.
A API Matriz de Rotas do Azure Mapas determina o tempo e o custo em distância para ir do local de origem a cada destino. Os conjuntos de origens e destinos podem ser vistos como os cabeçalhos de colunas e linhas de uma tabela, onde cada célula contém o custo de deslocamento do local de origem para o destino correspondente dessa célula.
Imagine, por exemplo, um restaurante com dois entregadores que precisam levar pedidos para quatro locais. Para organizar isso, chame a API da Matriz de Rotas para calcular os tempos de deslocamento entre todos os locais. Este exemplo presume que o restaurante seja o local de partida e chegada dos entregadores. Se os locais de partida e chegada forem diferentes do "depot", eles precisam ser incluídos nas matrizes de custos.
Número de origens = Número de destinos = 1 (restaurante também conhecido como "depot") + 4 (entregas)
Tamanho da matriz = 5 origens x 5 destinos = 25
Observação
A Matriz de Rotas do Azure Mapas pode lidar com até 700 células de matriz, o que equivale a uma matriz quadrada de 26x26. Você pode planejar o itinerário para 26 locais, incluindo depots e pontos de entrega.
A solicitação POST da Matriz de Rotas:
https://atlas.microsoft.com/route/matrix?api-version=2025-01-01&routeType=shortest&subscription-key={Your-Azure-Maps-Subscription-key}
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "MultiPoint",
"coordinates": [
[4.85106, 52.36006], //restaurant or depot
[4.85056, 52.36187], //delivery location 1
[4.85003, 52.36241], //delivery location 2
[4.42937, 52.50931], //delivery location 3
[4.42940, 52.50843] //delivery location 4
]
},
"properties": {
"pointType": "origins"
}
},
{
"type": "Feature",
"geometry": {
"type": "MultiPoint",
"coordinates": [
[4.85106, 52.36006], //restaurant or depot
[4.85056, 52.36187], //delivery location 1
[4.85003, 52.36241], //delivery location 2
[4.42937, 52.50931], //delivery location 3
[4.42940, 52.50843] //delivery location 4
]
},
"properties": {
"pointType": "destinations"
}
}
]
}
A resposta da Matriz de Rotas retorna uma matriz multidimensional de 5x5, em que cada linha representa as origens e as colunas representam os destinos. Use o campo travelTimeInSeconds
para obter o custo de tempo para cada par de locais. A unidade de tempo deve ser a mesma em toda a solução. Depois de finalizar a fase de pré-processamento, as informações sobre o pedido, o depósito, a frota e a matriz de custos serão enviados e importados para o servidor cuOpt por meio de chamadas à API.
A amostra JSON a seguir mostra o que é retornado no corpo da resposta HTTP para a amostra da matriz de custos:
cost_matrix_data = [
[ 0, 10, 8, 6, 10],
[10, 0, 12, 8, 6],
[ 8, 16, 0, 8, 4],
[ 2, 8, 6, 0, 8],
[ 6, 6, 10, 12, 0],
]
Observação
Normalmente, o custo de deslocamento de um local para ele mesmo é 0, e o custo de ir do local A ao local B não é necessariamente igual ao de ir do local B para o local A.
Mapeie o problema para chamadas à API do cuOpt
Esta seção descreve como compilar dados de solicitação para chamadas ao cuOpt. Para mais exemplos, confira as melhores práticas do cuOpt.
- Definir matriz de custos
- Definir dados da frota
- Definir dados da tarefa
- Definir configuração do solucionador (opcional)
Definir matriz de custos
Analise a resposta da API de Matriz de Rotas do Azure Mapas para obter o tempo de deslocamento entre os locais e montar a matriz de custos. No exemplo a seguir, o número "0" indica a chave que representa um tipo de veículo específico.
"data": {" cost_matrix_data ": {
"data": {
"0": [
[0, 5, 4, 3, 5],
[5, 0, 6, 4, 3],
[4, 8, 0, 4, 2],
[1, 4, 3, 0, 4],
[3, 3, 5, 6, 0]
]
}}}
É possível fornecer várias matrizes de custos, dependendo dos tipos de veículos. Alguns veículos podem se deslocar mais rápido, enquanto outros podem ter mais custos ao passar por determinadas áreas. Essas variações podem ser modeladas usando mais matrizes de custos, uma para cada tipo de veículo. No próximo exemplo, existem duas matrizes: "0" para o primeiro veículo, que pode ser um carro, e "1" para o segundo veículo, que pode ser um caminhão. Observe que, se sua frota possui veículos com características semelhantes, basta especificar a matriz de custos uma única vez.
"data": {" cost_matrix_data ": {
"data": {
"0": [
[0, 5, 4, 3, 5],
[5, 0, 6, 4, 3],
[4, 8, 0, 4, 2],
[1, 4, 3, 0, 4],
[3, 3, 5, 6, 0]
],
"1": [
[0, 4, 2, 3, 3],
[2, 0, 6, 5, 3],
[3, 8, 0, 3, 2],
[1, 5, 3, 0, 4],
[3, 4, 5, 7, 0]
],
}}}
Defina os dados de frota
Os dados da frota podem descrever informações como o número de veículos, suas localizações de início/fim e capacidade, que são usados pelo solucionador para determinar quais veículos estão disponíveis para realizar a tarefa dentro das restrições.
{
"fleet_data": {
"vehicle_locations": [
[0,1], [0,1]
],
"capacities": [[2,3]],
"vehicle_time_windows": [
[0, 80],
[1, 40]
],
"vehicle_break_time_windows":[
[
[20, 25],
[20, 25]
]
],
"vehicle_break_durations": [[1, 1, 1, 1, 1]]
}
}
- Localizações dos veículos: no exemplo acima, os dados da frota indicam dois veículos, uma matriz para cada um. Ambos partem do ponto 0 e finalizam a viagem no ponto 1. Dentro da descrição de uma matriz de custos do ambiente, essas localizações dos veículos correspondem aos índices de linha (ou coluna) na matriz de custos.
- Capacidades: a matriz de capacidade indica a capacidade do veículo; o primeiro veículo tem capacidade para dois e o segundo para três. A capacidade pode representar várias coisas, como o peso do pacote, habilidades de serviço e a quantidade que cada veículo pode transportar. Na próxima seção, você criará um JSON para a tarefa que necessitará de uma dimensão de demanda para cada local da tarefa, e o total de dimensões de demanda deverá corresponder ao número de dimensões de capacidade nos dados da frota. Por exemplo, se um caminhão está entregando mercadorias, a capacidade seria o peso total que cada veículo pode transportar e a demanda seria o peso de cada pedido. Verifique se a mesma unidade é usada para ambos (como libras ou quilogramas).
- Janelas de tempo dos veículos: as janelas de tempo especificam o tempo de operação dos veículos para a realização de tarefas. Pode ser a hora de início e término do turno do agente. Os dados brutos podem estar no formato de data/hora em Tempo Universal Coordenado (UTC) ou no formato de cadeia de caracteres, que deve ser convertido em valor numérico. (Por exemplo: das 9:00 às 18:00 convertido em minutos em um período de 24 horas a partir das 12:00, seria [540, 1080]). Todas as unidades de tempo/custos fornecidas para o solucionador cuOpt devem estar na mesma unidade de medida.
- Pausas dos veículos: também é possível especificar as janelas e a duração das pausas dos veículos. Isso pode representar o intervalo de almoço do agente ou outras pausas necessárias. O formato da janela de pausa é o mesmo utilizado para as janelas de tempo dos veículos. Todas as unidades de tempo/custos fornecidas para o solucionador cuOpt devem estar na mesma unidade de medida.
Defina os dados das tarefas
As tarefas definem o objetivo que precisa ser alcançado, respeitando as restrições. No contexto de entregas de última milha, que representa a última fase da entrega do produto, isso pode incluir os locais de entrega, a quantidade demandada em cada local, a janela de entrega e o tempo de espera para cada local.
"task_data": {
"task_locations": [1, 2, 3, 4],
"demand": [[3, 4, 4, 3]],
"task_time_windows": [[8, 17], [8, 17], [8, 17], [17, 20]],
"service_times": [0, 0, 0, 0]
}
- Local da tarefa: no exemplo acima, task_locations indica os locais de entrega localizados nas posições 1, 2, 3 e 4. Esses locais correspondem aos índices de linha (ou coluna) na matriz de custos.
- Demanda: a matriz de demanda mostra a quantidade demandada em cada local; o primeiro local tem uma demanda de 3, segundo e terceiro local têm 4 e o último local têm 3. O total de dimensões de demanda deve ser equivalente ao número de dimensões de capacidade de cada veículo.
- Janela de tempo da tarefa: as restrições de janela de tempo determinam quando uma tarefa deve ser finalizada. Cada tarefa recebe uma janela de tempo de início e término, e deve ser concluída dentro desse intervalo. Os dados brutos podem estar no formato de data/hora em Tempo Universal Coordenado (UTC) ou no formato de cadeia de caracteres, que deve ser convertido em valor numérico. (Por exemplo: das 9:00 às 18:00 convertido em minutos em um período de 24 horas a partir das 12:00, seria [540, 1080]). Todas as unidades de tempo/custos fornecidas para o solucionador cuOpt devem estar na mesma unidade de medida.
- Tempos de serviço: representa a duração necessária para realizar as tarefas. A matriz service_times especifica a duração para cada local da tarefa. Todas as unidades de tempo/custos fornecidas para o solucionador cuOpt devem estar na mesma unidade de medida.
Defina a configuração do solucionador (opcional)
De forma opcional, você pode especificar a configuração do solucionador para alocar um tempo máximo para encontrar uma solução. Isso varia conforme o caso de uso, e um limite de tempo mais extenso pode proporcionar melhores resultados.
"solver_config": {
"time_limit": 1
}
Observação
Você pode ter restrições adicionais dependendo do problema, como prioridades de pedidos ou custos dos veículos, confira as funcionalidades compatíveis com o cuOpt. Outras funcionalidades seriam pré-processadas de forma semelhante às apresentadas nos exemplos.
Como usar a resposta do cuOpt
O solucionador cuOpt retorna a parada otimizada para cada veículo e o itinerário de viagem. Analise a resposta e converta cada local em um ponto de coordenada antes de fazer uma chamada à API de Direções de Rotas do Azure Mapas para traçar as rotas. Essas rotas otimizadas incluem o trajeto e as instruções de direção para cada agente.
Exemplo de dados de solicitação
{
"requestBody": {
"data": {"cost_matrix_data": {"data": {"1": [[0, 5, 4, 3, 5], [5, 0, 6, 4, 3], [4, 8, 0, 4, 2], [1, 4, 3, 0, 4], [3, 3, 5, 6, 0]]}},
"fleet_data": {
"vehicle_locations": [[0, 0], [0, 0]],
"vehicle_ids": ["Car-A", "Car-B"],
"vehicle_types": [1, 1],
"capacities": [[75, 75]],
"vehicle_time_windows": [[8, 18], [8, 17]],
"vehicle_break_time_windows": [[[12, 14], [12, 14]]],
"vehicle_break_durations": [[0, 0]]
},
"task_data": {
"task_locations": [1, 2, 3, 4],
"demand": [[30, 40, 40, 30]],
"task_time_windows": [[8, 17], [8, 17], [8, 17], [17, 15]],
"service_times": [0, 0, 0, 0]
},
"solver_config": {
"time_limit": 1
}},
"client_version": ""
}
}
Resposta de exemplo
"reqId": "4bdc2610-d821-48dc-b53f-57698015bb2e",
"status": "fulfilled",
"percentComplete": 100,
"response": {
"response": {
"solver_response": {
"status": 0,
"num_vehicles": 2,
"solution_cost": 19.0,
"vehicle_data": {
"Car-A": {
"task_id": [
"Depot",
"Break",
"0",
"2",
"Depot"
],
"arrival_stamp": [
8.0,
13.0,
13.0,
17.0,
18.0
],
"route": [
0,
1,
1,
3,
0
],
"type": [
"Depot",
"Break",
"Delivery",
"Delivery",
"Depot"
]
},
"Car-B": {
"task_id": [
"Depot",
"Break",
"1",
"3",
"Depot"
],
"arrival_stamp": [
8.0,
12.0,
12.0,
14.0,
17.0
],
"route": [
0,
2,
2,
4,
0
],
"type": [
"Depot",
"Break",
"Delivery",
"Delivery",
"Depot"
]
}
},
"msg": ""
}
}
}
}
Chame a API de Rotas do Azure Mapas para criar os roteiros
Depois que os locais na resposta cuOpt forem mapeados para as coordenadas correspondentes, o serviço cuOpt poderá ser usado com a API de Direções de Rota do Azure Mapas e o SDK da Web para criar um aplicativo Web que exibe os itinerários atribuídos e as rotas otimizadas no mapa. É possível diferenciar o trajeto de cada veículo por cores, com base nas paradas designadas e mostrar isso nos dados de base do Azure Mapas.