• Nenhum resultado encontrado

Primeiramente destacamos que adotamos nesta Seção a representação de uma solução como uma sequência de permutações s, diferentemente de uma sequência de reversões % que utilizamos anteriormente.

Seja s uma solução arbitrária, a vizinhança N (s) é um conjunto de soluções que possuem um nível de similaridade a s. As definições 17 e 18 estabelecem quando uma solução s0 está em N (s).

Definição 17. Seja s =< s0, s1, . . . , sm > uma solução em S (conjunto de soluções),

então sub(s, p, q) é definida como a subsequência < sp, sp+1, . . . , sq >, para 0≤ p < q ≤ m.

Definição 18. A solução s0 =< s00, s01, . . . , s0m0 > está em N (s) se e somente se sub(s, 0, p) =

sub(s0, 0, p) e sub(s, q, m) = sub(s0, q0, m0), para 0≤ p < q ≤ m e p < q0 ≤ m0.

Observamos que N (s) pode ter um grande número de elementos. De fato, por esta definição, qualquer solução s0 está em N (s) desde que seja possível fazer as atribuições p = 0 e q = m. Desta forma, seria necessário um algoritmo de complexidade exponencial para gerar tal conjunto N (s), o que torna computacionalmente impraticável.

Nossa abordagem para obter um algoritmo polinomial consiste em restringir os valores que podem ser atribuídos a p e q. O que resulta na definição Nf(s) (Definição 19), onde

f representa a distância entre p e q. O Exemplo 3 ilustra a definição de Nf(s).

Definição 19. Seja f um número natural, a solução s0 = < s00, s01, . . . , s0m0 > está na

vizinhança Nf(s) se e somente se sub(s, 0, p) = sub(s0, 0, p), sub(s, q, m) = sub(s0, q0, m0)

e q− p + 1 = f, para 0 ≤ p, p < q ≤ m e p < q0 ≤ m0. Desta forma, a subsequência sub(s, p, q) é uma janela de tamanho f .

Exemplo 3. Abaixo são esboçadas duas soluções que diferem por uma sequência contínua de permutações. Regiões diferentes são representados por caixas cinzas. Neste exemplo, s tem x permutações e s0 tem y permutações nas respectivas caixas cinzas.

s =< (+2 +1

−5

−3 +16 +17),

(+2 +3 +4

−1 +16 +17),

(−5 −4 −3

−1 +16 +17),

(+1 +2 +3 +15 +16 +17)>

s =<

. . .

. . .

. . .

(−5 −4 −3

. . .

+15 +16 +17),

. . .

(+2 +1

−5

−3 +16 +17),

(+2 +3 +4

−1 +16 +17),

(−5 −4 −3

−1 +16 +17),

(+1 +2 +3 +15 +16 +17)>

. . .

. . .

. . .

(−5 −4 −3

. . .

+15 +16 +17),

. . .

permutations

permutations

x

y

Portanto, sub(s, 0, p) = sub(s0, 0, p) e sub(s, q, m) = sub(s0, q0, m0). A janela sub(s, p, q) tem tamanho f = x + 2, pois também incluímos as permutações sp = s0p0 e sq = s0q0.

Desta forma, é dito que s0 ∈ Nx+2(s). Um raciocínio similar leva a conclusão de que

s∈ Ny+2(s0).

3.3

Estrutura da Meta-heurística

Na Seção 1.2 nós apresentamos o Algoritmo 2, que é o modelo da meta-heurística GRASP que utilizamos como base para desenvolver o nosso método. Contudo, gostaríamos de destacar a adaptação que realizamos neste modelo: definimos a etapa de construção como uma sub-etapa da busca local (no modelo original estas eram etapas independentes). A nossa meta-heurística é descrita mais detalhadamente a seguir.

Seja s =< s0, s1, . . . , sm > uma solução em S e seja sub(s, p, q) uma janela (conforme

as definições apresentadas na Seção 3.2), a sequência de reversões que transforma sp em

sq é a mesma que poderia ser usada para transformar s−1q sp em ι, de forma que podemos

substituir a sequência de reversões original da janela por < s−1q sp, s−1q sp+1, . . . , s−1q sq >,

onde s−1q sq = ι. Portanto, criar uma nova sequência para a janela sub(s, p, q) é equivalente

