Análise e Implementação de Algoritmos para o Roteamento de Veículos Milton Roberto Heinen 1 1 Universidade do Vale do Rio dos Sinos (UNISINOS) Mestrado em Computação Aplicada CEP 93022-000 - São Leopoldo - RS - Brazil mheinen@turing.unisinos.br Resumo. O objetivo deste artigo é descrever o problema de roteamento de veículos, que é uma tarefa muito importante na maioria dos sistemas de transporte e logística, mas que não possui atualmente uma solução exata em tempo polinomial. Inicialmente será descrito o problema do roteamento de veículos, e em seguida serão descritas duas heurísticas de aproximação para o problema, a Heurística de Clark e Wright e a Heurística de Mole e Jameson. Por último serão descritas as implementações realizadas e os resultados obtidos. 1. Introdução O roteamento de veículos é um problema presente na maioria das empresas de transporte, logística e distribuição. Seu objetivo é determinar, dentre todas as possíveis rotas alternativas, qual é a que representa o menor custo, ou seja, qual é a solução ótima [Goldbarg and Luna 2000]. Aparentemente, é fácil descobrir qual a melhor solução, basta calcular o custo de todas as possíveis combinações e selecionar a que apresentar o menor custo. Para um pequeno conjunto de locais a serem visitados (nodos), isto é perfeitamente viável, mais a medida que este conjunto cresce, a solução vai se tornando cada vez mais difícil do ponto de vista computacional. Isto ocorre porque o número de combinações possíveis se torna muito grande, fazendo com que o cálculo possa demorar até vários séculos dependendo do número de nodos. Em termos de complexidade computacional, os Problemas de Roteamento de Veículos (PRV), assim como a maioria dos problemas combinatoriais [Pelizaro 2000], são classificados como sendo NP-Completos [Cormen et al. 2002], pois sua complexidade de tempo é exponencial - O(c n ), onde c é uma constante e n é o número de nodos a serem analisados. Até o momento, não foi possível encontrar nenhuma solução de tempo polinomial para problemas da classe NP-Completo, assim sendo, atualmente não existe nenhuma solução exata para o problema de roteamento de veículos em tempo polinomial - O(n c ) [Karp 1975]. Mas devido a sua grande importância estratégica, soluções aproximadas para o PRV vem sendo estudadas a várias décadas. O objetivo deste artigo é descrever duas heurísticas de aproximação para o problema de roteamento de veículos, a heurística de Clark e Wright [Clark and Wright 1964] e a heurística de Mole e Jameson [Mole and Jameson 1976]. O artigo está estruturado da seguinte forma: Inicialmente será descrito PRV do ponto de vista teórico, e em seguida serão descritas as heurísticas de aproximação selecionadas, abordando características e limitações. Após isto serão descritas as implementações realizadas de ambos os algoritmos, os resultados obtidos e as perspectivas futuras.
2. Roteamento de veículos O Problema de Roteamento de Veículos (PRV) é um problema de grande importância estratégica e de difícil solução computacional, e por isso vem sendo estudado há várias décadas por pesquisadores de todo o mundo. Ele pode ser descrito da seguinte forma: dado um depósito de abastecimento e vários clientes ligados ao depósito e entre si através de vários caminhos com custos diferentes, descobrir a melhor rota a ser empreendida por um veículo, que saia do depósito, passe por todos os clientes e retorne com o menor custo possível. A Figura 1 ilustra esta situação, onde o círculo 0 representa um depósito e os círculos 1, 2, 3 e 4 representam os clientes. Uma forma muito comum de se representar o PRV é através de grafos ponderados [Cormen et al. 2002], onde os vértices representam o depósito e os clientes, e as arestas representam os caminhos ligando os diversos vértices entre si. Os pesos das arestas representam os custos de se percorrer os caminhos. A Figura 1 ilustra um problema de roteamento de veículos através de um grafo ponderado. Figura 1. Grafo ponderado representando um PRV 2.1. Restrições Em sua forma mais básica, o PRV se resume ao problema do caixeiro viajante, descrito em [Melamed et al. 1990]. Mas em problemas reais de roteamento envolvendo veículos de transporte, muitas restrições são impostas ao modelo, dentre as quais podemos destacar [Goldbarg and Luna 2000]: Restrições de combustível; Janelas de tempo; Capacidade do veículo. Para que as restrições possam ser implementadas, são necessárias informações adicionais relativas ao contexto do problema, como o tamanho do tanque de combustível, o consumo médio dos veículos, a velocidade média das rodovias, entre outras. 2.2. Heurísticas de aproximação Pelo fato de o PRV não possuir uma solução exata em tempo polinomial, para que ele possa ser solucionado outras estratégias devem ser utilizadas, como por exemplo as heurísticas de aproximação [Olivera 2004]. Estas heurísticas fornecem uma solução aproximada, que é suficiente na maioria dos casos. O foco deste artigo são as heurísticas construtivas, que partem de uma solução inicial que é atualizada a cada passo segundo algum critério de minimização do custo. Assim, a solução vai sendo construída iterativamente, até que se chegue a uma solução aproximada. Pelo fato dos procedimentos de economia e inserção sempre utilizarem a solução de menor custo a cada passo, eles são chamados de algoritmos gulosos [Cormen et al. 2002].
3. Heurística de Clark e Wright A heurística de Clark e Right foi um dos primeiros algoritmos a serem propostos para solucionar o problema de roteamento de veículos. Ele foi muito importante em sua época, servido de base para outros algoritmos mais sofisticados que surgiram mais tarde. O funcionamento do algoritmo ocorre da seguinte forma: Um grafo ponderado representando os clientes, os possíveis caminhos e o depósito é lido a partir de uma matriz de adjacências ou de alguma outra estrutura de armazenamento Em seguida são criadas n 1 rotas iniciais, cada uma delas ligando um dos clientes ao depósito, onde n é o número de nodos do grafo. Após isto, são calculadas as economias para todas as possíveis combinações 2 por 2 de nodos, através da fórmula: s ij = c i0 + c 0j c ij (1) onde s ij representa a economia obtida ao se unir as rotas que possuem os nodos i e j, e c ij representa o custo de se deslocar do nodo i para o nodo j. As economias são colocadas em uma tabela, que é ordenada de forma decrescente. Para cada linha da tabela de economias, começando pela maior economia, é verificado se é possível unir as rotas que contém os nodos i e j. As rotas podem ser combinadas se ambos os nodos estiverem em extremos opostos de rotas diferentes, e se a união não violar nenhuma das restrições do modelo (capacidade de carga dos veículos, limite de combustível, janela de tempo, etc). O processo continua com o proximo par de nodos da tabela de economias, até que se chegue ao último item da tabela ou até que não hajam mais rotas a serem combinadas. Para que seja possível compreender melhor o funcionamento do algoritmo, considere o exemplo da Figura 1, onde o nodo 0 representa o depósito e os nodos de 1 a 4 representam os clientes. Inicialmente, o algoritmo cria uma rota para cada um dos clientes, conforme mostra a Figura 2(a). Em seguida, é calculada a tabela de economias (Tabela 1), através da fórmula 1. Analisando a tabela, pode ser notado que a maior econoi j c i0 + c 0j c ij s ij 1 2 8 + 10 4 14 1 3 12 + 8 6 14 2 3 10 + 12 9 13 3 4 12 + 5 10 7 1 4 8 + 5 10 3 Tabela 1. Lista de economias mia é obtida ao se unir as rotas que possuem os nodos 1 e 2. Como ambos os nodos estão em extremos opostos de suas respectivas rotas (ligados diretamente ao depósito), as rotas podem ser unidas, como mostra a Figura 2(b). O processo continua no próximo item da tabela, unindo as rotas com os nodos 1 e 3 (Figura 2(c)). Se um dos nodos não estiver em um dos extremos de sua rota, as rotas não podem ser unidas, e o processo continua no próximo item da tabela de economias. Este seria também o caso se a nova rota violasse alguma das restrições do modelo, como por exemplo a capacidade do veículo. Continuando o processo, a linha seguinte da tabela é ignorada, pois os nodos 3 e 4 já se encontram
(a) (b) (c) (d) Figura 2. Exemplo de aplicação da heurística de Clark e Wright na mesma rota. Em seguida, as rotas contendo os nodos 3 e 4 são unidas (Figura 2(d)), e o processo se encerra, pois não existem mais rotas a serem combinadas. A complexidade computacional do algoritmo Clark e Right é O(n 2 ), ou seja, ele é resolvido em tempo polinomial. Uma desvantagem deste algoritmo é que a combinação de rotas só é realizada quando os nodos estão nos extremos das rotas, o que faz com que os nodos internos sejam excluídos do teste de economia. A principal contribuição deste algoritmo pode ser considerada o fato de ele ter aberto caminho para algoritmos mais poderosos que surgiram após este, como por exemplo o de Mole e Jameson [Mole and Jameson 1976]. 3.1. Heurística de Mole e Jameson A heurística de Mole e Jameson [Mole and Jameson 1976] é uma heurística bem mais sofisticada que a de Clark e Wright. Entre outras coisas, ela tenta reduzir a principal fragilidade deste último, que é a dos nodos internos não serem candidatos ao teste de economia [Goldbarg and Luna 2000]. O funcionamento do algoritmo ocorre da seguinte forma: Inicialmente o grafo é lido a partir de uma matriz de adjacências, e uma lista de nodos livres (que estão fora de qualquer rota) é criada com todos os nodos do grafo menos o depósito (nodo 0). Em seguida, é selecionado um nodo para ser inserido na rota inicial, segundo algum critério. Na implementação deste algoritmo foi utilizado o critério de selecionar o nodo livre mais próximo do depósito para iniciar uma rota. Após isto, o algoritmo começa a realizar um laço, dentro do qual os nodos vão sendo sucessivamente inseridos nas rotas. A inserção é realizada segundo dois critérios, o de proximidade e o de economia. O critério de proximidade seleciona o nodo que está mais próximo da rota atual, segundo as distâncias calculadas pela fórmula: e(i, l, j) = c il + c lj µc ij (2)
Onde c il representa o custo entre os nodos i e l, c lj o custo entre l e j e c ij o custo entre i e j. O nodo que apresentar a menor distância é selecionado para ser inserido na rota, caso isto não viole nenhuma restrição. O critério de economia visa selecionar qual o melhor local para se inserir o nodo selecionado. Ele é calculado pela fórmula: σ(i, l, j) = λc 0l e(i, l, j) (3) Onde c 0l representa a distância entre o depósito e o nodo l. O local a ser selecionado é o que apresentar a maior economia. Os parâmetros λ e µ permitem que se altere o comportamento do algoritmo de diversas formas [Goldbarg and Luna 2000]: Com λ = 0 e µ = 1, a inserção é realizada levando em conta a minimização do aumento da rota pela inclusão do novo cliente; Com λ = 0 e µ = 0, a inserção é realizada levando em conta a minimização da distância entre os dois nós vizinhos; O caso em que 1 λ 2 e µ = λ 1, é uma generalização do critério de Gaskell [Gaskell 1967]; Com λ e 0 < µ <, a inserção ocorrerá para o cliente mais distante do depósito. Na descrição dos exemplos abaixo, bem como na implementação realizada, foram utilizados os valores de λ = 2 e de µ = 1, segundo o critério de Gaskell [Gaskell 1967]. O laço se encerra quando não houverem mais nodos presentes na lista de nodos livres. Após as rotas estarem construídas, elas são otimizadas segundo algum método r- Ótimo. Os métodos r-ótimos são procedimentos que partem de uma solução já construída e que tentam fazer alguma melhoria nela de forma a minimizar o custo. Um algoritmo bastante utilizado para tal finalidade é o Procedimento k-ótimo, cujo funcionamento do algoritmo k-ótimo é bastante simples. A partir de uma rota R, removem-se k, arestas, deixando o grafo desconexo. Em seguida, se fazem todas as combinações de vértices possíveis que tornem o grafo novamente conexo, sem deixar nenhum nodo de fora. Se alguma das rotas alternativas for mais econômica que a atual, ela é efetivada, caso contrário, mantém-se a rota anterior e repete-se o procedimento para outras k arestas. O algoritmo se encerra quando todas as combinações forem testadas. A complexidade computacional do procedimento k-ótimo é da ordem de O(n k ), o que faz com que na prática seja utilizado k = 2 ou k = 3 para evitar um aumento de complexidade. Para uma melhor compreensão heurística de Mole e Jameson, considere o exemplo da Figura 3(a). Inicialmente é montada uma lista de nodos livres com nos nodos 1, 2, 3, 4, e 5. Em seguida, uma nova rota é criada e o nodo 5 é selecionado para ser inserido nela, pois é o mais próximo do depósito. Após isto, é montada uma tabela com as distâncias de todos os nodos livres em relação à rota 0-5-0, que é mostrada na Tabela 2. Pela tabela se verifica que o nodo livre mais próximo da rota atual é o nodo 1. Como existem apenas dois nodos na rota, só existe um local para inserir o nodo 1. Mas segundo a fórmula 3, a economia obtida ao se inserir este nodo é de σ(i, l, j) = 2 10 + 3 10 20 = 7, o que significa que não é economicamente viável inserir outros nodos na rota 0-5-0. Isto se deve ao fato da distância entre o nodo 5 e o nodo 0 ser muito pequena em relação às demais distâncias, o que torna vantajoso ter uma rota apenas para este nodo.
i l j c il + c lj µc ij e 0 1 5 10 + 20 3 27 0 2 5 15 + 20 3 32 Tabela 2. Lista de proximidades da rota 0-5-0 Nestas circunstâncias, uma nova rota é criada, e o nodo 3 é selecionado para ser inserido nela, como mostra a Figura 3(b). Novamente são calculadas as distâncias dos nodos livres em relação a esta rota, como mostra a Tabela 3. Conforme os dados da tabela, o nodo 4 é o que deve ser selecionado para ser inserido na rota 0-3-0. Desta vez a i l j c il + c lj µc ij e 0 1 3 8 + 10 9 9 0 2 3 15 + 30 9 36 0 4 3 5 + 10 9 6 Tabela 3. Lista de proximidades da rota 0-3-0 economia resultante é de σ(i, l, j) = 10 2+9 5 10 = 14, de forma que o nodo 4 pode ser inserido na rota, como mostra a Figura 3(c). Após a inserção, a tabela de proximidades em relação a rota 0-4-3-0 é calculada e o nodo 1 é selecionado para ser inserido nesta rota. Como agora existem mais de dois nodos presentes na rota, a tabela de economias precisa ser calculada (Tabela 4) para determinar o melhor local de inserção. O nodo 1 é então i l j λc 0l e(i, l, j) σ(i, l, j) 0 1 4 2 10 + 10 10 15 5 3 1 4 2 10 + 5 15 8 4 2 0 1 3 2 10 + 9 10 8 11 Tabela 4. Lista de economias da rota 0-4-3-0 inserido na posição de maior economia, entre os nodos 0 e 3. O algoritmo prossegue desta forma até que todos os nodos lives estejam inseridos em alguma rota, como mostra a Figura 3(d). As rotas finais obtidas para este exemplo são 0-5-0 e 0-4-3-1-2-0. A heurística de Mole e Jameson, por ser um modelo mais aperfeiçoado, apresenta diversas vantagens em relação a heurística de Clark e Write, entre as quais podemos destacar o fato de que o resultado obtido é em geral bem melhor que o obtido com a heurística Clark e Wright. A principal desvantagem do algoritmo é a sua maior complexidade computacional. 4. Resultados Para que fosse possível obter um melhor entendimento das heurísticas, bem como para que fosse possível realizar experimentos com ambos os modelos, os dois algoritmos foram
(a) (b) (c) (d) Figura 3. Exemplo de aplicação da heurística de Mole e Jameson implementados utilizando a linguagem de programação C++. Em ambas as implementações, a leitura do grafo é realizada através de um arquivo texto cujo nome é informado através da linha de comando. Este arquivo, além da matriz de adjacência, possui outras informações necessárias para se implementar as restrições do modelo. As restrições implementadas foram: (a) Limite de combustível; (b) Tempo máximo para se percorrer as rotas; e (c) Capacidade máxima dos veículos. A medida que as rotas vão sendo calculadas, os programas exibem informações na tela relativas ao processamento realizado, de forma que o algoritmo possa ser compreendido facilmente. Ao final, são mostradas as rotas calculadas e a duração, o consumo de combustível e a ocupação dos veículos para cada uma delas. Para que fosse possível avaliar o desempenho dos dois algoritmos, foram geradas matrizes de adjacência aleatórias com 100, 500, 1000, 1500 e 2000 nodos. Cada matriz de adjacência foi testada com ambos os algoritmos, e os resultados obtidos são mostrados na Tabela 5, juntamente com os tempos de processamento (em segundos). Os custos indicados na Tabela 5 são as distâncias a serem percorridas em quilômetros. Pelos resultados Clark e Right Mole e Jameson Diferença Tamanho Tempo Custo Tempo Custo Tempo Custo 100 0.01 830.04 0.14 583.91 0.13 29.65% 500 0.57 1869.04 26.58 1239.57 26.01 33.67% 1000 4.20 2755.31 276.10 1782.23 271.90 35.32% 1500 19.62 3304.41 1096.47 2083.01 1076.85 36.96% 2000 46.23 3873.31 2973.83 2538.00 2927.60 34.47% Tabela 5. Comparações entre os dois algoritmos
obtidos, pode-se perceber que o algoritmo de Mole e Jameson é bem mais lento que o de Clark e Wright, e a diferença do tempo de processamento se torna maior a medida que cresce o número de nodos. Isto se deve a maior complexidade computacional deste algoritmo. Em termos de qualidade da solução obtida, pode-se notar claramente que o algoritmo de Mole e Jameson é superior ao de Clark e Wright, fornecendo rotas em média 35% mais econômicas. Isto se deve à heurística mais elaborada, que torna a solução mais próxima do ótimo. 5. Conclusões Os algoritmos de Mole e Jameson e de Clark e Wright possuem diversas similaridades entre si, principalmente pelo fato de ambos se basearem na maior economia para a construção das rotas. O algoritmo de Mole e Jameson, apesar de ser mais lento, é o mais indicado para ser utilizado, principalmente se o número de nodos não for muito elevado. Se este número for muito grande, pode ser mais vantajoso utilizar o algoritmo de Clark e Wright, devido a sua menor complexidade computacional. Futuramente a utilização de técnicas de Inteligência Artificial e Aprendizado de Máquinas, como as Redes Neurais Artificiais e os Algoritmos Genéticos [Mitchell 1997], poderão vir a ser utilizadas para se obter uma solução mais próxima do ótimo com um menor tempo de processamento. Referências Clark, G. and Wright, J. (1964). Scheduling of vehicles from a central depot to a number of delivery points. Opns. Res., 12:568 581. Cormen, T. H., Leiserson, C. E., Rivest, R. L., and Stein, C. (2002). Algoritmos - Teoria e Prática. Campus, Rio de Janeiro, 2 edition. Gaskell, T. J. (1967). Bases for the vehicle fleet scheduling. Opl. Res. Q, 18:281 294. Goldbarg, M. C. and Luna, H. P. (2000). Otimização Combinatória e Programação Linear - Modelos e Algoritmos. Campus, Rio de Janeiro. Karp, R. M. (1975). Neworks, 5:45 68. On the computational complexity of combinatorial problems. Melamed, I. I., Sergeev, S. I., and Sigal, I. K. (1990). The traveling salesman problem. Plenum Publishing Corporation, pages 1147 1173. Mitchell, T. (1997). Machine Learning. WCB, McGrall-Hill - Computer Science Series, Boston, MA. Mole, R. H. and Jameson, R. S. (1976). A sequencial routing-building algorithm employing a generalised savings criterion. Opl. Res Q, 27:503 512. Olivera, A. (2004). Heurísticas para problemas de ruteo de vehículos. Master s thesis, Instituto de Computación: Universidad de la República, Montevideo, Uruguay. Pelizaro, C. (2000). Avaliação de desempenho do algoritmo de um programa comercial para roteirização de veículos. Dissertação de mestrado, Escola de Engenharia de São Carlos, USP, São Carlos, SP.