VARIABLE NEIGHBOURHOOD SEARCHmac/ensino/docs/ODST20072008/VNS_Nuno_A… · Variable Neighbourhood...
Transcript of VARIABLE NEIGHBOURHOOD SEARCHmac/ensino/docs/ODST20072008/VNS_Nuno_A… · Variable Neighbourhood...
VARIABLE NEIGHBOURHOOD
SEARCH
Nuno Miguel Duarte Sequeira André
Optimization and decision support techniquesPDEEC 2007
Introdução
● A meta-heurística VNS (Variable Neighbourhood Search) é bastante recente
● Esta meta-heurística tem por base a pesquisa em vizinhanças diferentes
● Nesta exploração o objectivo será descer até mínimos locais e tentar escapar dos vales que os contêm
Pesquisa local● A meta-heurística VNS faz uso da pesquisa
local● Uma pesquisa local consiste na movimentação
de uma solução para a outra de acordo com regras pré estabelecidas
● Uma estratégia de pesquisa local possível começa com uma solução arbitrária e em cada passo uma nova solução é escolhida sendo testada
Vizinhança● Isto pressupõe a escolha de uma vizinhança
que pode ser considerada como todas as soluções que se obtêm ao fazer uma troca 2opt por exemplo
● Podemos testar todas as possibilidades de uma vizinhança, nesse caso vamos explorar totalmente a vizinhança
● Para descer até um mínimo local podemos tentar alterações aleatórias ou sistemáticas do caminho e testar se essa solução é menor que a actual
Vizinhança● Temos assim a função F(x) que queremos
minimizar, na vizinhança V(xn) encontramos o mínimo local xn mas temos um vale próximo
Vizinhança● Com as alterações aleatórias podemos ou não
conseguir achar melhoria, mas se não acharmos melhoria não garantimos que chegamos ao mínimo local da vizinhança, a não ser que exploremos a vizinhança toda, o que é mais complicado de fazer com números aleatórios
● Com uma pesquisa sistemática podemos pesquisar até não conseguirmos melhoria, assim sendo chegamos ao mínimo local
Introdução
● Para conseguir chegar a um vale temos de implementar alguma forma de pesquisa que deve ser bastante rápida
● No VNS podemos considerar dois tipos de evolução na pesquisa– Steepest descent - descida mais inclinada– First descent - primeira descida
Steepest Descent
● Escolhemos uma vizinhança
● (Repetir)● Testamos a vizinhança completamente● Achamos o mínimo da vizinhança● Esse mínimo passa a ser a nova solução
First Descent
● Escolhemos uma vizinhança
● (Repetir)● Testamos a próxima alteração● Se for menor que a solução actual essa passa
a ser a nova solução
Variable Neighbourhood Descent
● A combinação das duas heurísticas anteriores dá origem ao VND (Variable Neighbourhood Descent)
● Ao aplicar o VND vamos tentar chegar ao mínimo local o mais rápido possível em termos de descida, não em termos de tempo computacional
● Em cada alteração de solução queremos a maior descida possível
Variable Neighbourhood Descent
● Devemos antes de aplicar fazer as seguintes questões:– Qual a complexidade das diferentes trocas– Qual a melhor ordem para as aplicar– São as trocas consideradas suficientes para
permitir uma exploração satisfatória da solução?– Quão precisa queremos que a solução seja
Variable Neighbourhood Descent● Ao aplicar o VND devemos conseguir chegar a
um mínimo local em tempo útil ● Quando chegamos ao mínimo local quer dizer
que nas vizinhanças exploradas no VND não conseguimos melhorar, sendo assim podemos tentar o mesmo tipo de trocas que nunca conseguiremos sair do vale
● Isto é problemático no sentido em que geralmente usamos trocas simples para o VND
Variable Neighbourhood Descent● Para sair do vale e tentar achar um mais
profundo teremos inevitavelmente de usar trocas mais complexas 3opt, 4opt, 5opt ou outras, gerando assim vizinhanças mais distantes
● O grande problema que temos com estas trocas mais complexas é que para explorarmos sistematicamente a vizinhança temos muito mais combinações possíveis, logo o tempo de pesquisa vai crescer
Reduced VNS● No entanto o VNS apresenta uma solução● Fazemos uma troca mais complexa obtendo
assim uma possível solução, de seguida fazemos uma pesquisa local, na expectativa de que consigamos uma melhoria de relativamente ao mínimo encontrado pelo VND
● Esta troca é designada por Reduced VNS● O Reduced VNS seguido de uma pesquisa
local designa-se por Basic VNS
General VNS● Se usarmos o Reduced VNS seguido de uma
pesquisa VND teremos assim o General VNS, foi esta a meta-heurística implementada
Exemplo VNS
Tipos de VNS
● Basic VNS - É considerado quando usamos uma pesquisa RVNS seguida de uma pesquisa simples das vizinhanças
● General VNS - É considerado quando usamos uma pesquisa RVNS seguida de uma pesquisa VND
● Na implementação pode-se determinar em minutos quanto tempo é que o RVNS vai correr.
Implementação
● Para o TSP criei quatro heurísticas baseadas em dois tipos de trocas simples.
● 2opt● Troca de cidade
2opt● O 2opt é bastante simples e é já conhecido
Troca de Cidade● A troca da cidade é melhor explicada no vector
solução
● Escolhe-se uma cidade e qual o ramo onde a vamos introduzir
Troca de Cidade (Exemplo)
● Por exemplo se tivermos a solução: 0 1 2 3 4 5 6● Se escolhermos a cidade na posição 5 e a
quisermos colocar no ramo na posição 0 (ramo entre a posição 0 e 1) ficará
0 5 1 2 3 4 6
Implementação● Para estas duas heurísticas implementei o
steepest descent e o first descent● A cada método é passado o limite de iterações,
como o método termina ao fim de uma iteração em que não consiga melhorar a solução poderíamos pedir infinitas iterações
● A solução inicial é a dada pela heurística do vizinho mais próximo com início no nó zero
steepestdescent2opt(caminho, x.length);firstdescent2opt(caminho);steepestdescentmovecidade(caminho, x.length);firstdescentmovecidade(caminho, 0);
Implementação● Para a heurística de cidade firstdescent
podemos definir uma quantidade de iterações baseadas em números aleatórios, para serem tentados antes da pesquisa sistemática, esta opção nunca foi usada neste trabalho
● As duas heurísticas firstdescent só param quando não conseguem melhoria
steepestdescent2opt(caminho, x.length);firstdescent2opt(caminho);steepestdescentmovecidade(caminho, x.length);firstdescentmovecidade(caminho, 0);
Implementação● Optei por usar o steepest descent primeiro para
nos encaminhar o mais rapidamente possível para o vale mais profundo
● Embora consuma mais tempo, pois é preciso uma iteração para haver um avanço, o avanço será sempre o maior e deve ser usado quando temos uma solução não aleatória
● De seguida uso o first descent para tentar descer ainda mais no vale
● Isto para o 2opt
Implementação
● Com a troca de cidade consegue-se melhorar a solução obtida por 2opt, mas geralmente executa menos iterações, porque grande parte do trabalho de descida já foi feito antes
● Inevitavelmente vai-se chegar a um mínimo local. Embora com o problema de 29 nós consiga chegar à solução óptima, o mesmo não acontece para os outros.
Implementação● Para sair do vale em que nos encontramos
vamos usar o RVNS (Reduced Variable Neighbourhood Search)
● Implementei duas técnicas para isto:– Gero uma troca aleatória na solução inicial e realizo
uma pesquisa VND, se melhorar passa a ser a nova solução (denominei esta técnica de RVNS)
– Gero uma troca aleatória na solução inicial e realizo uma pesquisa VND, gero outra troca aleatória no caminho gerado anteriormente e realizo uma pesquisa VND (denominei esta técnica de RVNS cascata)
Implementação
● Cada tentativa gera sempre uma solução pior seja no RVNS ou no RVNS cascata, mas esta é a única maneira de sair do vale
● Só depois de correr o VND sabemos se chegamos a um vale mais profundo
Implementação
● Quanto mais complexa for a troca mais distante é a vizinhança e mais longe ficará o vale a que vamos tentar aceder.
● Sendo assim começa-se com trocas simples e depois evolui-se para trocas mais complexas
GVNS
Os dois tipos de RVNS contam com uma função que consegue realizar qualquer troca do tipo kopt, mas implementei trocas 2opt, 3opt, 4opt, 5opt e 6opt
● Todos serão seguidos de uma pesquisa VND● Pode-se definir qual o tempo de
processamento desejado, sendo que este será dividido igualmente entre cada troca
Tempos de execução VND● Para um máximo de iterações igual ao nº de
nós
53 1002 18512
Iterações
Steep 2opt 10 4,6 46 165 29921,21 4937000 N/A >8h N/AFirst 2opt 2 16 32 2 30000 60000 N/A N/A N/A
5 6,2 31 29 60620,69 1758000 N/A N/A N/A2 8 16 2 60 120 N/A N/A N/A
Tempo total < 1s 114m 36s N/A429 271713 N/A
Algoritmo
Instância
Tempo por iter.
(ms)
Tempo Total (ms)
Iterações Tempo por iter. (ms)
Tempo Total (ms) Iterações
Tempo por iter.
(h)
Tempo Total (ms)
Steep CidadeFirst Cidade
Mínimo
Iterações VND● Para um máximo de iterações igual ao nº de
nós
53 1002 18512Iterações
Steep 2opt 10 440 165 273994 N/A N/AFirst 2opt 2 435 2 273992 N/A N/A
5 429 29 271713 N/A N/A2 429 2 271713 N/A N/A
Tempo <1s 114m 36s N/A
AlgoritmoInstância
Mínimo Iterações Mínimo Iterações Mínimo
Steep CidadeFirst Cidade
Iterações VND● Para um máximo de iterações igual a 10% do
nº de nós (10% calculado com divisão inteira nº de nós/10)
53 1002 18512Iterações
Steep 2opt 5 471 100 278391 N/A N/AFirst 2opt 4 434 4 274100 N/A N/A
4 430 32 271671 N/A N/A2 430 2 271671 N/A N/A
Tempo 1s 85m N/A
AlgoritmoInstância
Mínimo Iterações Mínimo Iterações Mínimo
Steep CidadeFirst Cidade
Iterações VND● Para um máximo de iterações igual a 1% do nº
de nós (10% calculado com divisão inteira nº de nós/100)
53 1002 18512Iterações
Steep 2opt 0 511 10 313165 N/A N/AFirst 2opt 3 438 5 279371 N/A N/A
0 438 10 277082 N/A N/A3 430 3 273887 N/A N/A
Tempo ~0s 20m 27s N/A
AlgoritmoInstância
Mínimo Iterações Mínimo Iterações Mínimo
Steep CidadeFirst Cidade
Condições do teste
● Netbeans 6.0● Java JDK 6● AMD Sempron 2600+● 512MB RAM
Conclusões● Consegui melhorias com o RVNS só para 53
nós, conseguindo 426 ao fim de 1h de RVNS● Para 1002 nós ao fim de 31h não consegui
melhoria relativamente ao VND● O uso de muitas iterações steepestdescent não
garante a escolha de um bom mínimo local mas demora muito mais tempo a executar
● O firstdescent chega a um mínimo muito mais rápido que o steepestdescent
Trabalho futuro● Guardar trocas geradas aleatoriamente no
RVNS para que não sejam repetidas● Implementar Skewed VNS● Implementar Variable Neighborhood
Decomposition Search● Implementar um algoritmo que detecte ramos
cruzados e que os troque● Resolver o problema de o firstdescent fazer
melhoria depois de o steepestdescent ter corrido até ao fim
Bibliografia● José Fernando Oliveira Maria Antónia Carravilla,
“Técnicas aproximadas para a resolução de problemas de Optimização Combinatória”, MEEC – Faculdade de Engenharia da Universidade do Porto
● Pierre Hansen and Nenad Mladenovic, “Search Methodologies - Introductory Tutorials In Optimization And Decision Support Techniques”, Cap. 8, “VARIABLE NEIGHBORHOOD SEARCH”, Springer, 2005
● Marc Pirlot, “General local search methods”, European Journal of Operational Research 92 (1996) 493-511, 1996
● http://www.mi.sanu.ac.yu/VNS/VNS.HTM, visitada em 7 de Janeiro de 2008