• Nenhum resultado encontrado

3 Algoritmos Exatos

3.2 Branch-and-bound

A técnica branch-and-bound também baseia seu mecanismo de busca no espaço de soluções no percorrimento de um grafo acíclico implícito. Segundo Brassard e Bratley (1996), a diferença básica entre essas técnicas é que, no caso do branch-and-bound, a cada nó visitado no grafo implícito, limites inferiores e superiores são calculados para definir se a busca naquele subgrafo deve prosseguir ou não, enquanto que o backtracking clássico não adota esse tipo de critério.

No branch-and-bound desenvolvido, o cálculo dos limites é combinado com uma busca em profundidade no grafo implícito. Os limites são usados para podar ramificações da árvore de busca e também para definir qual subárvore do grafo implícito parece ser mais promissora, de forma que este ramo possa ser explorado primeiro.

Considerando que o problema da AGQA-bi é um problema de minimização, um limite superior representa a melhor solução de fato encontrada até o momento e o limite inferior é uma estimativa “otimista” da melhor solução que ainda pode ser encontrada a partir da solução parcial construída. Por “otimista” quer-se dizer que o valor real da melhor solução que pode ser encontrada a partir da solução parcial construída nunca será melhor que o valor do limite inferior. Nesse sentido, se, para um dado nó do grafo implícito (uma configuração parcial da árvore) o limite inferior é pior que o limite superior, não vale a pena continuar a busca na subárvore enraizada pelo nó visitado, pois nenhuma árvore contendo tal configuração parcial pode ser melhor que a solução já encontrada. Neste

caso, ocorre uma poda, ou seja, o procedimento de backtrack é antecipado com o objetivo de evitar a exploração desnecessária de espaço de busca.

Tendo em vista que o problema da AGQA-bi possui múltiplos objetivos, o limite supe- rior adotado neste algoritmo é o próprio conjunto de soluções não-dominadas encontrado até o momento, ou seja, ParetoFront.

O limite inferior, por sua vez, é uma adaptação do limite inferior empregado por Assad e Xu (1992) para a solução do problema da AGMQA, conforme subseção 2.4.1.2. Para o caso biobjetivo, o limite inferior é dado por um par ordenado, em que o primeiro elemento representa o limite inferior para o custo linear e, o segundo, o limite inferior para o custo quadrático.

O limite inferior no que se refere ao objetivo linear é o custo da AGM de G quando define-se que as arestas que compõem a configuração parcial da árvore são obrigatórias na AGM e considera-se como pesos das arestas unicamente seus respectivos custos lineares. O limite inferior para o objetivo quadrático também corresponde ao custo total de uma AGM de G em que as arestas da configuração parcial da árvore são obrigatórias. Entretanto, neste caso, o custo lbi associado a cada aresta ei de G que está fora da árvore é dado pelas

Expressões 3.1. lbi =    minncij|j ∈ Li o , se I ∩ Ai = {} P

j∈I(cij + cji), caso contrário

(3.1)

O algoritmo branch-and-bound desenvolvido emprega a mesma estrutura do algoritmo backtracking descrito. Neste sentido, as seguintes variáveis são utilizadas: listaL, pilhaO, tamSolAtual, P aretoF ront. A solução também é representada por um conjunto de ares- tas, tal como proposto por Raidl e Julstrom (2003). O algoritmo inicia com todas as arestas do grafo de entrada disponíveis para entrar na árvore. Ou seja, listaL é iniciada com as arestas de G. O heurística H2 escalarizada é adotada para iniciar P aretoF ront, assim como no backtracking. Dessa forma, obtém-se um limite superior inicial, o qual possibilita que as podas ocorram em profundidades mais baixas da árvore de busca. As outras variáveis são inicialmente vazias.

A cada passo do algoritmo, a aresta disponível com menor limite inferior no que se refere ao objetivo quadrático, e, é selecionada para entrar na árvore. Se a inclusão da aresta e não induz a existência de um ciclo na árvore parcial, essa aresta é removida de listaL e inserida na solução na posição tamSolAtual. A aresta e também é inserida em

