• Nenhum resultado encontrado

3.2 Estruturas do AG+VNDi

3.2.5 Vizinhanças

Comparada a outras metaheurísticas, a velocidade de evolução das soluções em Algo- ritmos Genéticos simples é lenta [Arostegui et al. 2006]. Uma estratégia de intensificação comum é a hibridização do AG com heurísticas de busca local (BL) aplicadas nas soluções da população.

Na revisão da literatura foi mostrado que existem diversas buscas locais de sucesso para resolver problemas de localização de facilidades. Entretanto, buscas mais sofisti- cadas, como a substituição de múltiplas facilidades, apesar de serem efetivas podem se tornar demasiadamente custosas computacionalmente. As vizinhanças de busca devem ser definidas de modo que a varredura seja eficiente em termos de tempo de execução.

Uma busca local pode ser criada para o DFLPG a partir de operações derivadas das vizinhanças clássicas usadas nos FLPs. Levando em consideração o contexto dinâmico e modular do problema, foram definidas cinco operações básicas que podem ser combina- das para formar a vizinhança de uma busca local. São elas:

Op 1. Adicionar um segmento de genes; Op 2. Retirar um segmento de genes;

Op 3. Cortar na vertical e mover um segmento de genes; Op 4. Cortar na horizontal e mover uma facilidade; Op 5. Cortar na vertical e mover uma facilidade.

3.2. ESTRUTURAS DO AG+VNDI 35 qual lado do corte terá seus módulos movidos. Na descrição do operador de mutação foram utilizadas as notações vCut e hCut para indicar os cortes vertical e horizontal, respectivamente, realizados no processo de mutação. Agora, será adicionada uma seta ao final da notação para indicar para qual direção o corte será direcionado. Por exemplo, vCut(2) → representa um corte vertical no período 2 realizado à direita e hCut(3) ↑ um corte horizontal no módulo 3 realizado para cima. A Figura 3.6 mostra diferentes formas de extrair uma parte do segmento cortado utilizando as operações de corte de segmentos (Op 3). A primeira etapa consiste no mapeamento dos segmentos de genes da facilidade origem. Selecionado o segmento a ser cortado, cortes verticais são realizados à direita, à esquerda ou mesmo as duas operações simultaneamente, de modo a mover um bloco de módulos intermediário do segmento.

Figura 3.6: Operação 3: Corte vertical de segmentos de genes

As operações de corte de facilidades funcionam de modo semelhante. A Figura 3.7 mostra um exemplo com as quatro possibilidades de cortes de facilidades.

Figura 3.7: Operações 4 e 5: Corte vertical e horizontal de facilidades

As Op 4 e Op 5 já foram mostradas anteriormente neste trabalho na Figura 3.5 que representa o operador de mutação na fase de retirada de módulos da facilidade origem. Ainda sobre a mutação, operações de adição e retirada de segmentos (Op 1 e 2, respec- tivamente) são feitas no operador de mudança apresentado na mesma figura para o caso especial em que o tamanho do segmento adicionado/retirado é limitado a somente um período. O operador de mutação utiliza explicitamente quatro das cinco operações de vi- zinhança definidas. A Op 3 é usada de forma implícita quando o piso e o teto selecionados separem um único módulo e a mutação passar pelo operador de corte.

As buscas locais criadas para o problema aqui tratado também consistem em efetuar uma ou múltiplas operações para gerar uma nova solução em sua vizinhança. A Tabela

36 CAPÍTULO 3. DESCRIÇÃO DO ALGORITMO 3.2 resume quais tipos de operações são efetuadas explicitamente em cada busca local criada.

Tabela 3.2: Operações de vizinhança realizadas nas buscas locais Busca Local Operação

1 2 3 4 5 1 X X

2 X X X

3 X X

A seguir serão descritas as vizinhanças das BLs criadas, resumidas às etapas mais importantes do algoritmo. Em seguida, é feita uma análise de complexidade de cada uma delas.

Busca Local 1: Soluções a um segmento de distância

A Busca Local 1 (BL1) realiza todos os movimentos possíveis de acrescentar e reti- rar um segmento de genes da solução atual. Ela inicia a busca numa facilidade aleatória determinada antes do seu início. Como a descida é pelo primeiro aprimorante, inicia- mos as buscas por diferentes facilidades para que não seja tendenciosa a favor de alguma facilidade.

