Implementações do método de aproximação primal-dual Aplicado ao problema da floresta de Steiner Aluno: Rafael Pereira Luna Orientadora: Cristina Gomes Fernandes
Sumário 1. O problema da floresta de Steiner 2. Algoritmo de Goemans e Williamson 3. Implementação do algoritmo
O Problema da Floresta de Steiner Dados: um grafo G com custos nas arestas e uma família R de subconjuntos de V(G). Encontrar: uma R -floresta de custo mínimo. Uma R -floresta é uma floresta geradora na qual cada conjunto de R se encontra em uma única componente.
Um exemplo:
Terminologia Conjunto de terminais: cada um dos conjuntos da coleção R . Vértices de Steiner: vértices que não estão nos conjuntos de terminais.
Voltando ao exemplo...
Como resolver o problema? Não se conhece algoritmo polinomial para resolver o problema de maneira exata. Problema NP-difícil: quando |R | = 1, o problema se reduz ao problema de Steiner em grafos, o qual é NP-difícil [Garey & Johnson’ 79].
Algoritmo de Goemans e Williamson 2-aproximação para o problema da floresta de Steiner. Algoritmo baseado no método de aproximação primal-dual.
Conjunto ativo: subconjunto de V(G) que separa vértices de um mesmo conjunto de terminais. Primal: Dual:
Algoritmo MinFs-GW(G , c , R )
Algumas alterações Definir:
Algoritmo MinFs-GW2(G , c , R )
Implementação do algoritmo [O(n² log n)] Estruturas de dados: Conjuntos de terminais: a cada conjunto de terminais T em R associamos uma lista dos vértices de T ; o número de vértices em T ;
Componentes: a cada componente S da floresta associamos dois heaps de arestas: . H0 (S): mantém as arestas que ligam S a componentes inativas da floresta; . H1 (S): mantém as arestas que ligam S a componentes ativas da floresta; (cada heap contém no máximo uma aresta para cada outra componente) uma lista dos vértices que fazem parte de S ;
Componentes (continuação): um vetor que informa para cada conjunto de terminais R o número de vértices de R que se encontram na componente S ; contador do número de conjuntos de terminais não conectados que intersectam S ; Vértices: a cada vértice v associamos o conjunto de terminais ao qual v pertence; a componente da qual v faz parte; o valor corrente de d(v) .
Implementação do algoritmo Inicialização das estruturas (linhas 1 a 3) Conjuntos de terminais: Componentes: Vértices: O( n ) . O( n2 ) . O( n ) .
Implementação do algoritmo Fase iterativa (linhas 4 a 7) escolha da aresta uv a ser incluída na floresta : são examinadas apenas duas arestas por componente ativa [O( n )] . atualização do valor de d(w) : é efetuada percorrendo-se a lista de componentes da floresta união das componentes Su e Sv : é realizada em duas etapas (3a e 3b) [O( n )] .
Implementação do algoritmo Fase iterativa (continuação) a. União das listas de vértices e definição do estado de Su U Sv [O( n log n ) no total] . b. União dos heaps de arestas [O( n log n )] .
Implementação do algoritmo Segunda fase (linha 8) determinação do ancestral comum mais próximo (acmp) de cada conjunto de terminais. Seleção das arestas: para cada árvore T seja l uma lista em pré-ordem dos acmp’s percorre-se l, selecionando, para cada acmp v, as arestas no caminho entre cada vértice no(s) conjunto(s) de terminais correspondente(s) e v.
Outras implementações Cole, Hariharan, Lewenstein e Porat : O( (n+m ) log2 n ) . Klein: O(n m1/2 log n) . Gabow, Goemans e Williamson: O(n (n + m1/2 log log n ) ) .