pilhaO com o valor do nível no grafo igual a tamSolAtual.

Se, ao adicionar a aresta e na árvore uma árvore geradora tenha sido completada, calcula-se o valor da função-objetivo para a árvore criada (de acordo com as Expressões 2.5-2.7) e a mesma é adicionada ao conjunto de soluções não-dominadas encontradas até o momento, ParetoFront.

Por outro lado, caso a adição de e não seja suficiente para completar a árvore, o limite inferior é recalculado considerando que e seja aresta mandatória. O valor do limite inferior (um par ordenado) é comparado com os valores da função-objetivo das soluções, não-dominadas, em ParetoFront. Se o valor do novo limite for dominado em relação ao conjunto ParetoFront, a árvore é podada. Isso significa que a busca nesta subárvore do grafo implícito é prematuramente concluída e um backtrack é realizado. Senão, a busca prossegue e o contador é incrementado em uma unidade, confirmando que a aresta e permanece na configuração parcial da árvore.

Assim como no backtracking, quando a aresta e avaliada na iteração i não pode ser in- serida na árvore em virtude de sua inserção gerar ciclo, e é incluída em pilhaO, juntamente com o valor de tamSolAtual.

No branch-and-bound, o mesmo procedimento do backtracking ocorre quando listaL se torna vazia. Nessa perspectiva, se tamSolAtual for diferente de zero, ocorre o backtrack, ou retorno. Por outro lado, se tamSolAtual for igual a zero, então todas as arestas estão proibidas, indicando que todo o espaço de soluções já foi explorado e que a busca foi concluída.

O pseudo-código do algoritmo branch-and-bound implementado está disponível a se- guir. Como entrada do algoritmo temos um grafo G = (V, E) e, como saída, o conjunto de soluções não-dominadas, o qual corresponde à fronteira de Pareto ótima.

A literatura considera que, em geral, há uma grande diferença de desempenho entre as abordagens backtracking e branch-and-bound em favor do algoritmo branch-and-bound. Isso ocorre porque, quanto melhor for o limite inferior e superior calculado, maior o número de podas realizadas, menor a profundidade nas quais elas ocorrem e, pois, menor o espaço de busca pesquisado. É interessante notar que, para que tal fato seja verdade, deve ser possível calcular os limites de forma relativamente eficiente, para que o tempo de cálculo desses valores não supere o tempo que será economizado por meio das podas. Os algoritmos exatos implementados foram submetidos a experimentos computacionais, os quais estão relatados no Capítulo 4 e confirmam os resultados esperados.

Algoritmo 2 Algoritmo branch-and-bound (G = (V, E)) Adicione todas as arestas de G a listaL

Inicialize sol com uma árvore vazia Inicie pilhaO também vazia

Inicie ParetoFront com soluções da heurística H2 escalarizada end ← f also e tamSolAtual ← 0

lb ← CalculeLimiteInferior (sol) enquanto !end faça

e ← Aresta de listaL com menor valor de lbi

se e não existe porque listaL está vazia então se tamSolAtual = 0 então

end ← verdadeiro senão

Retire de pilhaO os elementos associado com tamSolAtual Reinsira tais elementos em listaL

tamSolAtual ← tamSolAtual − 1 fim se

senão se a inserção de e em sol não gerar ciclo então sol[tamSolAtual] ← e

Adicione (e, tamSolAtual) a pilhaO Remova e de listaL

se sol corresponde a uma árvore completa então Calcule o valor da função-objetivo para sol Atualize ParetoFront de acordo com sol senão

lb ← CalculeLimiteInferior (sol)

se ParetoFront.Domina (lb) for falso então tamSolAtual ← tamSolAtual + 1

fim se fim se senão

Adicione (e, tamSolAtual) a pilhaO Remova e de listaL

fim se fim enquanto retorne ParetoFront

4

Experimentos Computacionais –