a ordenar a permutação α = s−1q sp por reversões ponderadas. Na Seção 3.4 é mostrado o

método para a criação de uma nova janela sub(s, p, q).

Seja sub(s, p, q) uma janela de tamanho q− p + 1 = f, uma solução encontrada para ordenar a permutação s−1q sp pode ser facilmente transformada em uma sequência para

transformar sp em sq. Se esta nova sequência custa menos do que sub(s, p, q), a janela

CAPÍTULO 3. META-HEURÍSTICA GRASP 49

Destacamos que para os casos em que temos o tamanho da sequência de solução s menor do que o temanho da janela, |s| < f, utilizamos o tamanho da sequência como o tamanho da janela. Ou seja, na prática o tamanho da jenela em uma solucão s é f = min(k,|s|).

Para uma dada solução s de tamanho m, existem m − f + 1 janelas diferentes de tamanho f em s. Experimentalmente verificamos que as janelas com maior custo total apresentam maior probabilidade de serem melhoradas. Contudo, para preservar a diver- sidade nas soluções, evitando que o algoritmo atinja mínimos locais rapidamente, nós adotamos um mecanismo para escolher aleatoriamente uma janela de forma que a pro- babilidade de uma janela ser escolhida é proporcional ao respectivo custo. A seguir é mostrado o método para selecionar uma janela a cada iteração.

1. Primeiramente é calculado o custo de cada janela sub(s, p, q) =< sp, sp+1, . . . , sq >

somando o custo de cada reversão ρktal que sk = sk−1ρk, p < k ≤ q. Em seguida são

selecionadas as janelas de maior custo. O número de janelas selecionadas é definido pelo parâmetro nomeado limite_janelas. As janelas não selecionadas nesta etapa são descartadas.

2. A janela é selecionada pelo algoritmo roulette wheel selection mechanism, que é bem comum em Algoritmos Genéticos [5], o pseudocódigo é apresentado no Algo- ritmo 5. Neste algoritmo, a variável elementos recebe uma lista de janelas se- lecionadas no item 1. A pontuação de cada janela é dada por pontuacoes[i] custo[i]− custo[min] + 1, onde custo é a sequência de custo de cada janela na va- riável elementos e min é o índice do menor elemento. Em seguida, é gerado um número aleatório R ∈ [0..T ], onde T é a soma de todos os custos em pontuacoes. Finalmente é selecionada a primeira janela na sequência tal que, quando todos as pontuações prévias são somadas, é obtido um valor menor ou igual a R.

Após o intervalo da janela ter sido selecionado, nós empregamos o algoritmo descrito na seção a seguir (Seção 3.4) para gerar uma nova sequência de reversões para a janela selecionada. Caso possua menor custo, esta sequência substituirá a sequência corrente. Este processo é repetido por um número de iterações definido previamente por um parâ- metro. Como esperado, quanto maior o número de iterações, melhor a resposta gerada. Um estudo da relação de custo-benefício entre qualidade da solução e tempo computacio- nal é necessário para determinar o número de iterações adequadas para uma determinada aplicação.

No nosso algoritmo de busca local, a primeira solução que melhora a solucão corrente é adotada como a nova solução corrente. Esta estratégia segue o modelo first-improving, que foi discutido na Seção 1.2.

3.4

Construção de soluções

A etapa de construção de soluções consiste, a cada iteração, em escolher uma reversão de um conjunto de reversões disponíveis, até que a solução esteja completa.

Um método com este propósito pode ter variações tanto em relação ao algoritmo de geração do conjunto de reversões candidatas quanto ao algoritmo para escolher uma rever- são para compor a solução. Ao longo da pesquisa realizamos experimentos e analisamos diversos métodos.

Nesta seção, apresentamos duas abordagens para a construção de soluções. Essas duas abordagens empregam estratégia GRASP para a escolha de reversões, mas diferenciam- se em relação ao método para gerar o conjunto de reversões e também nas heurísticas utilizadas na estratégia GRASP para escolher reversões.

A primeira abordagem foi desenvolvida a partir do foco em estender o nosso traba- lho em ordenação por reversões ponderadas também para permutações com sinal. Para a geração do conjunto de reversões utilizamos uma versão adaptada do algoritmo desen- volvido inicialmente por Bergeron [11].

