Uma abordagem para o problema da optimização de
rotas de veı́culos baseada em operadores genéticos
Introdução
A versão básica do Problema de Optimização de Rotas de Veı́culos (PORV), genericamente conhecido na literatura de lı́ngua inglesa por “Vehicle Routing Problem”, consiste em determinar
um conjunto de rotas a efectuar por uma frota de veı́culos, a partir de um depósito central, para
servir um conjunto de clientes. O número de veı́culos e as suas capacidades, as localizações e
procuras dos clientes, bem como a localização do depósito são conhecidas. Pretende-se, então,
determinar quais os clientes que serão servidos por cada veı́culo e qual a configuração das rotas
a efectuar pelos veı́culos de forma a minimizar a distância total percorrida.
O PORV é um Problema de Optimização Combinatória pertencente à classe dos problemas
NP –difı́ceis [12]. Os algoritmos exactos raramente podem ser usados para resolver, em tempo
útil, instâncias com mais de 50 clientes, mesmo para instâncias menores (com menos de 50
clientes) estes métodos são lentos [4], [9]. Nos poucos casos em que instâncias com 100 clientes
foram resolvidas exactamente, é referido que ou não foi necessário recorrer à Pesquisa em
Árvore, ou o número de vértices da árvore que foi necessário pesquisar era muito pequeno [4].
Assim, a maior parte da investigação sobre o PORV tem-se dirigido a métodos heurı́sticos.
Mais recentemente, várias meta-heurı́sticas e algoritmos hı́bridos têm sido desenvolvidos para
o PORV. Podem-se citar, entre outros, o algoritmo hı́brido [13] que combina Arrefecimento
Simulado e Pesquisa Tabu, o algoritmo baseado num Sistema de Colónia de Formigas [1] e os
trabalhos baseados em algoritmos de Pesquisa Tabu [6], [11], [15] e [18].
Neste trabalho, descreve-se uma heurı́stica baseada em operadores genéticos e os resultados
computacionais obtidos num conjunto de problemas-teste conhecidos da literatura. Apresentase, na secção 2, uma formalização matemática para o PORV. Na secção 3, descreve-se o Algoritmo Genético desenvolvido e implementado. Apresenta-se, na secção 4, o estudo computacional realizado, os resultados obtidos e respectiva análise. Finaliza-se com algumas conclusões
e comentários, na secção 5.
2
Formalização
Apresenta-se uma formalização do PORV como um problema de Programação Não Linear com
variáveis binárias [5], por ser a que está subjacente ao algoritmo desenvolvido neste trabalho.
Considerem-se as constantes:
n – o número de clientes
(o depósito corresponde ao ı́ndice 0)
m – o número de veı́culos
− a distância entre i e j , i , j = 0, ..., n
cij
qi
− a procura do cliente i , i = 1, ..., n
Q – a capacidade de cada veı́culo
e as variáveis:
(
xijk =
yik =
(
1 , se o veı́culo k vai de i para j directamente
0, caso contrário
1, se o cliente i é servido pelo veı́culo k
0, caso contrário
Seja yk = (y0k , y1k , ... , ynk )
então tem-se:
min
X
f (yk )
(1)
k
s.a
X
(
yik
=
X
qi yik ≤
k
1
m
, i = 1, ..., n
, i = 0
(2)
, k = 1, ..., m
(3)
, i = 0, ..., n ; k = 1, ..., m
(4)
Q
i
yik ∈ {0, 1}
em que para cada k , k = 1, ..., m
f (yk ) = min
X
ci j x i j k
(5)
i,j
s.a
X
xijk
= yik
, i = 0, ..., n
(6)
X
xijk
= yjk
, j = 0, ..., n
(7)
j
i
X
xijk
≤ |S| − 1 , para todo o S ⊆ {1, ..., n} tal que 2 ≤ |S| ≤ n − 1
(8)
i,j∈S xS
xijk ∈ {0, 1}
, i, j = 0, ..., n
(9)
O objectivo (1) é minimizar uma soma de funções não lineares, f (yk ). O valor de f (yk ),
para cada k, k = 1, ..., m, é obtido resolvendo um subproblema cuja função objectivo (5)
minimiza a distância percorrida por cada veı́culo, para servir um determinado subconjunto de
clientes. As restrições (2) garantem que os clientes estão afectos a um veı́culo e que o depósito
é servido por todos os veı́culos. As condições (3) não permitem que as capacidades dos veı́culos
sejam excedidas. As restrições (4) definem as variáveis como binárias. Além disso, em cada
subproblema as restrições (6) e (7) obrigam a que um veı́culo que chega a um cliente também
parta desse cliente e a que cada cliente seja visitado por exactamente um veı́culo. As restrições
(8) garantem que não existem subcircuitos que não contenham o depósito. As condições (9)
definem as variáveis do subproblema como binárias.
Esta formalização engloba dois Problemas de Optimização Combinatória. Por um lado, as
restrições (2), (3) e (4) têm a estrutura de um Problema de Afectação Generalizada, onde é
determinada a afectação dos clientes aos veı́culos. Por outro lado, para as variáveis y ik fixas
satisfazendo (2), (3) e (4) e para cada veı́culo k, cada parcelaf (y k ) da função objectivo (1),
dada por (5) a (9), define um Problema do Caixeiro Viajante (PCV), onde é estabelecida a
configuração de cada rota. Assim, nesta formalização o PORV é definido como um Problema
de Afectação Generalizada Não Linear.
3
Uma Implementação de um Algoritmo Genético
Os Algoritmos Genéticos (AGs) foram inicialmente desenvolvidos para resolver problemas
da área de Inteligência Artificial [10]. Baseiam-se fortemente em processos aleatórios e em
probabilidades. Como é do conhecimento geral, este método utiliza um conjunto de soluções
(população) que, em cada iteração (geração), são combinadas (reprodução) originando uma
nova população. Assim, algumas cópias dos indı́viduos da população actual são escolhidas
(selecção) para, por aplicação de operadores genéticos (cruzamento e mutação), produzirem
outros indivı́duos que vão fazer parte, alguns ou todos, de uma nova população. Estes aspectos
envolvidos nos AGs são descritos detalhadamente em [7].
Codificação dos Indivı́duos
Apesar de os AGs terem surgido baseados numa codificação binária dos indivı́duos [7], [10],
tem-se mostrado necessária a utilização de outro tipo de codificação, nomeadamente em alguns
Problemas de Optimização Combinatória [14].
Para o PORV a codificação binária não parece adequada. Uma alternativa natural seria
usar abordagens análogas às que têm sido utilizadas para o PCV [14]. No entanto, no PCV
tem-se apenas uma rota e no PORV tratam-se mrotas, com número de clientes por rota e
subconjunto de clientes em cada rota diferentes de uma solução para outra. Assim, considerouse que as representações já utilizadas para o PCV, também não seriam muito adequadas para
o PORV.
Então, optou-se por codificar cada indivı́duo xi , i = 1,...,Pop, por um vector com n
variáveis,xij , j = 1,...,n, onde n é o número de clientes do problema, podendo cada variávelx ij
tomar um valor de 1 a m, onde m é o número de veı́culos, previamente definido.
Neste caso, em vez de um indivı́duo representar a configuração das rotas, representa as
afectações dos clientes aos veı́culos. De acordo com a formalização dada anteriormente tem-se:
y0k = 1 e yjk =
(
1 se xij = k
0 caso contrário
Por exemplo, o indivı́duo [1 1 3 2 2 2 2 3 1 2]
indica que:
, j = 1, ..., n; k = 1, ..., m
(10)
os clientes 1, 2, 9 são servidos pelo veı́culo 1,
os clientes 4, 5, 6, 7, 10 são servidos pelo veı́culo 2,
os clientes 3, 8 são servidos pelo veı́culo 3.
e, de acordo com (10), tem-se:
y11 = 1 , y21 = 1 , y91 = 1 ,
y42 = 1 , y52 = 1 , y62 = 1 , y72 = 1 , y10 2 = 1 ,
y33 = 1 , y83 = 1 ,
sendo as restantes variáveis yij iguais a zero. Esta afectação dos clientes aos veı́culos é uma
solução admissı́vel do Problema de Afectação Generalizada se verificar as restrições (2), (3) e
(4).
Represente-se por f xi o valor da função objectivo (1), para cada indivı́duo xi . Este
valor é igual à distância total percorrida pelos m veı́culos para servirem os clientes de acordo
com a afectação definida por esse indivı́duo e verificando as restrições (6) a (9). Para cada
veı́culo k, k = 1, ..., m, e respectiva afectação yk = (y0k , ..., ynk ) obtida segundo (10), a rota
a efectuar (valores de xijk ) e a distância a percorrer (valor de f (yk )) são determinadas através
da resolução de um PCV. Assim vem:
Nesta implementação, os PCV foram resolvidos heuristicamente, devido ao facto do PCV ser
também um problema pertencente à classe dos problemas NP –difı́ceis. Utilizou-se o Método
da Inserção Mais Afastada, por ser computacionalmente muito rápido e se encontrarem bons
resultados referidos na literatura [8], [17].
População Inicial
Em geral, nos AGs a população inicial é gerada aleatoriamente, o que, neste caso, produziria soluções não admissı́veis. Assim, optou-se por gerar a população inicial heuristicamente,
através de um algoritmo do tipo construtivo de rota descrito em [16]. As m rotas são formadas
paralelamente e os clientes são inseridos nas rotas segundo uma abordagem ávida. O algoritmo
é inicializado escolhendo m clientes e formando m rotas do tipo depósito–cliente–depósito. Seguidamente, em cada iteração, insere-se em cada rota o cliente que não viola as restrições e
minimiza o aumento da distância percorrida pelo veı́culo para o inserir entre os clientes que
já estão nessa rota.
Depois executam-se, para cada indivı́duo, procedimentos melhorativos, descritos em [16],
que consistem na mudança de clientes de veı́culos com a sua capacidade quase ou completamente preenchida (mais de 95%) para outros com mais capacidade livre (menos de 90%), e na
troca de 1 ou 2 clientes entre rotas, desde que a distância total percorrida seja menor.
Em geral, ao mudar os clientes iniciais de cada rota, as afectações subsequentes são diferentes levando a outra solução. Desta forma, variando a escolha dos m primeiros clientes a
serem inseridos, pode-se gerar os Pop indivı́duos para formar a população inicial. Para 3 dos
indivı́duos escolheram-se os clientes iniciais com base na localização e/ou procura dos clientes.
Para os restantes Pop - 3 indivı́duos, geraram-se aleatoriamente os clientes iniciais.
Tabela 1: Aptidão, roleta, ponteiro e indivı́duos seleccionados para uma população de 10 indivı́duos
(selecção SUS)
Função de Aptidão e Selecção
As formas de seleccionar a população baseiam-se na aptidão dos indivı́duos (valor da função
objectivo, classificação dos indivı́duos, etc.). Utilizou-se a selecção SUS (“Stochastic Universal
Sampling”), da seguinte forma:
Ordenaram-se os indivı́duos pelo valor da função objectivo (dada em (11)). Atribuiu-se
uma aptidão 0 ao pior indivı́duo e uma aptidão 2 ao melhor. Aos outros indivı́duos foram
atribuı́das aptidões entre 0 e 2 de acordo com a sua classificação e igualmente espaçadas.
Assim, sendo
perm (i) o vector que indica a classificação (de 0 a Pop-1) do indivı́duo i na população;
e const = 2 /P op − 1 .
a função de aptidão é dada por:
A partir dos valores da aptidão construiu-se uma roleta como se exemplifica na tabela
1. Seguidamente, gerou-se um número aleatório uniformemente distribuı́do no intervalo [0, 1]
e, adicionando sucessivamente uma unidade a esse número, formou-se um ponteiro múltiplo
igualmente espaçado que permite identificar os indivı́duos a seleccionar, como exemplificado
na tabela 1.
Cruzamento
Agruparam-se, aleatoriamente, os indivı́duos seleccionados em pares (pais), de modo que não
haja pares com elementos iguais (se, em algum caso, a população convergir e deixarem de
existir indivı́duos diferentes o algoritmo termina). Obtiveram-se dois novos indivı́duos (filhos)
trocando, no máximo, uma certa percentagem dos valores das variáveis que ocupam as mesmas
posições nos vectores pais, correspondentes aos números aleatórios gerados uniformemente no
intervalo [1, n]. Esta troca só se efectuou quando a solução se mantinha admissı́vel. Por
exemplo, sejam:
e o número máximo de variáveis a trocar igual a 4. Então, geram-se 4 números aleatórios
diferentes no intervalo [1, 12], (por exemplo 5, 7, 1, 8). Se a capacidade dos veı́culos permitir
as duas primeiras trocas e não permitir a terceira, obtêm-se:
Com este tipo de actuação do operador cruzamento obtêm-se afectações, em geral, com
agrupamentos de clientes pouco diferentes dos existentes nas afectações que lhes deram origem. No entanto, esta troca aleatória de clientes entre agrupamentos possibilita uma pesquisa
diversificada pelo espaço das afectações admissı́veis. Como, durante o algoritmo, em cada
iteração são executados vários cruzamentos entre afectações distintas é esperado que alguns
deles possam conduzir às melhores afectações dos clientes aos veı́culos.
Após esta operação, dos quatro indivı́duos envolvidos (pais e filhos) em cada cruzamento,
passam a fazer parte da nova população os dois mais aptos.
Mutação
De acordo com a forma como se definiu o operador cruzamento é esperado que a sua actuação produza uma pesquisa diversificada no espaço das afectações admissı́veis dos clientes
aos veı́culos e que a intensifique em torno das melhores afectações. Mas, se por um lado a aleatoriedade da pesquisa deverá, em termos probabilı́sticos, encontrar boas afectações, por outro
lado o facto de não ter em conta a configuração das rotas, pode trazer algumas desvantagens.
Assim, substituiu-se o operador mutação usual por outro, que tem em conta a configuração
das rotas e a distância nelas percorrida, baseado em procedimentos de k-trocas de clientes
entre rotas. Utilizaram-se, para isso, os procedimentos melhorativos, referidos anteriormente,
incluı́dos na heurı́stica construtiva de rota utilizada para gerar a população inicial. Aplicaramse, uma vez em cada geração, estes procedimentos aos indivı́duos resultantes de cruzamentos
admissı́veis e também, no final, à melhor solução obtida durante as várias gerações. Quando a
aplicação do operador mutação, assim definido, tornava o indivı́duo mais apto, este substituı́a
o que lhe deu origem.
O operador cruzamento, neste AG, actua especialmente a nı́vel das afectações de clientes
aos veı́culos, provocando, em cada iteração, pequenas alterações nas soluções. O operador
mutação (procedimentos melhorativos) também provoca algumas alterações nas afectações
mas actua, principalmente, a nı́vel das configurações das rotas a partir das trocas de clientes
efectuadas entre as rotas correspondentes às afectações de cada indivı́duo.
4
Experiência Computacional
Testou-se o AG descrito num conjunto de problemas-teste conhecidos da literatura (tabela 2),
e disponı́veis na Internet, no endereço http://branchandcut.org/VRP/data.
Tipo dos dados
Gerados uniformemente.
Iguais ao 8, com outro número e capacidade
dos veı́culos.
Iguais ao 11, com outro número e capacidade dos veı́culos.
Obtidos a partir de aplicações a casos reais.
Estruturados - os clientes formam grupos
(clusters).
Junção dos clientes dos problemas 5 e 11.
Junção dos clientes do problema 18 com os
primeiros 49 clientes do problema 8.
As suas caracterı́sticas estão resumidas na tabela 3. Nesta tabela os valores do número de
veı́culos e da melhor solução (ou da solução óptima) são os que constavam dos ficheiros com
os dados obtidos da Internet. Os valores sublinhados correspondem à solução óptima.
Todos estes ficheiros de dados contêm as coordenadas cartesianas do depósito e dos clientes. Calcularam-se as distâncias utilizando reais e arredondaram-se os resultados à unidade,
trabalhando com uma matriz de distâncias inteiras.
O algoritmo foi implementado em Turbo C e executado num PC com um processador
Pentium MMX 200 MHz e com 16 MB de RAM.
Após algumas experiências, com diferentes valores para os parâmetros utilizados, optou-se
por fixá-los como está indicado na tabela 4.
Além de se terem comparado as soluções obtidas através do AG, com as melhores conhecidas, utilizaram-se também, para comparar principalmente os tempos de execução computacional, outros dois algoritmos. Escolheram-se: uma heurı́stica de duas fases [16], computacionalmente muito rápida e a heurı́stica construtiva de rota, que serviu para gerar a população
inicial, mas recorrendo só aos três critérios de escolha do cliente inicial já mencionados. Na
primeira fase da heurı́stica de duas fases, os clientes são afectos aos veı́culos de uma forma
semelhante à do algoritmo descrito em [2], e na segunda fase utiliza-se o Método da Inserção
Mais Afastada para resolver heuristicamente os PCV envolvidos. No fim, à solução obtida são
aplicados os procedimentos melhorativos utilizados no AG. Com esta implementação obtêm-se
duas soluções. Numa os clientes são afectos aos veı́culos sequencialmente e na outra paralelamente. Com a heurı́stica construtiva de rota obtêm-se três soluções, pois, como já se referiu,
utilizaram-se três critérios diferentes para a escolha dos clientes iniciais. Comparou-se a melhor das soluções obtidas com cada um destes métodos com a obtida pelo AG. Repare-se que,
qualquer um destes métodos pode, devido ao número de veı́culos estar previamente definido,
não obter solução admissı́vel se ficarem clientes por servir.
Estas duas heurı́sticas também foram implementadas em Turbo C e executadas no mesmo
PC.
Tabela 3: Caracterı́sticas dos problemas-teste
Tabela 4: Valores dos parâmetros utilizados nos testes computacionais.
No clientes ≤ 50
Percentagem
máxima de
variáveis a trocar
em cada
cruzamento
90
No clientes > 50
Dimensão da
População
No máximo de
gerações
Dimensão da
População
No máximo de
gerações
Tabela 5: Comparação entre a melhor solução conhecida, e as soluções obtidas com o algoritmo de
duas fases, o algoritmo construtivo de rota e o AG.
Apresenta-se um quadro comparativo (tabela 5) entre o AG, estas duas heurı́sticas e a
melhor solução inteira conhecida. Nas tabelas desta secção tem-se:
sol - solução obtida
sol* - melhor solução conhecida, (que é a óptima se o valor estiver sublinhado)
dp - diferença percentual, sendo
dp =
sol − sol∗
x 100
sol
Verifica-se que a solução obtida com o AG atinge em 3 instâncias o óptimo, em 1 (problema
17) obtém um valor melhor do que a melhor solução inteira conhecida, em 4 está a menos de
2% da melhor solução conhecida. No total, em 12 dos 19 problemas a solução obtida com o
AG está a menos de 5% da melhor solução conhecida, o que já não ocorre com as outras duas
heurı́sticas. Enquanto as outras duas heurı́sticas obtêm as melhores soluções para os dados de
[3], o AG obtém, também, muito boas soluções para os problemas de menor dimensão deste
conjunto, mas já não obtém bons resultados para os de dimensão 75 e 100.
Nas instâncias para as quais este algoritmo obteve as melhores soluções, a procura é, em
geral, inferior a 95% da capacidade total dos veı́culos. No entanto, este facto não explica o bom
comportamento do algoritmo, visto noutras instâncias, em que a procura total dos clientes é
igual ou menor que 95% da capacidade total dos veı́culos, não se obterem bons resultados,
enquanto que numa instância em que a procura total é cerca de 98% da capacidade total
(problema 17) obtém-se uma solução muito boa. Parece, pois, não ser muito significativa a
relação entre o comportamento do algoritmo e a percentagem de ocupação dos veı́culos. Mas,
nas instâncias em que a procura total dos clientes esteja muito próxima da capacidade total
dos veı́culos, este AG não deve ser muito eficiente, visto ser mais provável que a maioria das
trocas de valores entre os indivı́duos pais conduzam a soluções não admissı́veis Assim, o AG
pode terminar sem que tenha causado grandes alterações à população inicial. Isto ocorreu nos
problemas 8 e 9.
É de salientar que os melhores resultados obtidos com o AG correspondem aos problemas
de [4], extraı́dos de aplicações reais e aos problemas 16 e 17, que são os únicos que têm os
clientes em grupos [2]. Como, normalmente nas aplicações reais os clientes estão agrupados é
de esperar que o algoritmo tenha um bom funcionamento na resolução de problemas reais.
Em relação aos tempos de execução computacional nota-se que os correspondentes ao AG
são bastante superiores aos dos outros dois algoritmos (ambos muito rápidos, principalmente
o de duas fases). No entanto, o tempo de execução do AG foi em geral inferior a 5 minutos,
mesmo trabalhando com uma população de 80 indivı́duos, o que é ainda razoável. Em contrapartida os resultados obtidos com o AG foram sempre melhores (na média a dp foi de 3%
contra 12% e 18% dos outros algoritmos), o que justifica o acréscimo de tempo computacional.
Constata-se, assim, que este AG é mais eficiente do que algumas heurı́sticas (construtiva e
de duas fases). Em relação às melhores soluções conhecidas obtidas com métodos muito mais
elaborados, já não é tão eficiente.
5
Conclusões e Trabalhos Futuros
Adaptar um Algoritmo Genético ao PORV não foi tarefa fácil. As maiores deficiências da
abordagem realizada devem-se a:
(i) Não se ter permitido que na geração da população inicial fossem produzidos indivı́duos
(soluções) que violassem as restrições, o que obrigou a utilizar uma heurı́stica para gerar
a população inicial;
(ii) Na aplicação dos operadores genéticos também não foram permitidas violações das restrições;
(iii) Cada indivı́duo representar uma afectação dos clientes aos veı́culos e não uma solução
(as rotas) do PORV.
Em relação aos aspectos (i) e (ii) também se fizeram experiências gerando aleatoriamente
a população inicial e permitindo violações das restrições, mas obtiveram-se fracos resultados.
Nestas experiências penalizaram-se os indivı́duos não admissı́veis atribuindo-lhes uma aptidão
menor. Assim, não eram escolhidos para se reproduzirem tantas vezes como os indivı́duos admissı́veis, o que pode ter contribuı́do para os fracos resultados desta abordagem. A utilização
de indivı́duos não admissı́veis de uma outra forma que lhes permita serem seleccionados mais
vezes para reprodução, combinando-os com indivı́duos admissı́veis poderá diversificar a pesquisa.
O aspecto (iii) pode levar a que, eventualmente, se encontre a melhor afectação possı́vel dos
clientes aos veı́culos, e nesse sentido o Algoritmo Genético seja muito eficiente, mas as rotas dos
veı́culos, para servirem os clientes que lhes estão afectos, obtidas através da resolução heurı́stica
dos PCV não sejam as melhores. Assim, a solução do PORV pode não ser a óptima mesmo
tendo sido obtida a afectação óptima dos clientes aos veı́culos. A determinação das rotas
óptimas, para uma afectação obtida pelo Algoritmo Genético, envolvia a resolução exacta de
um PCV para cada veı́culo, o que é proibitivo em termos de tempo de execução computacional.
Este algoritmo poderá eventualmente ficar mais eficiente mediante algumas alterações que
tenham em conta os aspectos (i), (ii) e (iii) focados atrás. As alterações, que podem ser
testadas, separadamente ou em conjunto em trabalhos futuros, são:
• Utilizar heurı́sticas mais eficientes para a resolução dos PCV envolvidos;
• Permitir afectações não admissı́veis, testando outros métodos de as penalizar, por exemplo, recorrendo a parâmetros penalizadores incluı́dos no cálculo da função objectivo;
• Alterar a actuação dos operadores genéticos tendo em conta que as soluções podem ser
avaliadas segundo dois critérios. Um relativo à violação das restrições de capacidade e o
outro às distâncias percorridas;
• Gerar a maior parte da população inicial aleatoriamente e somente alguns (poucos)
indivı́duos heurı́sticamente.