• Nenhum resultado encontrado

Pseudocódigo do GRASP com VND e path-relinking

A solução inicial de cada iteração do GRASP é gerada a partir de um dos algoritmos construtivos semi-gulosos, descritos na seção 5.2. A ordem

utilizada para os operadores de busca local no VNS e no VND é a mesma utilizada na implementação das próprias meta-heurísticas (capítulo 6).

Ao final da execução do VNS/VND, a meta-heurística compara a solução atual com a melhor solução já encontrada, e substitui esta caso a solução atual tenha um lucro maior. Caso contrário, é aplicada a etapa do path- relinking. A solução final e a melhor solução já encontrada pela meta- heurística são utilizadas como origem e destino do path-relinking. Buscando uma maior variedade na busca, cada algoritmo é executado duas vezes, trocando a solução de origem com a solução de destino. Como foram implementados 2 algoritmos de path-relinking, no total são realizadas 4 execuções de path-relinking. As soluções resultantes são comparadas com a melhor solução já encontrada, e aquela que tiver o maior lucro é considerada a nova maior solução encontrada.

Após o melhoramento (ou após o path-relinking, caso este tenha sido aplicado) e após a atualização da melhor solução, a meta-heurística volta para a sua etapa inicial, onde uma nova solução é construída por meio de um algoritmo semi-guloso, e então é repassada para a fase de melhoramento. São executadas múltiplas iterações, até que a condição de parada estipulada seja alcançada.

Como neste trabalho foram implementadas várias opções de construtivos semi-gulosos, foram implementadas duas versões do GRASP variando entre utilizar VNS ou VND, e como o uso do path-relinking no GRASP não é obrigatório, foram criadas no total 8 versões da meta-heurística, sendo necessário compara-las para então escolher aquela que será utilizada como comparativo entre as meta-heurísticas.

A Tabela 24 mostra as versões do GRASP que serão comparadas. Inicialmente, foram implementadas 8 versões do GRASP, variando o algoritmo construtivo semi-guloso (tamanho aleatório ou tamanho guloso), a etapa de melhoramento (VNS ou VND), e se a etapa de path-relinking foi utilizada ou não. A partir dos resultados das 8 versões iniciais, foram implementadas mais

duas versões (GRASP-PDP e GRASP-RPD), onde foi variado o algoritmo construtivo, enquanto que a etapa de melhoramento e a etapa do path- relinking foram decididas a partir da melhor versão entre as 8 inicialmente implementadas.

Versão Geração de soluções VNS ou VND Uso do path-relinking GRASP-AS Semi-guloso de tamanho aleatório VNS Não GRASP-GS Semi-guloso de tamanho guloso VNS Não GRASP-AD Semi-guloso de tamanho aleatório VND Não GRASP-GD Semi-guloso de tamanho guloso VND Não GRASP-ASP Semi-guloso de tamanho aleatório VNS Sim GRASP-GSP Semi-guloso de tamanho guloso VNS Sim GRASP-ADP Semi-guloso de tamanho aleatório VND Sim GRASP-GDP Semi-guloso de tamanho guloso VND Sim GRASP-RDP Semi-guloso de tamanho aleatório com roleta VND Sim GRASP-PDP

Semi-guloso de tamanho aleatório com peso em

passageiros VND Sim

Tabela 24. Versões implementadas do GRASP e comparadas na primeira etapa de

experimentos

7.1. Experimentos e resultados

A partir da metodologia descrita no capítulo 4, foram feitos experimentos computacionais com as 10 versões implementadas para o GRASP. Foi utilizado um conjunto de 12 instâncias de tamanho 100, onde cada versão foi executada 30 vezes para cada instância, com uma condição de parada de

2.000.000 chamadas à função objetivo. A partir dos resultados e testes estatísticos, será escolhida a melhor das versões da meta-heurística, e esta será utilizada para o comparativo entre os algoritmos implementados.

Figura 33. Gráfico comparativo da média dos resultados dos experimentos para as versões do GRASP 0 5000 10000 15000 ga100 gb100 gc100 gd100 ha100 hb100 hc100 hd100 ia100 ib100 ic100 id100

GRASP-AS GRASP-GS GRASP-AD GRASP-GD

GRASP-ASP GRASP-GSP GRASP-ADP GRASP-GDP GRASP-RDP GRASP-PDP

Figura 34. Gráfico comparativo da média dos tempos de execução, em segundos, dos

experimentos para as versões do GRASP

0 20 40 60 80 100 ga100 gb100 gc100 gd100 ha100 hb100 hc100 hd100 ia100 ib100 ic100 id100

GRASP-AS GRASP-GS GRASP-AD GRASP-GD

GRASP-ASP GRASP-GSP GRASP-ADP GRASP-GDP GRASP-RDP GRASP-PDP

Os resultados e tempos de execução dos experimentos estão nas Tabela 107 a Tabela 126, contidas no Apêndice B. A Figura 33 mostra o gráfico comparativo da média dos resultados, enquanto que a Figura 34 mostra o gráfico comparativo da média dos tempos de execução.

Analisando os resultados, é possível ver que todas as versões que utilizam o algoritmo construtivo de tamanho guloso não conseguiram nenhum resultado diferente de 0 (com exceção da instância ha100). A hipótese para isso ter ocorrido é que a ideia de selecionar o tamanho por meio de uma heurística gulosa não funcione para as instâncias utilizadas, e ao tentar utilizar essa estratégia para construir uma solução o algoritmo não encontrou nenhum vértice que ao ser inserido aumentasse o lucro, e consequentemente não conseguindo sair do lucro 0 (solução vazia).