Na nossa segunda abordagem passamos a utilizar uma implementação do algoritmo GRIMM, de Tesler e Glenn [44], para obter soluções para o problema com sinal, o qual considera um conjunto de reversões maior a cada iteração. Também expandimos nosso algoritmo para a variação com permutações sem sinal. Para isto, desenvolvemos um algoritmo para construir um conjunto de reversões candidatas para este problema, o que resultou na segunda abordagem.

Nós apresentamos a seguir as duas abordagens em detalhes. Primeira abordagem

Desenvolvemos esta abordagem para a variação com sinal do problema. Neste método, para uma permutação π, uma reversão é selecionada do conjunto de reversões candida- tas para estender a solução parcial a cada iteração. Para cada reversão candidata, é atribuída uma pontuação baseada na respectiva probabilidade de produzir uma solução com reversões curtas. Em outras palavras, nós estimamos o benefício de cada reversão. Nós analisamos o benefício baseado em dois aspectos da permutação: número de pares orientados (nop(π)) [11] e entropia (ent(π)).

O conceito de par orientado foi apresentado inicialmente por Bergeron [11] para ser usado em um algoritmo para o problema de ordenação por reversões com custos unitários. Na Definição 10 é apresentado o conceito de reversão induzida por um par orientado.

O algoritmo apresentado por Bergeron [11] utiliza reversões induzidas para maximizar o número de pares orientados na próxima permutação da sequência que forma a solução, o que somente é possível quando π tem pelo menos um elemento negativo. Se π tem somente elementos positivos, então nós temos um “hurdle” como definido por Hannenhalli e Pevzner [29], o qual não possui pares orientados, nop(π) = 0. Nestes casos, podemos utilizar as operações “hurdle cutting” e “hurdle merging” como mostrado por Bergeron [11]. Desta forma, nós buscamos selecionar reversões que diminuam o nível de entropia e ao mesmo tempo nós buscamos também selecionar reversões que aumentem o número de pares orientados, seguindo a linha de raciocíno proposta por Bergeron. Considerando estas duas métricas, nós desenvolvemos a nova métrica enop, conforme mostrada na De- finição 20.

CAPÍTULO 3. META-HEURÍSTICA GRASP 51

Definição 20. Dada uma permutação π, nós definimos a métrica enop como uma relação entre as métricas entropia ent(π) (Definição 9) e o número de pares orientados nop(π) (Definição 11).

enop(π) = ent(π)/nop(π)

Em nossos experimentos, nós utilizamos tanto a enop quanto somente a entropia como métricas para computação do benefício de reversões. Isto resultou nas duas funções para computação de benefício mostradas na Definição 21.

Definição 21. Seja ρ uma reversão aplicável a uma permutação π, nós definimos o seu benefício em duas formas diferentes:

δ1(π, ρ) = ent(π)−ent(πρ)cost(ρ)

δ2(π, ρ) =

enop(π)−enop(πρ) cost(ρ)

Ambas as funções de benefício tem a desejável propriedade que, se continuarmos apli- cando reversões com benefício positivo em π, vamos eventualmente atingir a permutação identidade. Contudo, como já foi explicado no capítulo anterior, encontramos algumas permutações para as quais não há reversões com benefício positivo. Devido a isto, de- cidimos considerar somente reversões que são induzidas por pares orientados quando π tem elementos negativos. Desta forma, garantimos que pelo menos um breakpoint será removido. Quando π não tem elementos negativos, como explicado anteriormente, as operações “hurdle cutting” e “hurdle merging” [11] são usadas.

Quando nós temos reversões induzidas por pares orientadas, a reversão que será usada para estender a solução inicial é escolhida seguindo as duas etapas a seguir.

1. Calculamos o benefício de cada reversão ρ induzida por um par orientado, então selecionamos um número limitado de reversões com os maiores benefícios. O número exato de reversões que serão movidas para a segunda fase é definida como um parâmetro nomeado numero_reversoes. As reversões que não foram selecionadas serão descartadas. Desta forma temos uma lista restrita de elementos (RCL), como apresentado na Seção 1.2.

