• Sonuç bulunamadı

Uma implementação da metaheurística GRASP (FEO; RESENDE, 1995) é proposta como terceira alternativa para tratamento do problema. O GRASP é um procedimento iterativo em que cada iteração consiste de uma fase de construção de uma solução inicial seguida de uma fase de melhoria. A solução inicial é gerada, identificando-se o conjunto de possíveis componentes (nós, arcos, itens, entre outros) da solução em construção, ordenados de maneira decrescente com respeito ao ganho medido pela função gulosa. Uma função de avaliação seleciona então, iterativa e aleatoriamente, um elemento de uma lista restrita de componentes candidatos (LRC), cujas limitações impostas asseguram que se eleja um movimento bom, ainda que não ótimo localmente, até que todos os componentes sejam incluídos na solução ou que não haja inclusões factíveis. A melhor solução gerada (e melhorada) dentre todas as iterações do GRASP é, portanto, a solução fornecida pelo método.

Nessa pesquisa a construção da solução é dada pela inserção de nós clientes, sendo a seleção limitada aos nós com atendimento mais restrito. Assim como ocorre com a heurística construtiva determinística (Seção 5.1), o processo de inserção de nós não garante a satisfação das restrições de carga mínima na 2ª viagem; por esta razão, a heurística probabilística 1. Gere uma solução inicial com a heurística construtiva determinística (Seção 5.1). Seja a

temperatura inicial, α o programa de resfriamento, o número de iterações em cada temperatura, a temperatura final, e qtdtry o número de tentativas por uma solução vizinha factível em uma dada vizinhança de busca .

2. Seja o tempo máximo de aplicação do algoritmo. Faça = e ∗(solução incumbente) = .

3. Repita

3.1. Faça (índice da vizinhança a ser utilizada) = 0.

3.2. Para o número de iterações = 1 até na temperatura , 3.2.1. Faça = (( + 1) 3) e = 0.

3.2.2. Selecione aleatoriamente uma solução vizinha ´ de com a vizinhança até obter ´ factível ou atingir o número máximo de tentativas .

3.2.3. Caso seja obtida ´ factível,

3.2.3.1. Calcule = ( ´)– ( ), ou seja, a diferença entre os valores da função objetivo de e ´.

3.2.3.2. Se (0,1) < (− / ) ou < 0, faça = ’. 3.2.3.3. Se ( ) < ( ∗), faça = .

3.3. Faça = ( ).

Até que > ou tenha transcorrido. 4. Retorne a solução ∗.

também inclui o procedimento de factibilização descrito na Seção 5.1.2. Os passos gerais dessa abordagem são descritos na Figura 27.

Figura 27: Passos da heurística construtiva probabilística do algoritmo GRASP.

5.5.1 A heurística de inserção de nós

A solução inicial é gerada conforme descrito na Figura 28. Duas listas restritas de candidatos são criadas, sendo cada uma aplicada em um momento diferente da construção. No primeiro momento, a lista contempla todos os nós do segmento restaurantes (passo 3.1.1), ou seja, que possuem janelas de tempo. Desta forma, esse subconjunto de nós com menores oportunidades de inserção é priorizado. No segundo momento, a lista contempla % (em que é um parâmetro da heurística) dos demais nós não roteados, cuja inserção é avaliada segundo os critérios <menor quantidade de veículos compatíveis, maior demanda>, favorecendo desta forma, nós com atendimento mais restrito (passo 3.1.1). De cada LRC, seleciona-se aleatoriamente nós dentre os listados para serem inseridos na melhor posição dentre todas as viagens correntes que podem servi-los (passo 3.1.2) ou caso isso não seja possível, para inicializar uma viagem com o veículo com atendimento mais restrito que pode servi-los.

Note que como a escolha do nó cliente é aleatória, nós cuja tentativa de incorporação na solução não foi bem-sucedida são adicionados ao conjunto , o qual é sempre desconsiderado na composição das listas restritas de candidatos (passo 3.1.1). Desta forma, evita-se que estes nós sejam sorteados novamente nas iterações seguintes.