Entre as versões restantes, os melhores resultados foram encontrados pelas versões GRASP-ADP, GRASP-RDP e GRASP-PDP, seguidos das versões GRASP-AD e GRASP-ASP, e por fim o GRASP-AS. Com isso, podemos concluir que a utilização do path-relinking trouxe melhores resultados, assim como o uso do VND em comparação ao VNS. Não é possível afirmar com clareza qual das três melhores versões obteve os melhores resultados.

GRASP-

AS GRASP-GS GRASP-AD GRASP-GD GRASP-ASP GRASP-GSP GRASP-ADP GRASP-GDP GRASP-RDP GRASP-

GS 7,9140E-02 - - - - GRASP-

AD 1,0000E+00 7,9140E-02 - - - - GRASP-

GD 1,1388E-01 1,0000E+00 1,1388E-01 - - - - GRASP-

ASP 1,0000E+00 1,5950E-01 1,0000E+00 2,1722E-01 - - - - - GRASP-

GSP 9,5250E-02 1,0000E+00 9,5250E-02 1,0000E+00 1,8680E-01 - - - - GRASP-

ADP 5,3188E-01 1,5000E-05 5,3188E-01 3,0000E-05 3,4777E-01 2,1000E-05 - - -

GRASP-

GDP 2,1722E-01 1,0000E+00 2,1722E-01 1,0000E+00 3,6919E-01 1,0000E+00 1,2000E-04 - -

GRASP-

RDP 4,8379E-01 1,1000E-05 4,8379E-01 2,1000E-05 3,0685E-01 1,5000E-05 1,0000E+00 8,4000E-05 -

GRASP-

PDP 1,7276E-01 5,1000E-07 1,7276E-01 1,1000E-06 8,6890E-02 7,6000E-07 9,9985E-01 5,1000E-06 9,9994E-01

Tabela 25. P-valores resultados do teste estatístico post-hoc de Conover para o teste de

Para os testes estatísticos, foram aplicados o teste estatístico de Friedman e o teste estatístico post-hoc de Conover para o teste de Friedman, levando em consideração um nível de significância de 0,05. O teste de Friedman obteve um p-valor inferior a 2,2E-16, o que era esperado por causa do resultado 0 de quatro das versões implementadas.

Para o teste post-hoc, a Tabela 25 mostra os p-valores do teste de Conover. Com exceção das 4 versões que obtiveram apenas 0 como resultado (e resultando em um p-valor de 1 entre si, já que os seus resultados foram quase idênticos), poucos casos obtiveram um p-valor inferior a 0,05. Em especial, as 3 melhores versões do algoritmo (ADP, RDP e PDP) obtiveram p- valores entre si próximos a 1. Com isso, não é possível afirmar qual das 3 versões obteve os melhores resultados, e de forma arbitrária escolhe-se o GRASP-ADP para a comparação dos algoritmos.

8. Algoritmos Genéticos

O Algoritmo Genético foi desenvolvido por John Holland em 1975 [40]. A meta- heurística se baseia na metáfora da evolução a partir da seleção de indivíduos para o cruzamento, gerando assim novos indivíduos que serão selecionados por meio da seleção natural e darão continuidade à espécie, esta que repetirá o ciclo por inúmeras gerações.

A meta-heurística é composta de um conjunto de soluções (população de indivíduos), um método para selecionar tais soluções (seleção de indivíduos para cruzamento), a geração de uma ou mais soluções por meio de recombinações entre as soluções selecionadas (cruzamento e geração de soluções-filho), perturbação nas soluções geradas (mutação) e seleção das soluções que formarão o novo conjunto de soluções (seleção de indivíduos para a população). Como trabalhos recentes, há o Gil et al (2018) para otimizar o alinhamento ontológico [52], e Javaid et al (2017) para otimizar smart grids [53].

A ideia da meta-heurística é aplicar a metáfora da evolução a partir da seleção de indivíduos mais bem capacitados para o cruzamento, assim gerando filhos a partir dos genes (supostamente) superiores. O mesmo pode ser dito na seleção dos filhos, onde em algumas implementações apenas os mais capacitados são escolhidos para pertencerem à população, substituindo indivíduos inferiores. A mutação entra como uma maneira de aumentar a diversidade entre as soluções geradas por meio do cruzamento, e assim tentando reduzir a convergência do algoritmo.

Neste trabalho foi desenvolvido apenas uma versão do Algoritmo Genético. A execução do algoritmo será formada de múltiplas gerações, até que a condição de parada seja alcançada. Em cada geração, serão realizados múltiplos cruzamentos até que a quantidade estipulada seja alcançada. Para cada cruzamento serão sorteadas 2 soluções, e na solução resultante é

aplicada uma etapa de mutação. Após a mutação, a solução é então inserida na população (conjunto de soluções). Ao fim da execução dos cruzamentos, o conjunto de soluções é ordenado de acordo com o lucro de cada solução, e as piores soluções são removidas de tal forma que a população retorne ao seu tamanho original.

algoritmoGenético()

Entrada: int aSize, int percRed, int percInc, int percMut, int crossQt; Saída: solução sol;

1 2 3 4 5 6 7 8 9 10 11 12 PARA i de 0 a aSize: A = A ∪ algConstrSemiGulosoTamAleatório(); FAÇA: PARA i de 0 a crossQt: sol1 = sorteio(A); sol2 = sorteio(A);

sol = cruzamento(sol1, sol2);

sol = mutação(sol, percRed, percInt, percMut); A = A ∪ sol;

A = reduzirTamanho(A, aSize);

ATÉ condição de parada; RETORNAR melhor(A);

Documentos relacionados