Pré-processamento. Antes de iniciar a busca, os custos de alocação de cada período de tempo da solução original são armazenados num vetor de tamanho T . Desta forma, quando for necessário avaliar uma solução modificada na busca, o tempo gasto para avali- ação dos períodos não alterados é de O(1), mais eficiente que a busca em THASH. Um outro

vetor armazena os custos modificados durante a busca por facilidade, também reduzindo a complexidade da avaliação da solução.

Adição de segmento. A primeira vizinhança explorada é a de adição de um segmento de módulos. Todas as combinações de adição são testadas, como mostra a Figura 3.8, ex- ceto se em algum período de tempo a facilidade estiver equipada com o L-ésimo módulo. Neste caso, a iteração é passada para a seguinte.

Retirada de segmento. Se nenhuma solução aprimorante for encontrada na fase de adição, a busca varre a vizinhança de retirada de um segmento de genes. Assim como na adição, se na retirada uma facilidade estiver fechada, a iteração vai para a próxima. Além disto, como a retirada de capacidade da rede pode resultar em inviabilidade, a quantidade de iterações que resultam em soluções viáveis nesta vizinhança poderá ser significativa- mente menor que na vizinhança de adição.

Análise de complexidade. No pior caso, a BL1 fará

T ∑ i=1 (−i2+ Ti + i) modificações de módulos e T 2+ T

2 iterações de adição de segmentos em cada facilidade em

J

(igualmente para retirada de segmentos). Portanto, a vizinhança de uma solução explorada por esta BL contém até J(T2+ T ) soluções, sendo J a quantidade de locais em

J

. A Figura 3.8 mostrou um exemplo para T = 5 onde são realizadas 35 modificações de módulos (quantidade de números "1"na figura) e 15 iterações de adição. Como originalmente todos

3.2. ESTRUTURAS DO AG+VNDI 37

Figura 3.8: Iterações da BL1 - adição de um segmento a facilidade

os módulos na facilidade mostrada estavam fechados, não é possível fazer mudanças de retirada de módulos. Portanto, a vizinhança desta facilidade possui apenas 15 soluções.

A avaliação de cada solução vizinha é feita através da atualização dos custos de locali- zação nos períodos modificados somando-se aos novos custos de alocação. Nos períodos não modificados, estes custos são obtidos através da recuperação dos valores armazena- dos no vetor descrito no pré-processamento em O(1). Nos demais períodos, poderá ser necessário executar o algoritmo de FCM ou não. A maioria das modificações resultará em configurações já exploradas pela BL, não sendo necessário executar novamente o FCM. De fato, no pior caso, apenas 5 execuções do algoritmo seriam necessárias para avaliar as 35 modificações do exemplo anterior. Portanto, a quantidade máxima de execuções do FCM em uma passagem da BL1 será de 2JT , ou seja, O(JT ), em que a constante vem da soma das operações de adição e retirada. Para mover a solução atual para uma nova me- lhor solução encontrada na vizinhança, basta atualizar os valores do vetor correspondente à facilidade modificada e os novos custos do indivíduo, todas operações feitas em O(1). Busca Local 2: Substitui e altera partes de um segmento de uma facilidade a uma outra

A Busca Local 2 (BL2) realiza movimentos de mudança de segmentos de módulos existentes na solução para outras facilidades. Os movimentos são graduais, ou seja, corta- se o segmento em cada período e move o corte para a outra facilidade. Além disto, ao adicionar o segmento na nova facilidade, pequenas mudanças no período em que o segmento inicia e termina também são testadas.

38 CAPÍTULO 3. DESCRIÇÃO DO ALGORITMO Mapeamento de segmentos. A BL2 tem uma fase de pré-processamento semelhante a BL1 com uma etapa a mais. Esta etapa consiste no mapeamento dos segmentos de genes do indivíduo. O mapeamento é feito conforme a definição de segmento de genes (seção 3.2.1) usando um algoritmo de busca que percorre a matriz de genes procurando por genes maiores que zero.

Troca de segmentos. A troca de segmentos explora uma vizinhança similar a de troca de facilidades nos FLPs estáticos. Para cada segmento mapeado de comprimento C= tf− ti+ 1 serão feitas 2C − 1 operações de troca, sendo C − 1 cortes a direita, C − 1

cortes a esquerda e uma troca completa (Figura 3.9).

