O solucionador de roteamento usa um objeto chamado dimensão para acompanhar quantidades que se acumulam ao longo do trajeto de um veículo, como o tempo de viagem ou Se o veículo está fazendo retiradas e entregas, o peso total que está carregando , Se um problema de roteamento envolver tal quantidade, seja nas restrições ou função objetiva, você precisa definir uma dimensão para especificá-las.
Nesta seção, explicamos como definir e usar dimensões.
Exemplos de dimensões
Aqui estão alguns exemplos de dimensões das seções anteriores.
O exemplo de VRPTW cria uma dimensão para rastrear o tempo cumulativo de viagem de cada veículo. O solucionador usa a dimensão para aplicar a restrição de que um veículo só pode visitar um local no janela de tempo.
O exemplo de CVRP cria uma dimensão para o exigências (por exemplo, pesos ou volumes de pacotes a serem coletados), que rastreiam a carga cumulativa que o veículo carrega ao longo do trajeto. O solucionador usa a dimensão para aplicar a restrição de que a carga de um veículo não pode exceder a capacidade dele.
Os exemplos abaixo definem uma dimensão para o VRPTW usando o
AddDimension
.
Python
routing.AddDimension( callback_index, slack_max, capacity, fix_start_cumul_to_zero, dimension_name)
C++
routing.AddDimension( callback_index, slack_max, capacity, fix_start_cumul_to_zero, dimension_name)
Java
routing.addDimension( callbackIndex, slackMax, capacity, fixStartCumulToZero, dimensionName)
C#
routing.AddDimension( callbackIndex, slackMax, capacity, fixStartCumulToZero, dimensionName)
O método AddDimension
tem as seguintes entradas:
callback_index
: o índice do callback que retorna a quantidade. A índice, que é a referência interna do solucionador para o callback, é criado pelo métodos, comoRegisterTransitCallback
ouRegisterUnitaryTransitCallback
.slack_max
: máximo para a folga, uma variável usada para representar a espera vezes nos locais. Consulte as variáveis do Slack abaixo para detalhes. Se o problema não envolver tempo de espera, geralmente é possível definirslack_max
como zero.capacity
: máximo para a quantidade total acumulada em cada trajeto. Usecapacity
para criar restrições como as CVRP: Se seu problema não tiver um restrição, é possível definircapacity
como um valor que seja grande o suficiente para não impor restrições aos trajetos, por exemplo, a soma de todos entradas da matriz ou matriz usadas para definir o callback.fix_start_cumulative_to_zero
: valor booleano. Se verdadeiro, o valor cumulativo da quantidade começa em 0. Na maioria dos casos, ele precisa ser definido comoTrue
. No entanto, para VRPTW ou problemas com restrições de recursos, alguns veículos pode ter que iniciar depois de 0 devido a restrições de janela de tempo, portanto definafix_start_cumulative_to_zero
comoFalse
para esses problemas.dimension_name
: string do nome da dimensão, como'Distance'
. que pode ser usada para acessar as variáveis em outro lugar do programa.
O programa CVRP cria um tipo um pouco diferente de dimensão usando o
AddDimensionWithVehicleCapacity
. Esse método usa uma matriz de capacidades, com uma entrada para cada veículo.
Por outro lado, AddDimension
usa um único valor para capacity
, então todos
presume-se que veículos tenham a mesma capacidade.)
Consulte o RoutingModel
página de referência para outros métodos que criam dimensões.
Seção Salvar as janelas de tempo da solução em uma lista ou matriz apresenta funções que salvam os dados cumulativos em uma dimensão em uma lista ou matriz.
Variáveis do Slack
Aqui está um exemplo que ilustra as variáveis de folga para um problema que envolve o tempo de viagem. Suponha que um veículo vai do local i para o local j em uma etapa do trajeto, e que:
- O tempo cumulativo de viagem do veículo em i é de 100 minutos.
- O tempo cumulativo de viagem do veículo em j é de 200 minutos.
- O tempo de viagem de i para j é de 75 minutos.
O veículo não pode sair do local i imediatamente após a chegada nem o valor acumulado no local j seria 175. Em vez disso, o veículo deve aguardar 25 minutos location i antes da partida; em outras palavras, a folga no local i é 25.
É preciso permitir a folga em um VRPTW porque os veículos podem ter que esperar até
visitar um local devido a restrições de janela de tempo. Em um problema como esse, defina
slack_max
para o tempo máximo de espera dos veículos
local antes de prosseguir para o próximo. Se não importa quanto tempo
eles esperam, basta definir slack_max
como um número muito alto.
Para o CVRP, por outro lado, a mudança na carga acumulada de i
para
j
sempre é igual à demanda em i
, então não há folga. Para problemas como
defina slack_max
como 0.
A seguir, daremos a definição formal de folga. Internamente, uma dimensão armazena dois tipos de variáveis relacionadas às quantidades acumuladas ao longo dos trajetos:
- Variáveis de transporte público: o aumento ou a diminuição da quantidade em cada etapa do
um trajeto.
Se
i -> j
for uma etapa do trajeto, a variável de transporte público serái
, entradaj
da matriz de transporte público (para um callback de transporte público), ou simplesmente o valor do callback no local i (se o callback depender de apenas um local). - Variáveis cumulativas: quantidade total acumulada em cada local. Você
pode acessar a variável cumulativa no local i ao
dimension_name.CumulVar(i)
: Para ver um exemplo, consulte restrições de janela de tempo no exemplo VRPTW.
Supondo que um veículo vá do local i
ao local j
em uma etapa, o
O slack está relacionado a essas variáveis da seguinte maneira:
slack(i) = cumul(j) - cumul(i) - transit(i, j)
Para mais detalhes sobre as dimensões, consulte
RoutingDimension
na seção de referência.