A fase de pós-processamento de cada solução gerada pela heurística construtiva probabilística é, então, realizada pela heurística de busca local, descrita na Seção 5.3.

1. Para o conjunto de veículos e de nós clientes a serem roteados, gere a solução , aplicando a heurística probabilística de inserção de nós descrita na Seção 5.5.1.

2. Caso possua rotas com restrições de carga mínima da 2ª viagem violadas, aplique a heurística de factibilização descrita na Seção 5.1.2.

3. Caso a solução obtida no passo anterior também possua rotas com restrições de carga mínima da 2ª viagem violadas, elimine essas rotas, tornando não roteados os nós servidos por ela. Seja a solução resultante.

Figura 28: Passos da heurística de inserção da heurística construtiva probabilística do procedimento GRASP.

1. Inicialização: Para a instância em questão, faça (conjunto de nós clientes não roteados) = ,

(conjunto de nós clientes cuja incorporação na solução foi mal sucedida) = ∅, (conjunto de nós clientes supermercados),

(conjunto de veículos ociosos) = (conjunto da frota duplicada),

(variável booleana que indica a necessidade da criação de uma nova viagem) = falso e = ∅.

2. Construção da lista : Divida o conjunto de veículos em subconjuntos de veículos da frota própria e fretados, e subdivida cada um desses subconjuntos em subconjuntos menores de veículos originais e de veículos cópias. Para cada um desses subconjuntos menores, ordene os veículos segundo os seguintes critérios: (1) menor quantidade de clientes compatíveis, (2) sujeito à restrição de circulação no centro, e (3) menor capacidade, de maneira que o critério resolve a ordenação de nós que obtiveram a mesma ordenação com o critério -1. Obtenha a lista , ordenando os subconjuntos menores (internamente ordenados) segundo os seguintes critérios: (1) veículos originais da frota própria, (2) veículos cópia da frota própria, (3) veículos originais fretados, e (4) veículos cópia fretados.

3. Para a lista restrita de candidatos , = 1 até 2, faça Repita

3.1.1. Construção da lista restrita de candidatos:

Se = 1, construa com os nós clientes ∈ ( ∩ ) −

Caso contrário ( = 2), ordene o conjunto de nós clientes − − segundo os seguintes critérios: 1) menor quantidade de veículos compatíveis, e (2) maior demanda, de maneira que o critério 2 resolve a ordenação de nós que obtiveram a mesma ordenação com o critério 1. Construa com % dos nós, seguindo a ordenação.

Se ≠ ∅, faça

3.1.1.1. Se = ou = , faça

Inicialização de viagens: Selecione aleatoriamente um nó da lista (nó ) e o veículo de menor ordem da lista (veículo ) que pode servir sem violar nenhuma restrição do problema, com exceção da restrição de carga mínima para 2ª viagem. Se não houver o par ( , ), faça = + { } e vá para o passo 3.1.1. Caso contrário, inicialize com a viagem associada ao veículo , designando a o número máximo de entregadores para o tipo de (2 entregadores se em bairro perigoso, 3 entregadores se em bairro não perigoso). Faça = − { }.

Caso contrário, faça

Inserção de nós em viagens correntes: Selecione aleatoriamente o nó de menor ordem na lista que pode ser servido em uma das viagens correntes e, desconsiderada a restrição de carga mínima para 2ª viagem, sua posição de inserção factível que implique em menor aumento de custo à solução parcial. Se não houver com inserção factível, faça

= e vá para o passo 3.1.2.

3.1.1.2. Atualização da solução parcial: Atualize a capacidade de e calcule a programação da viagem, considerando que se ∈ (conjunto de veículos originais), a partida de do depósito central ocorre no instante zero; caso contrário, a partida de é igual ao instante de retorno do veículo original associado a , adicionado do tempo de carregamento ( ). Seja a solução parcial corrente. Faça = − { } e retorne ao passo 3.1.1. Até que = ∅.