• Nenhum resultado encontrado

5 Métodos heurísticos de programação mate mática para o problema

Algoritmo 6: Algoritmo das heurísticas fix-and-optimize com aleatoriedade.

1 INÍCIO

2 Inicialização: k ← 1; it ← 0; it_sem_melhoria ← 0; F lag ← 0; Hist_NT ← ∅; e/ou

Hist_NM ← ∅; e/ou Hist_NJ← ∅.

3 Obtenha uma solução inicial SOLini para o problema com valor F O(SOLini). 4 SOLinc← SOLini.

5 enquanto { ( T empo_Decor < Lim_T empo) e (Flag = 0 ) } faça

6 Fixe o conjunto de variáveis F inteiras nos valores da solução incumbente SOLinc.

7 Determine R de acordo com a vizinhança k (determine o conjunto levando em consideração os

conjuntos Hist_NT, Hist_NM e Hist_NJ.

8 Libere as variáveis R para serem reotimizadas.

9 Resolva o MIP resultante (resolva até que atinja a otimalidade ou até que alcance um tempo

determinado).

10 SOLcor← Solução do MIP resultante.

11 se F O(SOLcor) < F O(SOLinc) então 12 SOLinc← SOLcor.

13 it← 0. 14 it_sem_melhoria ← 0. 15 senão 16 it_sem_melhoria ← it_sem_melhoria + 1. 17 se it = Lim_it_viz_k então 18 se k = kmax então 19 k← 1. 20 senão 21 k← k + 1. 22 senão 23 it← it + 1.

24 se it_sem_melhoria = Lim_sem_melhoria então 25 F lag← 1.

26 FIM

Repita a seguinte sequência até que o critério de parada seja satisfeito: (1) Faça k ← 1

(2) Repita os seguintes passos até que k = kmax:

(a) Agitação. Gere de forma aleatória um ponto x

utilizando a k-ésima vizinhança de x (x

∈ Nk(x)); considere y como um conjunto de k características de

solução presentes em x

, mas não presentes em x, ou seja, y = x

\ x.

(b) Busca Local. Encontre um ótimo local no espaço de y ou por inspeção ou por alguma heurística; denote a melhor solução encontrada como y

, e como x′′

a correspondente solução em todo o espaço de solução E (x′′

= (x

\ y) ∪ y

).

(c) Mover ou não. Se este ótimo local é melhor do que a solução incumbente, mova para lá (x ← x′′

) e continue a busca com N1 (k ← 1); caso contrário, faça k ← k + 1.

5.4. Heurísticas de melhoria fix-and-optimize 131

por exemplo) são fixadas na fase de busca local. Ou seja, no conjunto y mencionado acima em (b), estão fixadas características de x

. Todas as possíveis formas de fixação (ou liberação) de características definem a vizinhança Nk(x). O algoritmo inicia com uma

solução aleatória x

de N1(x). Resolve-se o problema considerando somente as variáveis

que não estão fixadas em y e um novo valor de solução é obtido. Se a nova solução obtida não é melhor do que a solução incumbente, a busca muda de vizinhança k = k + 1, para uma vizinhança maior do que a anterior, ou seja, com mais características livres do que fixadas, com o intuito de explorar um pouco mais o espaço E. Caso a nova solução seja melhor do que a incumbente, a busca volta para a primeira vizinhança (k ← 1) a partir da nova solução.

A única diferença entre a VNS e a VNDS é no passo 2(b): na VNS aplica-se um método de busca local em todo o espaço de solução E (iniciando de x

∈ Nk(x)),

enquanto que, na VNDS, a cada iteração é resolvido um subproblema em algum subespaço

Vk ⊆ Nk(x) com x

∈ Vk. Na VNDS, a medida que as vizinhanças k são percorridas os

subconjuntos Vk aumentam. Os passos da VNDS apresentados acima foram extraídos de Hansen e Mladenović (2003). Para mais detalhes sobre essas metaheurísticas, vejaHansen e Mladenović (2001), Hansen, Mladenović e Perez-Britos (2001) eHansen e Mladenović (2003).

Na FXOV2 proposta, parte-se de uma solução inicial factível, ou seja, não há o passo de agitação. Uma vez que as estruturas de vizinhança estão bem definidas, a FXOV2 inicia otimizando o subproblema que possui as variáveis que estão liberadas (não fixadas) na primeira vizinhança. O conjunto de variáveis liberadas nas vizinhanças é escolhido de forma aleatória. Essa otimização é a fase de busca local. A nova solução obtida com essa otimização difere da solução incumbente apenas pelas variáveis que foram otimizadas, pois as fixadas são as mesmas da solução incumbente. Depois da obtenção da nova solução é preciso decidir para onde mover a busca, que refere-se ao passo (c) mover ou não. A cada nova solução melhor encontrada, a VNDS retorna para a primeira vizinhança e explora essa vizinhança novamente a partir da nova solução. Caso contrário, o número de variáveis não fixadas é aumentado com a mudança para a próxima vizinhança k = k + 1, para permitir passos mais longos e assim, mover a busca para outra parte do espaço de solução. Esses passos são repetidos até todas as kmax vizinhanças definidas tenham sido percorridas,

ou até que algum outro critério de parada seja alcançado.

A FXOV2 não pode ser considerada uma FXO com princípios de VNDS pelo fato de que não há garantias que os subproblemas resolvidos aumentam de tamanho a cada vizinhança percorrida, ou seja, não existem garantias que o conjunto R aumenta de cardinalidade conforme k aumenta. Isso é garantido na FXO-VNDS descrita mais adiante.

Os passos da FXOV2 são descritos no Algoritmo7. Considere os mesmos parâmetros utilizados para o algoritmo 6. Assim como para FXOV1, as vizinhanças começam a ser

132 Capítulo 5. Métodos heurísticos de programação matemática para o problema

percorridas a partir de k = 1, após a inicialização dos parâmetros. São permitidas diversas iterações com a mesma vizinhança k controladas pelo contador it, que inicialmente vale zero. O parâmetro F lag sinaliza o critério de parada por ter percorrido todas as kmax

vizinhanças pré-definidas. Encontrada uma solução inicial para o problema, a solução incumbente recebe essa solução inicial, os conjuntos R e F são definidos de acordo com a vizinhança k e o subproblema MIP é otimizado. Se a solução obtida (SOLcorr) for melhor

do que a solução incumbente (SOLinc), a solução incumbente é substituída, o algoritmo

reinicia com a primeira vizinhança k = 1 e o contador it é zerado. Caso contrário, o contador it é incrementado até um limite Lim_it_viz_k. Quando it alcança o limite

Lim_it_viz_k, se ainda não foram percorridas todas as vizinhanças, o histórico da

vizinhança k é apagado e uma nova vizinhança passa a ser explorada com o incremento de k. O algoritmo termina quando todas kmax vizinhanças tiverem sido percorridas, ou

quando um tempo limite (Lim_T empo) é alcançado. Como já mencionado anteriormente,