2. As reversões que não foram descartadas no item 1 devem ser selecionadas pelo algoritmo roulette wheel mechanism descrito no Algoritmo 5. Cada permutação tem probabilidade de ser selecionada proporcional ao respectivo benefício. A variável elementos recebe uma lista de reversões selecionadas na etapa anterior e a variável pontuacoes recebe o benefício de cada reversão.

Considerando que temos duas funções para calcular o benefício de uma inversão (δ1

e δ2), executamos todo o algoritmo duas vezes, utilizando uma função diferente em cada

uma das execuções. Em seguida, escolhemos como a solução final aquela que possui o menor custo.

Segunda abordagem

Nesta nossa segunda abordagem, novamente desenvolvemos um algoritmo para construir uma solução para uma permutação π. Nesta abordagem somente é utilizado a entropia (ent(π)) como métrica para computar o benefício de reversões.

É notado que ent(π) = 0 se e somente se π = ι. Portanto, buscamos selecionar rever- sões que diminuam a entropia. Como um critério adicional, deve-se selecionar reversões que não custem muito. Portanto, a seguinte definição junta ambos os conceitos em uma função gulosa. Notamos que no Capítulo 1 nós apresentamos duas definições para en- tropia, uma para a variação sem sinal (Definição 8) e outra para a variação com sinal (Definição 9).

Definição 22. Seja π uma permutação (com sinal ou sem sinal) e seja ρ uma reversão, é definido o benefício da função como ben(π, ρ) = ent(π)−ent(πρ)cost(ρ) .

Esta definição de benefício é bastante similar à que foi utilizada no algoritmo do capítulo anterior, que era restrito a permutações sem sinal. De modo análogo, foram encontradas algumas permutações para as quais não há reversões com benefício positivo que possam ser aplicadas. Para garantir que uma solução será criada, o conjunto de reversões considerado deve ser limitado. A forma que o conjunto de reversões é limitado difere quando são consideradas permutações sem sinal ou com sinal.

Seja π uma permutação com sinal, Hannenhalli e Pevzner [29] apresentaram um algo- ritmo polinomial para ordenar π usando o número mínimo de reversões. Este algoritmo pode gerar muitas soluções ótimas diferentes, pois em cada etapa é construído um con- junto de reversões seguras (reversões que levam a uma solução ótima). Este conjunto de reversões seguras é um superconjunto das reversões consideradas no algoritmo de Ber- geron [11], pois não é limitado às reversões induzidas por pares orientados. Também realizamos experimentos com o algoritmo apresentado por Siepel [39], que gera todas as soluções ótimas para o problema. Entretanto, na prática esse método não nos levou a encontrar soluções melhores.

Portanto, utilizando o conjunto de reversões fornecido por este algoritmo em cada etapa no nosso método, garantimos que eventualmente atingiremos a permutação identi- dade.

Seja π uma reversão sem sinal, Caprara [16] provou que encontrar uma solução ótima para o problema de ordenação por reversões é NP-Completo. Contudo, pode ser empre- gado o número de breakpoints (veja Definição 5) para identificar reversões que levam a uma permutação mais próxima da identidade. Para a compreensão deste conceito nós utilizaremos a Definição 7 sobre strip.

Além disto, Kececioglu e Sankoff [31] provaram que toda permutação que tem pelo menos uma strip decrescente tem pelo menos uma reversão que remove pelo menos um breakpoint (como explicado no Teorema 7 e Lema 8). Se todas as strips em π forem crescentes, podemos reverter qualquer strip crescente para se obter uma strip decrescente. Isto garante que pelo menos um breakpoint é removido a cada duas reversões aplicadas.

Como uma reversão pode remover no máximo 2 breakpoints, esta abordagem permite a construção de um algoritmo aproximado de fator 4 para o problema ordenação por reversões de custos unitárias para permutações sem sinal, o qual pode ser implementado com complexidade de tempo O(n2).

CAPÍTULO 3. META-HEURÍSTICA GRASP 53

π e π· ρ é definido a seguir:

∆ben(π,ρ) = ben(π· ρ) − ben(π)

Teorema 7. Se o elemento k pertence a uma strip decrescente e o elemento k−1 pertence a uma strip crescente, então existe uma reversão ρ tal que ∆b(π,ρ) < 0 (Definição 3.4).

