2.7 Arvore de Steiner 18 ´
3.1.2 Descri¸c˜ao do algoritmo
Nesta fase, crescemos o valor das vari´aveis duais αj para todas as demandas simul-
taneamente. Introduzimos a no¸c˜ao de tempo, t. No in´ıcio do algoritmo, t = 0. A cada intervalo, o tempo ´e acrescido de uma unidade. A medida que o tempo cresce, tamb´em cresce o valor das vari´aveis duais αj de forma uniforme. Algumas localidades podem estar
3.1. Rent-or-Buy 26
w demanda
local da intersec¸c˜ao u
Figura 3.1: Supondo M = 3, quando trˆes raios se interceptam no meio de uma aresta, uma localidade pode ser aberta neste lugar, assim como foi dito na Suposi¸c˜ao 3.3 (m´etrica infinitesimal nas arestas).
M ou mais raios se interceptam nesta localidade, como veremos a seguir. Al´em disso, pos-
teriormente, um subconjunto das localidades possivelmente abertas ser´a escolhido para serem abertas na solu¸c˜ao final do algoritmo. Quando t = 0, r est´a possivelmente aberta e todas as outras localidades est˜ao fechadas.
A fun¸c˜ao objetivo do dual do programa linear quer aumentar o valor das vari´aveis duais
αj. No entanto, estas n˜ao podem crescer para sempre devido `as restri¸c˜oes do programa
linear (lembrando que queremos uma solu¸c˜ao dual vi´avel). Assim crescemos αj at´e esta
ficar justa em alguma localidade i. Ou seja, uma vari´avel αj est´a justa com rela¸c˜ao a
alguma localidade i se αj ≥ cij. Seja Sj o conjunto de v´ertices aos quais j est´a justo em
um dado instante de tempo. Ao crescer αj, tamb´em crescemos θSj,j na mesma raz˜ao. Isto ir´a garantir a viabilidade das restri¸c˜oes (3.3), como veremos no Lema 3.4.
As demandas podem estar em dois estados: congeladas e n˜ao-congeladas. Quando uma demanda j fica congelada, paramos de crescer sua vari´avel dual αj. Se a demanda j
est´a n˜ao-congelada no instante de tempo t, ent˜ao αj = t. Ap´os j ser congelada, ela n˜ao
mais fica justa com nenhuma outra nova localidade, i.e., uma localidade que n˜ao pertence a Sj, pois o raio de j parou de crescer. No in´ıcio do algoritmo, todas as demandas est˜ao
n˜ao-congeladas.
Come¸camos crescendo `a raz˜ao unit´aria a vari´avel αj de todas as demandas simulta-
neamente, at´e um desses eventos ocorrer (se v´arios eventos ocorrerem ao mesmo tempo, considere eles em qualquer ordem):
1. j se ajusta com uma localidade i possivelmente aberta: j se torna congelada. 2. Uma localidade fechada i fica justa com pelo menos M demandas: i fica possivelmente aberta. Todos os pontos de demandas que est˜ao justos com i tornam- se congelados.
3.1. Rent-or-Buy 27
A cada itera¸c˜ao, crescemos a vari´avel αj somente das demandas n˜ao-congeladas. Con-
tinuamos este processo at´e que todas as demandas fiquem congeladas.
demanda congelada demanda n˜ao congelada localidade fechada
localidade possivelmente aberta
t = 0 t = 1 l i 1 2 3 4 5 l i 1 2 3 4 5 t = 3 t = 2 l i 1 2 3 4 5 l i 1 2 3 4 5 r r r r
(d)
(c)
(b)
(a)
Figura 3.2: Um exemplo de execu¸c˜ao com M = 2. (a) O estado inicial, (b) t=1, (c) i fica justo com as demandas 1 e 2; i fica possivelmente aberto e 1 e 2 ficam congelados, (d) A solu¸c˜ao final. A demanda 3 alcan¸ca i e fica congelada; l fica justa com as demandas 4 e 5 e fica possivelmente aberta, fazendo com que 4 e 5 congelem.
Note que, ainda que haja um continuum de pontos ao longo de uma aresta, para implementar o processo descrito acima precisamos somente saber o instante em que o pr´oximo evento ir´a acontecer. Isto pode ser feito monitorando, para cada aresta e cada demanda j, a parte da aresta que est´a justa com j.
Agora vamos decidir quais localidades devem ser abertas. Seja L o conjunto das localidades possivelmente abertas. Dizemos que as localidades i, i0 ∈ L s˜ao dependentes
3.1. Rent-or-Buy 28
conjunto de localidades ´e independente se n˜ao h´a duas localidades dependentes neste conjunto. Devemos ent˜ao encontrar um conjunto independente maximal L0 de localidades
em L da seguinte forma: arranje as localidades em L em ordem do instante de tempo em que foram marcadas como possivelmente abertas. Considere as localidades nesta ordem e adicione uma localidade em L0 se esta n˜ao for dependente com alguma localidade j´a
presente em L0. Finalmente, as localidades em L0 s˜ao abertas. Observe que r ∈ L0.
Associamos uma demanda j a uma localidade aberta da seguinte forma. Se j est´a justa com alguma localidade i ∈ L0, atribua j `a i. Caso contr´ario, seja i a localidade
em L \ L0 a qual fez com que j congelasse. Ent˜ao j est´a justo com i. Deve haver uma
localidade i0 ∈ L0 aberta anteriormente tal que i e i0 s˜ao dependentes. Assim, atribu´ımos
j `a i0. Denotamos por σ(j) a localidade a qual j est´a atribu´ıda.
Temos agora que construir a ´arvore de Steiner em L0. Antes disso, devemos aumentar
o grafo G para incluir arestas incidentes `as localidades abertas que n˜ao s˜ao v´ertices (i.e., localidades que foram abertas em algum ponto ao longo de uma aresta). Seja {i1, . . . , ik}
as localidades abertas na aresta e = (u, w), ordenadas pela distˆancia com rela¸c˜ao `a u, com
i1 6= u e ik 6= w. Adicionamos ent˜ao as arestas (u, i1), (i1, i2), . . . , (ik−1, ik), (ik, w) em G.
Fase 2
Para uma localidade i ∈ L0, seja D
i o conjunto de demandas justas com i. Seja
D0 = S
i∈L0−{r}Di. Inicialmente, fazemos αj = 0 (os αj da Fase 2 assumir˜ao um valor
totalmente diferente do valor da Fase 1), para todo j ∈ D. Crescemos somente o valor
αj das demandas em D0, e simulamos o algoritmo primal-dual para o problema da ´arvore
de Steiner (enraizada) que foi apresentado no Algoritmo 2.2 do Cap´ıtulo 2 e ser´a descrito rapidamente abaixo.
Os conjuntos minimais violados (CMV) s˜ao os conjuntos unit´arios {i} para i ∈ L0−{r}.
Para um conjunto S, defina DS =
S
i∈S∩L0Di. A ´arvore T que iremos construir come¸ca
vazia. Para cada CMV S, j ∈ DS, a vari´avel αj cresce `a raz˜ao de 1/|DS|. A vari´avel θS,j
tamb´em cresce `a mesma raz˜ao. Assim, garantimos que PjθS,j cresce `a raz˜ao de 1 para
qualquer CMV S. Note que n˜ao estamos assegurando a viabilidade das restri¸c˜oes (3.3) e (3.4), pois αj pode ser maior que o lado direito destas restri¸c˜oes.
Dizemos que uma aresta se ajusta (ou fica justa) se a restri¸c˜ao (3.5) ´e satisfeita com igualdade para aquela aresta. N´os crescemos as vari´aveis duais at´e uma aresta e se ajustar. Adicionamos e em T e atualizamos os conjuntos minimais violados. Este processo continua at´e n˜ao haver mais conjuntos violados, i.e., continua at´e termos somente um componente (r est´a neste componente). Agora, consideramos as arestas de T na ordem inversa em que foram inseridas e removemos qualquer aresta redundante. Esta ´e nossa solu¸c˜ao final. A forma algor´ıtmica ´e apresentada a seguir. Em cada itera¸c˜ao, seja C o conjunto das demandas n˜ao-congeladas.
3.1. Rent-or-Buy 29
Algoritmo 3.1: RorB-primal-dual
Entrada: grafo G = (V, E), demandas D ⊆ V , parˆametro M > 1 Sa´ıda: ´arvore de Steiner T , facilidades L0 e atribui¸c˜oes σ(j)
in´ıcio
{Fase 1};
(Inicializa¸c˜ao) L ← {r}, C ← D; enquanto C 6= ∅ fa¸ca
aumente o tempo t at´e que alguma das condi¸c˜oes abaixo sejam satisfeitas; se j ∈ C e αj ≥ cij ent˜ao Di ← Di∪ {j}; se i ∈ L ent˜ao C ← C − {j}; se i 6∈ L e |Di| ≥ M ent˜ao C ← C − Di; L ← L ∪ {i}; se j ∈ C ent˜ao aumente αj e θSj,j
crie L0 removendo as localidades dependentes em L;
para todo i ∈ L \ L0 fa¸ca
para todo j ∈ Di fa¸ca
σ(j) ← {i0};
{Fase 2};
(Inicializa¸c˜ao) T ← ∅; D0 ←S
i∈L0−{r}Di; αj ← 0; θS,j ← 0;
Seja S a cole¸c˜ao dos conjuntos minimais violados; enquanto S 6= ∅ fa¸ca
se Pj∈DPS⊆V :e∈δ(S),r6∈SθS,j = M · ce ent˜ao
T ← T ∪ {e};
atualiza S;
se j ∈ D0 aumente uma unidade em α
j e 1/|DS| em θS,j;
remova todas arestas redundantes em T ; devolva T, L0 e as atribui¸c˜oes σ(j);
fim