• Nenhum resultado encontrado

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.

Documentos relacionados