Figura 3.9: Iterações de troca de segmentos da BL2

Assim como na BL1, haverão casos em que a troca de módulos pode resultar em solu- ções inviáveis caso o mesmo módulo tenha capacidade menor em outras facilidades, o que poderá resultar numa diminuição de capacidade das instalações da rede. Um módulo tam- bém não poderá ser movido para uma facilidade que esteja operando em sua capacidade máxima.

Nem todos os segmentos precisam ser testados por todas as iterações. Para segmentos iguais de uma mesma facilidade apenas um é movido. Segmentos com inícios iguais, cor- tes à direita do menor deles resultam em configurações testadas pelo maior. Igualmente,

3.2. ESTRUTURAS DO AG+VNDI 39 segmentos com finais iguais, o menor não passa pela fase de cortes à esquerda.

Modificação do segmento trocado. Cada iteração da BL2 tem a vizinhança expan- dida de modo a permitir que pequenas mudanças no período de abertura e/ou de fecha- mento de módulos sejam testadas. Seja Stitf o módulo modificado, no total cada iteração

faz nove testes de mudança de módulos: 1. Stitf - Move o corte original;

2. S(ti−1)tf - Abre o segmento um período mais cedo;

3. S(ti+1)tf - Abre o segmento um período mais tarde;

4. Sti(tf−1) - Fecha o segmento um período mais cedo; 5. Sti(tf+1) - Fecha o segmento um período mais tarde;

6. S(ti−1)(tf−1)- Operação 2 + 4;

7. S(ti−1)(tf+1)- Operação 2 + 5;

8. S(ti+1)(tf−1)- Operação 3 + 4;

9. S(ti+1)(tf+1)- Operação 3 + 5.

Análise de complexidade. Quando o tamanho do segmento movido for igual ao tamanho máximo do horizonte de planejamento T , a BL2 realiza 2T − 1 iterações entre cada par de facilidades para cada segmento na fase de troca. O exemplo da Figura 3.9 mostra as nove iterações que são realizadas para um T = 5.

A fase de modificação do segmento expande a vizinhança de uma solução adicionando vizinhos resultantes das operações de modificação aos cortes da fase de troca de segmen- tos, desde que sejam viáveis. Um corte de segmento com C = T , por exemplo, terá três soluções vizinhas testadas resultante das operações de diminuição do comprimento do segmento na modificação (operações 3, 4 e 8). Se todas as oito operações de mudança puderem ser feitas, até oito novas soluções são alcançadas na busca.

O tamanho de uma vizinhança da modificação de um segmento qualquer do indivíduo é dado pela soma da quantidade de iterações de corte que podem ser feitas (mostrada antes como sendo igual a 2C − 1) com a quantidade de operações viáveis de modificação do segmento trocado. No segmento S15j , numa instância com T = 5 (como no exemplo da Figura 3.9), nove soluções vizinhas serão alcançadas no movimento de troca e cortes, e cada iteração possuirá diferentes quantidade de operações viáveis de modificação. A iteração 1 possui apenas três movimentos possíveis. As iterações 2 e 6, que possuem C = 1, também possuem três movimentos. Nas demais iterações, cinco diferentes movimentos podem ser realizados em cada. No total, 39 configurações são alcançáveis na fase de modificação do exemplo que, somadas às 9 iterações da fase de troca, resulta em uma vizinhança com 48 soluções alcançáveis em cada movimento de segmento da BL.

Um segmento com ti= 1 e tf = T , possuirá 10C − 11 soluções vizinhas resultantes da

40 CAPÍTULO 3. DESCRIÇÃO DO ALGORITMO tf a ordem da quantidade de vizinhos formados por um segmento é O(C). Se uma solução possui um único segmento ativado, então haverão J − 1 destinos para este segmento e o tamanho da vizinhança da BL2 será de O(JC). Porém, num indivíduo com múltiplos segmentos, a análise do tamanho da vizinhança da BL é mais complexa.