Lema 8. Seja π uma permutação com ao menos uma strip decrescente. Então, existe uma reversão ρ tal que ∆b(π,ρ) < 0.

Definição 24. Conforme o Teorema 7 e Lema 8, nós podemos definir reversões que removem breakpoints. Seja [w..k] uma strip decrescente em uma permutação π, até duas reversões podem ser aplicadas para diminuir o número de breakpoints.

− Caso exista uma strip crescente [l..k − 1]: – ρ1 = (π−1k + 1, π −1 k−1), caso π −1 k < π −1 k−1 – ρ1 = (π−1k + 1, π−1k−1), caso πk−1 > π−1k−1

− Caso exista uma strip crescente [w + 1..l]: – ρ2 = (π−1w , π −1 w+1− 1), caso π −1 w < π −1 w+1 – ρ2 = (π−1w+1, π −1 w − 1), caso π −1 w > π −1 w+1

Estando ciente do conjunto de reversões consideradas para as versões com e sem si- nal do problema podemos descrever o método geral para construção de soluções nesta abordagem, o qual é composto das etapas a seguir.

1. Construimos um conjunto de reversões distintas que removem pelo menos um bre- akpoint, tais reversões devem satisfazer a Definição 24. Caso não exista nenhuma reversão desse tipo (quando a permutação não tem strips decrescentes), nós cons- truímos, alternativamente, um conjunto formado pelas reversões que invertem uma strip crescente.

2. Calculamos o benefício de cada reversão ρ que satisfaz às restrições previamente descritas, então é selecionado um número limitado de reversões que têm o máximo benefício. O número exato de reversões que serão consideradas na segunda etapa é definido como um parâmetro nomeado numero_reversoes. As reversões que não foram selecionadas nesta etapa serão descartadas.

3. Utilizando o algoritmo roulette wheel mechanism, descrito no Algoritmo 5, selecio- namos uma reversão do conjunto obtido na etapa anterior. Cada permutação tem uma probabilidade de ser selecionada proporcional ao respectivo benefício. A va- riável elementos recebe uma lista de reversões selecionadas na etapa anterior e a variável pontuacoes recebe o benefício de cada reversão.

3.5

Resultados

Nesta Seção, nós descrevemos e analisamos os resultados obtidos dos experimentos que realizamos nos algoritmos apresentados neste capítulo. Para realizar estes experimentos nós implementamos nossos algoritmos em C++. O código fonte desta implementação está disponível para acesso.1

Os resultados são divididos em dois grupos, os quais são diferenciados em relação à abordagem utilizada para a construção de soluções, conforme tratado na Seção 3.4, configuração de parâmetros e configuração de execução.

A primeira abordagem abrange somente permutações com sinal, enquanto a segunda abordagem também trata de permutações sem sinal.

Além disto, foram utilizados conjunto de instâncias distintos para os experimentos realizados para cada abordagem.

3.5.1

Primeira abordagem

Nesta seção, nós mostramos os resultados de experimentos realizados com a nossa meta- heurística quando é utilizada a estrutura de Bergeron [11] para construção de soluções. A seguir nós apresentamos um resumo dos parâmetros e configuração de execução utilizados nesta abordagem.

1. Para o tamanho de janela f adotamos uma sequência de tamanhos de janelas. Em nossos experimentos obtivemos os melhores resultados com a sequência de tamanhos de janelas < 14, 12, 10, 8, 6, 4 >, de forma que executamos 150 iterações para cada tamanho de janela. No total nosso algoritmo executa 900 iterações.

2. Na Seção 3.3 nós mencionamos o parâmetro limite_janelas. Este parâmetro é definido como a porcentagem das janelas com maior custo que serão selecionados para serem utilizadas na etapa seguinte. Realizamos experimentos com vários valores de parâmetro, como 25%, 50% e 75%. Nossa conclusão final é que o valor 75% nos leva aos melhores resultados.

3. Na Seção 3.4, mencionamos o parâmetro numero_reversoes. Este parâmetro é fixado independentemente do número de reversões disponíveis. Nós realizamos ex- perimentos com vários valores para numero_reversoes, como 3, 5, 10, 15 e 20. Nossa conclusão final é que 5 é o valor que leva aos melhores resultados.

