A.2 Todas as instâncias do RWPostVRPB
3.4 Processo de Otimização
Não aplicamos métodos exatos de otimização nesta pesquisa. Fazemos o uso de algumas heurísticas clássicas e também implementamos algumas meta-heurísticas, estas por serem genéricas e por se adaptarem bem a diferentes problemas de tamanhos diferentes. Os algoritmos escolhidos foram: Busca Local (do inglês Local Search, LS); Busca Local Iterada (do inglês Iterated Local Search, ILS); Heurística Gulosa (HG); Recozimento Simulado (do inglês Simulated Annealing, SA); Busca Tabu (do inglês Tabu Search, TS); Busca Gulosa Aleatorizada e Adaptativa (do inglês Greedy Randomized Adaptative Search Procedure, GRASP); e Algoritmo Genético (AG). O objetivo principal desta etapa é demonstrar como os algoritmos podem ser utilizados na solução do problema.
Problemas de casos reais tendem a ser multi-objetivo e costumam apresentar algum tipo de conflito ao tentarem ser resolvidos simultaneamente (SIMON, 2013). Cabe ao decisor a tarefa de avaliar as melhores soluções dos objetivos conflitantes (ARROYO et al., 2002). Recorrer a uma abordagem com soma ponderada dos objetivos (DEB et al., 2002) ou mesmo trabalhar na fronteira de Pareto (TAN; CHEW; LEE, 2006), são algumas das formas existentes de se resolver problemas multi-objetivo. Entretanto, para este trabalho, decidimos iniciar da maneira mais simples possível: tratar o problema como mono-objetivo e otimizar as instâncias a partir do comprimento de rota apenas, mantendo a restrição de factibilidade pelo tamanho máximo do comprimento de rota de cada veículo, isto é, o tempo máximo de trabalho de cada carteiro. Todos os algoritmos que implementamos dependem de três métodos: (i) construção de uma solução inicial que será otimizada; (ii) permutação da solução atual para uma solução vizinha (mecanismo de troca); e (iii) a validação da solução (se atendeu as restrições). Note que clusterizações não são utilizadas.
3.4.1
Construção de uma Solução Inicial
Dado uma solução vazia, um algoritmo de construção trabalha iterativamente na adição dos candidatos à solução até que ela esteja completa (DORIGO; STÜTZLE, 2019). O algoritmo tende a construir melhores soluções iniciais caso ele avalie os candidatos disponíveis a entrar na solução do que adicionar aleatoriamente todos os candidatos. Neste trabalho, implementamos duas construções: aleatória; e gulosa.
Capítulo 3. Metodologia 39 Com excessão da HG, todos os algoritmos aqui fazem uso de uma construção aleatória. Isso implica que, na maior parte dos casos, as soluções iniciais serão muito ruins, deixando os algoritmos se encarregarem completamente da otimização. O Algoritmo 2 descreve a solução inicial desenvolvida através de uma construção aleatória. A factibilidade é analisada a cada vez que um vértice 𝑣 é escolhido para entrar na solução , fazendo o veículo retornar ao depósito caso a restrição não seja atendida.
Output:Uma solução inicial , factível.
1 ← ∅
2 𝑉 ← Selecione todos os vértices do grafo G 3 while não está completa do
4 𝑉′← Selecione os vértices não disponíveis na solução em construção (𝑉 − 𝑆) 5 𝑣 ← Selecione um vértice aleatório de 𝑉′
6 if ∪ 𝑣 não é factível then
7 ← ∪ 𝜋
8 end
9 ← ∪ 𝑣
10 end
11 return
Algoritmo 2:Construção de uma solução inicial aleatória.
Em comparação com a construção aleatória, os passos que diferem o desenvolvimento da construção gulosa apresentada nesse trabalho dependem de um simples método de ordenação crescente. Ao iniciar a construção, o algoritmo procura o candidato que esteja mais próximo do depósito e o inclui na solução . A cada nova inserção, os vértices disponíveis são reordenados, utilizando como critério o menor comprimento de rota dos vértices contidos na solução em relação aos disponíveis. Isso garante soluções iniciais mais estáveis para todos os tamanhos de instância que iremos trabalhar mas, em contrapartida, faz com que a solução seja sempre a mesma para cada instância. O Algoritmo 3 representa uma solução inicial gulosa. A factibilidade é tratada da mesma forma que na construção aleatória.
Output:Uma solução inicial , factível.
1 𝑉 ← Selecione todos os vértices do grafo G
2 Ordene 𝑉 em relação ao depósito 𝜋, do melhor para o pior 3 ← Selecione o primeiro vértice de 𝑉
4 while não está completa do
5 𝑉′← Selecione os vértices não disponíveis na solução em construção (𝑉 − 𝑆) 6 Ordene 𝑉′em relação ao último vértice disponível em , do melhor para o pior 7 𝑣 ← Selecione o primeiro vértice de 𝑉′
8 if ∪ 𝑣 não é factível then
9 ← ∪ 𝜋
10 end
11 ← ∪ 𝑣
12 end
13 return
3.4.2
Mecanismos de Troca
Os mecanismos de troca são utilizados para a melhoria das soluções, através da intensificação do espaço de busca. Dado uma solução , um pequeno movimento de troca entre as arestas ou entre os vértices deve ser aplicado para produzir uma solução ′ adjacente (ou vizinha), com
o objetivo de reduzir o custo total da solução.
Flood (1956) introduziu a idéia básica de troca por arestas, sendo aplicada em um algoritmo 2-Opt, que realiza a troca entre apenas duas arestas a cada movimento (CROES, 1958). A Figura 3.12 exemplifica as etapas necessárias na troca por arestas. Os clientes 𝑐𝑖, 𝑐𝑘, escolhidos
aleatoriamente, são utilizados para selecionar uma faixa da solução e, então, esta faixa é invertida.
Figura 3.12: Ilustração de uma troca por arestas. Fonte: elaborado pelo autor.
Na troca por vértices, conhecida como 2-Troca (WATERS, 1987), dois clientes 𝑐𝑖, 𝑐𝑘 que
pertecem a uma dada solução são escolhidos aleatoriamente e são trocados de posição, gerando uma solução vizinha. A Figura 3.13 mostra as etapas da troca por vértice.
Figura 3.13: Ilustração de uma troca por vértices. Fonte: elaborado pelo autor.
Após a troca ser realizada, para ambos os mecanismos, a factibilidade é imediatamente analisada e, caso a nova solução não atenda as restrições (infactível), a solução de entrada
Capítulo 3. Metodologia 41 deve retornar intacta. Os Algoritmos 4 e 5 mostram os passos para gerar vizinhos com 2-Opt e 2-Troca, respectivamente.
Input:Uma solução inicial .
Output:Uma solução vizinha factível ′com as arestas trocadas em relação à . Na impossibilidade da rota vizinha ser factível,
retorna a solução inicial .
1 ′← ∅
2 Selecione dois inteiros aleatórios 𝑖, 𝑘 ∈ {0, tamanho de }, tais que 𝑖 < 𝑘 3 ′← Selecione clientes ((𝑐0,𝑐𝑖) ∪ reverso (𝑐𝑖,𝑐𝑘) ∪ (𝑐𝑘+1, 𝑐.𝑡𝑎𝑚𝑎𝑛ℎ𝑜)) ∈ 4 if′é factível then
5 return′
6 end
7 return
Algoritmo 4:Troca por arestas.
Input:Uma solução inicial .
Output:Uma solução vizinha factível ′com os clientes trocados em relação à . Na impossibilidade da rota vizinha ser
factível, retorne a solução inicial .
1 ′←
2 Selecione dois inteiros aleatórios 𝑖, 𝑘 ∈ {0, tamanho de ′}, tais que 𝑖 ≠ 𝑘 3 Selecione dois clientes aleatórios 𝑐𝑖e 𝑐𝑘∈
4 Troque 𝑐𝑖com 𝑐𝑘 5 if′é factível then
6 return′
7 end
8 return
Algoritmo 5:Troca por vértices.