Segmentos iguais de módulos diferentes da facilidade origem geram vizinhanças iguais. Por exemplo, uma facilidade origem o que possui os genes {2, 2, 2, 2, 2} tem dois seg- mentos semelhantes So15 ativados. Neste caso, a fase de troca de segmentos da BL resul- tará exatamente nas mesmas configurações para qualquer um dos segmentos. Entretanto, numa facilidade {1, 2, 3, 2, 1} a troca dos três segmentos disponíveis resultarão em con- figurações diferentes. No segmento do primeiro módulo, a BL2 realizará nove iterações, como mostrado anteriormente. No do segundo módulo serão feitas cinco iterações. Por fim, no segmento do terceiro módulo, mais uma iteração. Neste exemplo, a busca nos três segmentos gera 15 novas soluções vizinhas na troca de cada facilidade origem com cada destino.

Para cada segmento diferente numa facilidade origem, a fase de modificação dos seg- mentos expande a vizinhança da busca em O(C). No pior caso, cada facilidade J possui até O(LT ) segmentos distintos (i.e., facilidade {L, 0, L, . . . , 0, L , 0 possui LT /2 segmen- tos). Sendo J − 1 destinos e C = 1 como no exemplo citado, a complexidade de pior caso do tamanho da vizinhança de busca é O(J2LT).

Apesar da enorme vizinhança, para a avaliação das soluções vizinhas uma quanti- dade de FCMs muito menor que a quantidade de vizinhos precisará ser resolvida. Na fase de troca de segmentos, os movimentos de corte à direita e à esquerda resultam em configurações de facilidades iguais às testadas na troca completa. Na Figura 3.9 isto é bem evidenciado. Na iteração 1, cinco novas configurações são geradas, sendo uma em cada período, o que requer a execução de cinco FCMs. Na iteração 2, a configuração do primeiro período já foi explorada na iteração anterior e as demais são semelhantes às originais, não havendo necessidade de executar novos FCMs para avaliação da solução. O mesmo acontece nas demais iterações. Desta forma, apesar das 2T − 1 iterações de troca de segmentos, apenas T execuções do FCM serão feitas.

Na fase de modificação do segmento, apenas as operações 2, 3, 4 e 5 podem necessi- tar de uma execução do FCM, pois podem gerar configurações inexploradas nos períodos modificados. Entretanto, as modificações feitas por estas operações são equivalentes a adicionar um segmento de módulos de comprimento C = 1 a um período anterior (opera- ção 2) e posterior (operação 5) ao segmento modificado ou retirar um segmento de mesmo comprimento do primeiro período do segmento (operação 3) e do último (operação 4). Todas estas operações de inserção e retirada de segmentos resultam em configurações também possíveis de ser geradas pela BL1. Consequentemente, a repetição de configura- ções de facilidades nos períodos modificados não exigirá novas execuções de FCMs. O resultado disto é que a fase de modificação do segmento expande enormemente a vizi- nhança de busca da BL2 sem afetar a ordem de complexidade do algoritmo relacionada a quantidade de execuções de FCMs.

Se cada troca de segmentos entre um par de facilidades resulta em até T execuções de FCM, então a quantidade máxima de FCMs realizadas pela BL2 será de (J2− J)T , ou seja, a complexidade de pior caso desta busca local é O(J2T). Como a BL2 se trata de

3.2. ESTRUTURAS DO AG+VNDI 41 uma busca local que procura em vizinhanças onde trocas de módulos são efetivadas e sua complexidade não é influenciada por L - quantidade máxima de módulos por facilidade - esta é uma boa busca local para resolver instâncias onde potencialmente uma grande quantidade de módulos podem ser construídos nas facilidades.

Busca Local 3: Substitui múltiplos segmentos de uma mesma facilidade para outra A Busca Local 3 (BL3) realiza movimentos de mudança de segmentos pertencentes a uma mesma facilidade simultaneamente. Em termos de operações de vizinhanças, a BL3 realiza uma Op 4 direcionada acima seguida por duas Op 5 sendo o corte mais a esquerda direcionado à direita e o corte mais a direita direcionado à esquerda (Figura 3.10). Os módulos retirados (em verde na figura) são então deslocados e testados em cada uma das demais facilidades da instância.

Figura 3.10: Operações da BL3

Mapeamento das facilidades. A BL3 possui a mesma fase de pré-processamento da BL2, exceto que o mapeamento não é feito no nível de segmentos, mas de facilidades. O mapeamento consiste em determinar as alturas Hj das facilidades j. A altura é igual ao

maior nível de capacidade aberto, portanto Hj= max{Gjt}, ∀t ∈

T

.

Deslocamento dos módulos. A mudança dos módulos é feita em todas as combina- ções de cortes horizontais para cima e verticais. O pseudo-código do Algoritmo 4 mostra todas as iterações testadas de deslocamento dos módulos, onde jo é a facilidade origem,

jd o destino, a o ponto do corte horizontal hCut(a) ↑ que deve ir até a altura Hjo, e b e c

os pontos dos cortes verticais vCut(b) → e vCut(c) ←.

Ao contrário da BL2 que trabalha com um único corte vertical no segmento, a BL3 usa dois cortes (linhas 8 e 9 do Algoritmo 4), o que permite testar todas as combinações de períodos possíveis de mudanças. Entretanto, para evitar uma expansão muito grande da vizinhança acarretando em um custo computacional elevado, apenas um corte é feito na horizontal (linha 6).

Análise de complexidade. A quantidade de iterações feitas em cada conjunto de segmentos movidos na BL3 depende dos comprimentos C dos segmentos de genes e da altura H da facilidade. Um conjunto "retangular", ou seja, todos os genes da facilidade são iguais a Gjt = H, ∀ j ∈ J,t ∈ T , e C = T , representa a situação no pior caso. Para

cada nível de capacidade neste caso, (T

2+ T )

2 trocas seriam realizadas.

Na fase de retirada dos módulos, o indivíduo com pior entrada possível seria aquele que possui todos os genes da matriz de solução iguais a bL/2c, portanto H = bL/2c,

42 CAPÍTULO 3. DESCRIÇÃO DO ALGORITMO Algoritmo 4 Deslocamento de módulos na BL3

1: Seja um indíviduo x; 2: for jo= 1 to

J

do 3: if Hjo > 0 then 4: Calcula tie tf; 5: for a = 1 to Hjo do 6: for jd= 1 to

J

do 7: for b = tito tf do 8: for c = b to tf do 9: if jo6= jdthen

10: Desloca θc = MAX {Gjoc− a, 0} módulos de Gjoc para Gjdc for-

mando um novo indivíduo x∗com custo f (x∗);

11: if f (x∗) < f (x) then 12: return x∗; 13: end if 14: end if 15: end for 16: for c = b to tf do

17: Retorna θcmódulos de Gjdcpara Gjoc;

18: end for 19: end for 20: end for 21: end for 22: end if 23: end for 24: return x;

uma vez que um gene acima da metade da quantidade máxima de módulos não poderá ser movido a uma facilidade que também possua um gene acima da metade (e.g., mover seis módulos para uma facilidade que já possui seis módulos abertos quando o número máximo de módulos é 10).

O tamanho de uma vizinhança N na BL3 é determinada de forma exata através dos comprimentos dos segmentos da solução. Desconsiderando módulos numa mesma facili- dade com mais de um segmento ativo no horizonte de planejamento, seja um indivíduo x com M módulos com segmentos ativos, cada módulo tem comprimento Cm. Então, para

um L grande o suficiente para que todas as facilidades possam receber os módulos da origem, N(x) = (J − 1) 2 M

m=1 (Cm2+Cm), (3.2)

onde J − 1 representa a quantidade de facilidades destino e o outro fator é a quantidade de iterações que geram novos indivíduos para cada segmento. No indivíduo de pior caso, como descrito anteriormente, Cm= T , ∀ m = {1, . . . , M}, e M = bL/2c J. A sua vizinhança

3.2. ESTRUTURAS DO AG+VNDI 43 conterá bL/2c (J2− J)T

2+ T

2 indivíduos.

Como já foi mostrado nas outras BLs, o simples movimento de módulos entre facili- dades não é custoso computacionalmente. Se em cada nível de capacidade até T FCMs são realizados em cada deslocamento de módulos entre a facilidade origem e destino, a complexidade de pior caso da quantidade de execuções de FCMs na BL3 é de O(J2T L). É possível ainda determinar a quantidade exata de FCMs calculados numa passagem da BL3 por (J − 1) ∑

j∈Jt∈∑T

Gjt, sendo o segundo fator do produto a quantidade total de módulos abertos em todos os períodos do horizonte de planejamento.

Um ponto importante para justificar o uso da BL3 é que ela possui uma vizinhança que intercede grande parte da vizinhança da BL2. Com isto, estas duas buscas sendo exe- cutadas de forma complementar não serão tão mais custosas que a execução única de cada uma delas. Assim, grandes vizinhanças poderão ser exploradas a um custo computacional razoável.