Utilizando estes parâmetros foram obtidos os tempos de execução mostrados na Ta- bela 3.1.

Para encontrar a complexidade de tempo da nossa implementação, mostramos a seguir a análise de cada parte.

1. Utilizamos GRIMM para obter uma solução inicial, o qual possui tempo de execução O(n4).

CAPÍTULO 3. META-HEURÍSTICA GRASP 55 Tamanho Tempo 10 0.6 15 1.5 20 3.1 25 5.1 30 7.3 35 9.9 40 12.2 45 14.5 50 16.6 55 21.7 60 25.1 65 27.7 70 32.1 75 32.1 80 27.5 85 29.3 90 31.2 95 32.8 100 34.4

Tabela 3.1: Tempo médio (em segundos) para processar cada permutação de um dado tamanho. Para cada tamanho, nós geramos 1000 permutações aleatórias.

2. O número de iterações é um parâmetro que denominamos por l.

3. Para selecionar uma janela, precisamos de tempo O(m log m), onde m é o número de permutações na solução inicial. Relembre que a primeira etapa para selecionar uma janela consiste de escolher um número limitado de janelas de alto custo, o que podemos fazer ordenando a lista de janelas. Portanto obtemos a complexidade O(n log n), pois m = O(n).

4. Nós precisamos de O(f n2) para construir uma nova solução para substituir a janela.

A cada etapa construímos um conjunto de reversões induzidas por pares orientados de tamanho O(n2) e precisamos de tempo O(n) para computar o benefício de cada janela. Além disso, a nova janela terá tamanho proporcional a f .

A complexidade final deste algoritmo é O(Solucao_Inicial +Iteracoes×(Buscar_Janela +M elhorar_J anela)), o que resulta em O(n4 + l(n log n + f n2)). Depois de algumas simplificações, concluímos que nossa implementação executa em O(n4+ f ln2). Esta com- plexidade pode ser reduzida para O(f ln2) se usarmos o algoritmo proposto por Tannier

e Sagot [43] para obter a solução inicial, que executa em tempo O(n√n log n).

A principal medida de qualidade usada em nossos experimentos é a diferença em custo entre a sequência produzida por nossa implementação e a solução inicial produzida pelo GRIMM.

Para n no intervalo {10, 15, . . . , 100}, nós geramos 1000 permutações aleatórias e as utilizamos como entrada para a nossa implementação. A Figura 3.5 mostra com qual

frequência nossa abordagem melhora a solução inicial. Conseguimos melhorar a solução inicial em 94.0% dos casos de teste. Quando consideramos somente permutações grandes, tais como n≥ 50, nós notamos que 99.3% das soluções iniciais foram melhoradas.

Os padrões de preenchimento das barras na Figura 3.5 representam tamanhos de jane- las e, portanto, as barras nos mostram quais tamanhos foram responsáveis pelo primeiro melhoramento na solução inicial. Como um exemplo, para n = 100 nós conseguimos me- lhorar 99.8% das soluções iniciais. Em 94.4% dos casos o primeiro melhoramento ocorre quando f = 14 e em 4.4% dos casos o primeiro melhoramento ocorre quando f = 12. Notamos que para o tamanho N = 10, nas iterações para f = 12 e f = 14 foi utilizado f = 10 na prática. 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100% 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 % Soluções melhoradas N f 14 12 10 8 6 4

Figura 3.5: Este gráfico mostra a porcentagem de vezes que nosso algoritmo melhora a solução inicial. Em geral, a solução inicial foi melhorada em 94.0% dos casos. Se nós considerarmos somente permutações grandes tais que n≥ 50, nós observamos que 99.3% da soluções iniciais foram melhoradas. Nesse gráfico, os padrões de preenchimento das barras representam tamanhos de janelas e barras nos mostram quais tamanhos de janelas foram responsáveis pela primeira melhoria na solução inicial.Notamos que para o tamanho N = 10, nas iterações para f = 12 e f = 14 foi utilizado f = 10 na prática.

A Figura 3.6 mostra a porcentagem de melhoramento em média obtida usando nosso algoritmo. Seja Sinicial a solução inicial e Sf inal a solução final produzida pelo nosso

Documentos relacionados