instituto de engenharia de sistemas e computadores de ... · na maior parte dos problemas de...
TRANSCRIPT
1
Instituto de Engenharia de Sistemas e Computadores de Coimbra
Institute of Systems Engineering and Computers
INESC - Coimbra
Joana Dias, M. Eugénia Captivo e João Clímaco
Problema de Localização Dinâmica com Abertura, Fecho e Reabertura de Serviços: Formulação e Heurística
Primal-Dual
No. 6 2002
ISSN: 1645-2631
Instituto de Engenharia de Sistemas e Computadores de Coimbra
INESC - Coimbra
Rua Antero de Quental, 199; 3000-033 Coimbra; Portugal
www.inescc.pt
2
Problema de Localização Dinâmica com Abertura, Fecho e
Reabertura de Serviços: Formulação e Heurística
Primal-Dual JOANA DIAS(1), M. EUGÉNIA CAPTIVO(2) E JOÃO CLÍMACO(1)
(1) Faculdade de Economia e INESCC Universidade de Coimbra
Av. Dias da Silva 3000 Coimbra
Portugal (2) DEIO e CIO
Faculdade de Ciências da Universidade de Lisboa Campo Grande, Bloco C2, Piso 2
1749-016 Lisboa Portugal
Sumário:
Neste relatório iremos apresentar a formulação em Programação Inteira de um Problema de
Localização Dinâmica com Abertura, Fecho e Reabertura de Serviços. Este problema considera
a possibilidade de, durante o horizonte temporal considerado, ser possível abrir, fechar e reabrir
serviços. Através da bibliografia consultada, pensamos poder afirmar ser a primeira vez que
este problema de localização é estudado. Tendo como caso especial o problema de localização
simples, é imediato concluir que se trata de um problema NP-difícil. Foi desenvolvida uma
heurística, baseada nos trabalhos de Erlenkotter (1978) e Van Roy e Erlenkotter (1982), que
garante o cálculo de soluções primais e duais admissíveis, e que tenta forçar a
complementaridade entre elas. Desta forma, mesmo que não se atinja a solução óptima,
conhece-se sempre um limite inferior e um limite superior para o valor da função objectivo
primal. Descreve-se ainda um algoritmo de pesquisa em árvore em que esta heurística é
inserida, para que seja possível calcular a solução óptima do problema primal.
ABSTRACT: In this research report we will present the formulation of the dynamic location
problem with opening, closing and reopening of services. This problem considers the
possibility of opening, closing and reopening services during the planning horizon established.
The Simple Plant Location Problem is a special case of the problem described. We can
therefore state that it is a problem NP-Hard. We developed an heuristic, based on the work of
Erlenkotter (1978) and Van Roy and Erlenkotter (1982), that guarantees the construction of
admissible primal and dual solutions, and tries to force the complementary between them. The
3
calculation of a lower and upper bound to the objective function optimum value is always
guaranteed. It is also described a tree search algorithm which uses the heuristic developed, and
that enables the calculation of the optimum solution.
1. Introdução O problema que consiste na escolha das localizações onde instalar serviços (tais como
armazéns, fábricas, hospitais, etc), de tal forma que seja satisfeita a procura de um determinado
produto por parte de um conjunto de clientes, minimizando os custos totais envolvidos chama-
se problema de localização simples (PLS). Geralmente são considerados custos fixos de
abertura dos serviços e custos variáveis de afectação de clientes a serviços. Como não se
consideram capacidades associadas aos serviços abertos, cada cliente será servido por um e um
só serviço (aquele a que corresponde o menor custo de afectação entre todos os serviços
abertos) (Cornuejols et al, 1990).
O problema de localização dinâmica é uma generalização do PLS, em que se considera que
a localização dos serviços pode ser feita ao longo de um horizonte temporal determinado. Em
cada período temporal tem de se garantir a afectação de cada cliente a um serviço aberto.
Duas características principais obrigam à utilização de um modelo dinâmico (Erlenkotter,
1981): alterações significativas ao longo do tempo nos custos de afectação de clientes a
serviços; custos significativos de fecho e abertura em novas localizações de serviços. Se a
primeira característica estiver ausente, significa que se poderia utilizar um problema estático.
Se a segunda não existir, significa que se poderão considerar vários problemas estáticos e não
relacionados entre si.
Um dos primeiros artigos a referir um problema de localização dinâmica deve-se a
Wesolowsky (1973). Neste artigo, o autor generaliza o problema de Weber, considerando a
existência de vários períodos temporais. Wesolowsky e Truscott(1975) descrevem um
problema de localização discreto, em que se fixa, para cada período temporal, o número de
serviços abertos. Em cada período temporal um serviço pode ser aberto ou removido de uma
determinada localização. Apresentam um método de resolução em que utilizam programação
dinâmica. Fong e Srinivasan (1981a,1981b) analisam o problema em que se pretende criar um
plano temporal de expansão de serviços para uma determinada empresa (e que consiste na
determinação da localização, tamanho e timing de construção de novos serviços). Van Roy e
Erlenkotter (1982) descrevem o problema de localização dinâmica simples sem capacidades,
em que se considera a hipótese de se abrirem novos serviços no início de cada período temporal
4
ou se fecharem serviços já existentes no início do primeiro período temporal. Laporte e Dejax
(1989) descrevem um problema dinâmico em que consideram simultaneamente a localização
de serviços e o problema de rotas óptimas que lhe está associado. Shulman (1981) descreve um
problema de localização dinâmica em que os serviços a localizar têm capacidade finita.
Considera-se um número limitado de capacidade possíveis, e é possível localizar mais do que
um serviço na mesma localidade em diferentes períodos temporais (aumentando-se assim a
capacidade numa determinada localidade). Galvão e Santibãnez-Gonzalez (1992) consideram a
generalização do problema da p-mediana a vários períodos temporais (os clientes deverão ser
afectos a um conjunto de K serviços no período k, tendo como objectivo a minimização de
custos de instalação e de transporte). Melachrinoudis et al (1995) propõem um modelo
dinâmico, multiobjectivo de localização de aterros sanitários com capacidades. Hinojosa et al
(2000) lidam com um problema de localização dinâmica, considerando a procura de mais do
que um produto por parte dos clientes, e o transporte dos vários produtos desde as localizações
onde são produzidos até armazéns e destes até aos clientes. Antunes e Peeters (2001)
apresentam um problema de localização dinâmica baseado num problema real, cujas decisões
se prendem com a abertura de novos serviços e o fecho, a redução ou expansão de serviços já
existentes.
Na maior parte dos problemas de localização dinâmica definidos na literatura, que têm em
conta simultaneamente a hipótese de se abrirem e fecharem serviços, considera-se a
possibilidade de abertura de novos serviços num período temporal t, mantendo-se estes
serviços abertos até ao fim do horizonte temporal considerado, e a possibilidade de fecho de
serviços que já se encontravam abertos em t =1, e que se manterão fechados até ao fim do
horizonte temporal. Uma excepção é o artigo de Wesolowsky e Truscott(1975), mas neste
artigo os custos fixos de abertura considerados não têm em conta se numa dada localização já
esteve ou não em funcionamento anteriormente um serviço. Além disso, não são considerados
custos fixos de funcionamento dos serviços durante os períodos temporais em que se encontram
abertos, nem custos de encerramento de serviços.
O problema que iremos formular considera a possibilidade de abertura, fecho e reabertura
de serviços. A distinção entre a abertura de um serviço e a sua reabertura numa mesma
localidade permite que se distingam os custos fixos respectivos. Existem diversas situações em
que a reabertura de um determinado serviço numa localidade tem associado um custo fixo
diferente do custo fixo de abertura (por exemplo, se já se tiverem adquirido anteriormente as
instalações, se já tiverem sido feitos anteriormente estudos de impacto ambiental no caso de
instalações de serviços obnóxios). O modelo proposto permite ainda a consideração de custos
5
de funcionamento e de encerramento de serviços (que na maior parte das situações não devem
ser ignorados). É também possível considerar a situação da existência de serviços abertos no
início do horizonte temporal.
Como o modelo descrito é uma generalização do PLS, é imediato concluir que se trata de
um problema NP-difícil (Krarup e Pruzan, 1983). Foi desenvolvida uma heurística para a
resolução deste problema, que constrói soluções duais e primais admissíveis tentando forçar a
complementaridade entre elas. Mesmo nas situações em que a heurística não consegue
encontrar a solução óptima, consegue sempre encontrar uma solução primal admissível e
fornecer um limite inferior para o valor da função objectivo primal (permitindo aferir a
qualidade da solução primal encontrada).
Na secção seguinte descreve-se um modelo matemático que formula o problema descrito.
Na secção 3 formula-se o problema dual linear do problema primal apresentado. Na secção 4
descreve-se a heurística primal-dual desenvolvida. Na secção 5 descreve-se um possível
mecanismo de pesquisa em árvore que poderá ser utilizado sempre que a heurística não
conseguir encontrar a solução óptima. Finalmente, na secção 6 apontam-se algumas
possibilidades de desenvolvimento de trabalho futuro.
2. Formulação do problema e descrição do modelo Considere-se:
J = {1,...,n} conjunto de índices correspondentes às localizações dos clientes;
I = {1,...,m} conjunto de índices correspondentes às possíveis localizações dos serviços;
T = número de períodos temporais a considerar;
cijt = custo de afectar o cliente j ao serviço i no período t;
FAitξ = custo fixo de abrir um serviço em i no início do período t, mantê-lo aberto até ao fim do
período ξ e encerrá-lo nessa altura;
FRitξ = custo fixo de reabrir um serviço em i no início do período t, mantê-lo aberto até ao fim
do período ξ e encerrá-lo nessa altura;
=
contrário caso em 0
período do fim ao até aberto mantém se e período do iníciono aberto é serviço o se 1
ξξti
ait
1,contrário caso em 0
período do fim ao até aberto mantém se e período do iníciono reabertoé serviço o se 1
>
= t
tirit
ξξ
6
=contrário caso em 0
período no serviço ao afectoestá cliente o se 1 tijx t
ij
O problema de localização dinâmica de serviços considerando a possibilidade de abertura ,
fecho e reabertura de serviços ao longo do horizonte temporal considerado pode ser formulado
como PLDAFR:
PLDAFR:
ξ
ξ
ξξ
ξ
ξit
t i
T
titit
t i
T
tit
tij
t i j
tij rFRaFAxcMin ∑∑ ∑∑∑ ∑∑∑∑
==++ ( 1 )
sujeito a:
1=∑i
tijx , ∀ j,t ( 2 )
( ) 01
≥−+∑ ∑= =
ttij
T
tii xra
τ ξ
ξτ
ξτ , ∀ i,j,t ( 3 )
01
1
1≥− ∑∑ ∑
=
−
=
−
=
T
tit
t t
i raξ
ξ
τ τξ
ξτ , ∀ i,t ( 4 )
∑ ∑= =
≤T
t
T
tita
11
ξ
ξ , ∀ i ( 5 )
( ) 11
≤+∑ ∑= =
t T
ii raτ τξ
ξτ
ξτ , ∀ i,t ( 6 )
{ }{ } ttir
ttjixa
it
tijit
≥>∀∈
≥∀∈
ξ
ξξ
ξ
,1,,1,0,,,,1,0,
( 7 )
O conjunto de restrições (2) garante que, em cada período temporal, cada cliente é servido
por exactamente um serviço; o conjunto de restrições (3) garante que, em cada período
temporal, um cliente só pode ser servido por um serviço que esteja aberto no período
correspondente; o conjunto de restrições (4) garante que um serviço só poderá ser reaberto no
início do período t se já tiver sido aberto anteriormente e se encontre fechado; o conjunto de
restrições (5) garante que um serviço só pode ser aberto na localidade i uma vez durante todo o
7
período temporal; o conjunto de restrições (6) garante que, em cada período temporal, só pode
estar em funcionamento um único serviço na localidade i.
Se existir um conjunto Ic ⊂ I onde existem serviços abertos em t =1, esta informação
poderá ser incluída no modelo apresentado. Bastará para tal considerar ri1ξ=0,∀ i ∈ Ic, ξ ≥1, e
considerar que o somatório de todas as variáveis ai1ξ,∀ i ∈ Ic, ξ ≥1 tenha de ser igual a um,
adequando os custos fixos de abertura no período t = 1 à situação de já existirem serviços
abertos (o que significa que FAi1ξ , para i ∈ Ic, representará os custos de manter o serviço aberto
desde t =1 até ao fim do período ξ e de encerrá-lo, não sendo necessário incluir os custos de
abertura).
As restrições (5) e (6) só precisam de ser consideradas explicitamente quando se considera
a possibilidade dos custos fixos poderem tomar valores não positivos. O conjunto de restrições
(6) poderia ser substituído por:
11
≤∑ ∑= =
t T
irτ τξ
ξτ , ∀ i,t ( 8 )
Como um serviço só poderá ser aberto uma vez, e só pode ser reaberto se já não estiver em
funcionamento após essa abertura, (8) tem exactamente a mesma interpretação de (6). No
entanto consideraram-se as restrições (6), pois estas facilitam o desenvolvimento da heurística
primal-dual.
3. Formulação do problema dual
3.1. Problema Dual
Na construção do problema dual de PLDAFR consideraram-se as restrições (5’) e (6’) em
vez de (5) e (6):
∑ ∑= =
−≥−T
t
T
tita
11
ξ
ξ , ∀ i,t ( 5’ )
( ) 11
−≥+−∑ ∑= =
t T
ii raτ τξ
ξτ
ξτ , ∀ i,t ( 6’ )
Associando às restrições (2) as variáveis duais vjt, às restrições (3) as variáveis duais wij
t, às
restrições (4) as variáveis duais uit, às restrições (5’) as variáveis duais ρi, e às restrições (6’) as
variáveis duais πit , o problema dual virá:
8
D-PLDAFR:
∑ ∑∑∑∑ −−t t i
ti
ii
j
tjvMax πρ ( 9 )
sujeito a: tij
tij
tj cwv ≤− , tji ,,∀ ( 10 )
ξξ
τ
τ
ξτ
τξ
τ
τ πρ itt
iiT
ij t
ij FAuw ≤−−+ ∑∑∑ ∑=+== 1
, Ttti ,,,, L=∀ ξ ( 11 )
ξξ
τ
τξ
τ
τ π itt
iti
j tij FRuw ≤−− ∑∑ ∑
==, Ttti ,,,, L=∀ ξ ( 12 )
0,,, ≥tii
ti
tij uw πρ , tji ,,∀
Considerando { }t
ijtj
tij cvmaxw −= ,0 , constrói-se o dual condensado:
DC-PLDAFR:
∑ ∑∑∑∑ −−t t i
ti
ii
j
tjvMax πρ
sujeito a:
{ } ∑∑∑ ∑=+==
++−≤−ξ
τ
τ
ξτ
τξξ
τ
ττ πρt
iiT
iitj t
ijj uFAcvmax1
,0 , Ttti ,,,, L=∀ ξ ( 13 )
{ } ∑∑ ∑==
++≤−ξ
τ
τξξ
τ
ττ πt
itiit
j tijj uFRcvmax ,0 , Ttti ,,,, L=∀ ξ ( 14 )
0,, ≥tii
tiu πρ , tji ,,∀
Considerar as restrições primais (6) em vez de (8) faz com que a parcela ∑=
ξ
τ
τπt
i apareça
simultaneamente em (13) e em (14), o que vai facilitar a construção de soluções duais
admissíveis.
9
3.2. Condições de Complementaridade
Tendo formulado os problemas primal e dual, podem agora enunciar-se as condições de
complementaridade que terão de ser satisfeitas pelas soluções primal e dual óptimas, na
ausência de gap de dualidade.
Considere-se:
{ }∑ ∑∑∑==+=
−−++−=j t
ijjt
iiT
iitit cvmaxuFASAξ
τ
ττξ
τ
τ
ξτ
τξξ πρ ,01
, Ttti ,,,, L=∀ ξ ( 15 )
{ }∑ ∑ ∑= =
−−++=ξ
τ
ξ
τ
τττξξ πt j t
ijjitiitit cvmaxuFRSR ,0 , Ttti ,,,, L=∀ ξ ( 16 )
{ }ξξξititit SRSAminS ,= , Ttti ,,,, L=∀ ξ ( 17 )
As condições de complementaridade podem ser enunciadas como:
( ) ,01
=
−+∑ ∑
= =
tij
ttij
T
tii wxra
τ ξ
ξτ
ξτ tji ,,∀ ( 18 )
,01
1
1=
− ∑∑ ∑
=
−
=
−
=
ti
T
tit
t t
i uraξ
ξ
τ τξ
ξτ ti,∀ ( 19 )
,011
=
−∑ ∑
= =i
T
t
T
tita ρ
ξ
ξ i∀ ( 20 )
( ) ,011
=
−+∑ ∑
= =
ti
t T
ii ra πτ τξ
ξτ
ξτ ti,∀ ( 21 )
,0=⋅ ξξitit aSA Ttti ,...,,, =∀ ξ ( 22 )
,0=⋅ ξξitit rSR Ttti ,...,,, =∀ ξ ( 23 )
10
4. Heurística Primal-Dual
4.1. Descrição
A heurística primal-dual que foi desenvolvida para resolver o problema PLDAFR constrói
soluções duais e primais admissíveis, tentando forçar a satisfação de todas as condições de
complementaridade (18)-(23). Se se conseguir calcular uma solução primal e uma solução dual
admissíveis e complementares, então conseguiu-se descobrir a solução óptima do problema.
Caso contrário a melhor solução dual encontrada fornece um limite inferior ao valor óptimo da
função objectivo primal, permitindo aferir a qualidade da melhor solução primal calculada pela
heurística.
O funcionamento da heurística pode ser descrito através do seguinte algoritmo:
1. Inicialização de todas as variáveis duais; 2. Execução do Procedimento Dual Ascendente para as variáveis vj
t; 3. Execução do Procedimento Primal; 4. Execução do Procedimento de Ajuste Dual para as variáveis ρi. Se a solução dual for
alterada ir para 3. 5. Enquanto a função objectivo do problema dual melhorar, executar o Procedimento de
Ajuste Dual-Primal para as variáveis vjt;
6. Execução do Procedimento de Ajuste Dual para as variáveis ρi. Se a solução dual for alterada ir para 3.
7. Execução do Procedimento Dual Ascendente para as variáveis uit; Se a solução dual for
alterada ir para 3. 8. Execução do Procedimento Dual Descendente para as variáveis ui
t; Se a solução dual for alterada ir para 3.
9. Execução do Procedimento de Ajuste Dual para as variáveis πit . Se a solução dual for
alterada ir para 3. Senão Parar.
Se em algum momento o melhor valor da função objectivo dual igualar o melhor valor da
função objectivo do primal, o algoritmo será terminado (significa que foi encontrada a solução
primal óptima).
A inicialização das variáveis duais poderá ser feita da seguinte forma:
Inicialização das variáveis duais
1. { } ititiutjcminv iti
ti
tij
itj ∀=∀=∀=∀= ,0 ;,,0 ;,,0 ;,, ρπ
2. Se tiFRminmaxuFR itt
ttiit ,,,0,0 ∀
−=<∃
≥
ξ
ξ
ξ
11
3. Se tiuFAminmaxFAT
iitt
tiit ,,,0,0
1∀
−−=<∃ ∑
+=≥ ξτ
τξ
ξ
ξ ρ
Nas secções seguintes descrevem-se todos os procedimentos referidos. Através da
aplicação da heurística a vários problemas gerados aleatoriamente foi possível verificar que
todos os procedimentos indicados contribuem para a melhoria do valor da função objectivo
dual ou primal.
4.2. Procedimento dual ascendente para as variáveis duais vjt
Neste procedimento considera-se um conjunto J+ ⊂ J e tenta-se aumentar o valor das
variáveis duais +∈ Jjvtj , , considerando uma solução inicial { }t
jv e todos os custos tijc
reindexados como descrito em Van Roy e Erlenkotter, 1982. Quando este procedimento é
executado no ponto 2 da heurística primal-dual, o conjunto J+ é exactamente igual ao conjunto
J. Sempre que este procedimento é executado dentro de outros procedimentos (como acontece,
por exemplo, com o procedimento de ajuste dual para as variáveis vjt ), o conjunto J+ é definido
dentro desses procedimentos.
O valor das variáveis duais vjt é, sempre que possível, aumentado para o menor custo cij
t
maior do que vjt. Sempre que tal não seja possível devido ao valor de uma slack Siτ
ξ, aumenta-
se para o maior valor possível tal que a solução dual continue admissível. Sempre que o valor
de uma variável vjt aumenta é necessário actualizar o valor de todas as slacks SAiτ
ξ e SRiτξ, tais
que τ ≤ t ≤ ξ, diminuindo o seu valor da mesma quantidade de que vjt foi aumentada (no caso de
vjt ser maior ou igual do que cij
t). Todas as slacks têm de apresentar valores maiores ou iguais a
zero. O procedimento termina quando já não for possível aumentar o valor de nenhuma
variável vjt .
Procedimento dual ascendente para vjt
1. Considere-se uma qualquer solução admissível { }tjv tal que
( ) ttiStjcv ittj
tj ≥∀≥∀≥ ξξ ,,,0,,,1 . Para cada ( )tj, defina-se ( ) { }tk
jtj cvkmintjk ≤= :, . Se
( )tjtkj
tj cv ,= então ( ) ( ) 1,, +← tjktjk .
2. ( ) ( ) 0;1;,, 1 =←← δqtjtj .
3. Se ( ) +∉ Jtj, , então ir para 7.
12
4. { }ξτξτ ≤≤≥=∆ tcvSmin t
ijtjii
tj e :
5. Se ( ) tj
tjtkj
tj vc −>∆ , então ( ) ( ) ( ) 1,,;1;, +←=−=∆ tjktjkvc t
jtjtk
jtj δ
6. Para cada serviço i, se 0≥−+ tij
tj cv , então ξτξ
τξτ ≤≤∆−= tSS t
jii , . tj
tj
tj vv ∆+= .
7. Se ( ) ( ) ;1;,,,# 1 +←←≠ ++ qqtjtjJq q Ir para 3.
8. Se 1=δ ir para 2. STOP.
4.3. Construção de Soluções Primais Admissíveis
A heurística primal-dual pretende construir soluções admissíveis para o problema
PLDAFR, a partir de soluções duais admissíveis, tentando forçar a satisfação de todas as
condições de complementaridade. Definam-se os seguintes conjuntos:
I* = { (i,t,τ):Sitτ = 0}
I*t = {i : ( i,τ,ξ ) ∈ I* e τ ≤ t ≤ ξ}
It+ = {i : o serviço i está aberto no período t}
IA+ = { ( i,τ,ξ ) : aiτ
ξ = 1}
IR+ = { ( i,τ,ξ ) : riτ
ξ = 1}
O conjunto I* corresponde a todos os trios (i,t,τ) tais que SAiτξ e/ou SRiτ
ξ são iguais a zero.
É a partir deste conjunto que se vão escolher as variáveis que se irão colocar nos conjuntos IA+
e IR+, constituindo estes conjuntos a solução primal construída. I*
t indica o conjunto de
serviços que poderão estar abertos durante o período t, e I+t o conjunto de serviços que
efectivamente estão abertos no período t. Estes conjuntos poderão não ser iguais, pois tenta
sempre abrir-se o menor número de serviços possíveis tal que se garanta que todos os clientes
são servidos por um serviço aberto.
No procedimento primal começam por se incluir em I+t aqueles serviços que pertencem a
I*t e que são considerados essenciais no período t. Um serviço i é considerado essencial para o
período t se existe pelo menos um cliente j tal que o valor da variável dual vjt é maior ou igual
do que cijt apenas para esse serviço i∈ I*
t . Cada cliente j nestas condições será afecto, no
período t, ao serviço i que lhe é essencial. Para todos os outros clientes, verifica-se se poderão
ser afectos a um serviço pertencente a I+t. No caso de tal não ser possível coloca-se em I+
t o
serviço i ∈I*t a que corresponde o menor custo de afectação cij
t. Para tentar evitar que se abram
mais serviços do que os necessários, voltam a repetir-se estes passos, mas agora considerando o
conjunto I*t igual a I+
t , ou seja, para os serviços que foram considerados abertos no período t,
13
vai verificar-se quais destes são essenciais. Os serviços essenciais são os primeiros a serem
considerados abertos. Os restantes serviços só serão abertos se for necessário.
Procedimento Primal
1. IA+ = IR
+ = 0. It+ = 0,∀t. Construir os conjuntos I* e It
*. Vezes =0;
2. Para t =1 até T incluir em It+ todos os serviços i ∈ It
* tais que
iicvcvj tji
tj
tij
tj ≠∀<≥∃ ', e : ' .
3. Para cada cliente j tal que ++ ∈∀< ttij
tj Iicv , , incluir em It
+ o serviço i tal que
tjit
jictjv
tij cminc '
'≥= . Vezes = vezes+1. Se vezes = 1 então IA
+ = IR+ = 0. It
* = It+ e It
+ = 0,∀t , ir
para 2. Senão ir para 4.
4. Construir os conjuntos IA+ e IR
+ . Actualizar It+. Para t =1 até T, afectar cada cliente j ao
serviço i ∈ It+ com menor cij
t.
5. Verificar satisfação das condições de complementaridade (19)-(21).
Neste procedimento os passos 4 e 5 requerem especial atenção. De facto, a construção dos
conjuntos IA+ e IR
+ é bastante mais complexa do que a construção do conjunto I+ no algoritmo
Dynaloc (Van Roy e Erlekotter, 1982), porque poderão ter de se considerar períodos de
abertura e reabertura para um mesmo serviço que garantam a admissibilidade da solução primal
construída. Sempre que, para um determinado serviço i e período t se tem i ∈ It+ com Siτ
ξ = 0, τ
≤ t ≤ ξ para mais do que um par (τ,ξ), a escolha de qual variável inserir nos conjuntos IA+ ou IR
+
pode tornar-se um problema combinatório por si só.
Os conjuntos IA+ e IR
+ são construídos tendo em conta, para cada serviço i, quais os
períodos temporais em que tem de estar aberto. Considerando:
t1 = min{τ : i∈Iτ+ } e t2 = max {τ : i∈Iτ
+ }
vai verificar-se se (i, t1, t2) ∈ I*. Se (i, t1, t2) ∈ I*, inclui-se a variável 21
tita em IA
+. Caso contrário
serão executados dois procedimentos (figura 1 e 2) que incluem em IA+ e IR
+ variáveis que
garantem que o serviço i estará aberto em todos os períodos t tais que i ∈ It+. Estes dois
procedimentos são muito semelhantes, residindo a diferença entre eles no facto de num se
começar a construir os conjuntos IA+ e IR
+ no que diz respeito ao serviço i desde t =1 até t =T, e
no outro se fazer o inverso. Desta forma executam-se ambos os procedimentos, escolhendo-se
depois a melhor solução entre ambas.
14
Os procedimentos de construção da solução primal tentam, para cada serviço i ∈ It+ ,
incluir em IA+ ou IR
+ o trio ( i,τ,ξ ) ∈ I* e τ ≤ t ≤ ξ, que abranja o maior número de períodos
temporais possível. O procedimento 1 começa a construir a solução considerando t = t1, e vai
tentar inserir em IA+ o trio ( i,τ,ξ ), considerando τ = 1 e ξ = T. Se tal não for possível porque (
i,τ,ξ )∉ I*, então vai diminuir-se ξ em uma unidade, até que ( i,τ,ξ )∈ I* ou então ξ < t1. Se (
i,τ,ξ )∈ I*, então insere-se (i,τ,ξ) em IA+, avança-se τ para ξ+1 (porque não podem existir
sobreposições nos períodos temporais devido às restrições (6) ) e avança-se t para o próximo
período temporal tal que i ∈ It+, repetindo-se o processo (todos os outros trios ( i,τ,ξ )∈ I* que
forem considerados serão inseridos em IR+). Se ξ < t1, significa que não foi possível encontrar
nenhum trio ( i,τ,ξ )∈ I* que incluísse o período t, pelo que se incrementa o valor de τ em uma
unidade até que seja encontrado ( i,τ,ξ )∈ I* ou então τ > t1.
No primeiro caso, procede-se como já descrito. No segundo caso significa que não vai ser
possível construir a solução primal recorrendo apenas a ( i,τ,ξ )∈ I*. Vai ter de se inserir em
IR+ uma variável tal que Siτ
ξ ≠ 0, o que provoca violação das condições de complementaridade.
O procedimento 2 constrói a solução primal de forma semelhante, mas começando por
considerar t = t2, incrementando primeiro o valor de τ e diminuindo depois o valor ξ sempre
que não se encontra ( i,τ,ξ )∈ I*.
Em ambos os procedimentos tentam experimentar-se, para cada período t, todas as
possibilidades (i,τ,ξ ) que incluam este período, tendo em conta as variáveis já incluídas em IA+
e IR+ e respeitando as restrições (6).
A utilização destes procedimentos para cada serviço i garante a construção de uma solução
admissível para PLDAFR, mas pode originar violações das condições de complementaridade
(22) e (23). Optou-se por minimizar o número de violações, garantindo-se que, para cada
serviço i, haverá no máximo uma violação de (22) ou (23).
Note-se que a construção dos conjuntos IA+ e IR
+ não tem em conta outras variáveis duais
para além das variáveis vjt . Isto faz com que a solução primal construída possa violar algumas
condições de complementaridade, nomeadamente (19), (20) e (21). Por este motivo construiu-
se um outro procedimento (figura 3) que será executado no passo 5 do procedimento primal.
Aqui vai verificar-se se existe ou não violação de alguma das condições de complementaridade
indicadas. Em caso afirmativo, tenta alterar-se a solução primal, forçando a satisfação das
condições de complementaridade que estão a ser violadas.
15
Procedimento 1
Início = 1;Tempo = t1; stop = false; abertura = true; ENQUANTO tempo ≤ t2
SE i ∈ I+tempo ENTÃO
τ = inicio; ξ = T; t = tempo; ENQUANTO τ ≤ t e não stop ENQUANTO ξ ≥ t e não stop SE ∃ (i , τ ,ξ ) ∈ I* ENTÃO SE abertura ENTÃO (i , τ ,ξ )→IA
+ abertura = false FIMSE SENÃO (i , τ ,ξ )→IR
+ FIMSENÃO
Tempo = inicio = ξ +1 Stop = true FIMSE SENÃO ξ = ξ -1 FIMSENÃO FIMENQUANTO τ = τ +1; ξ = T
FIMENQUANTO SE não stop ENTÃO SE abertura ENTÃO
(i , inicio,t2 )→IA+
abertura = false FIMSE
SENÃO (i , inicio,t2 )→IR+ FIMSENÃO
Tempo = t2 + 1 FIMSE
FIMSE Tempo = tempo +1
FIMENQUANTO
Figura 1
As condições de complementaridade (19) a (21) obrigam a que:
§ Se ρi ≠ 0, então tem de se abrir um serviço em i durante o horizonte temporal
considerado.
§ Se πit ≠ 0, então tem de estar aberto um serviço na localidade i no período t.
§ Se uit ≠ 0, então, se tiver sido aberto um serviço na localidade i antes de t, tal que
esteja fechado no período t, então esse serviço terá de ser reaberto em t.
No caso de se ter simultaneamente ρi , πit e ui
t diferentes de zero, se as condições de
complementaridade relativas a uit estiverem satisfeitas, o mesmo acontecerá com as condições
de complementaridade relativas às restantes variáveis. Da mesma forma, se ρi e πit forem
16
simultaneamente diferentes de zero e as condições de complementaridade (21) forem
satisfeitas, então pode garantir-se que as condições (20) também são satisfeitas.
Procedimento 2
fim = T;Tempo = t2 ; stop = false; ENQUANTO tempo ≥ t1
SE i ∈ I+tempo ENTÃO
τ = 1; ξ = fim; t = tempo; ENQUANTO ξ ≥ t e não stop ENQUANTO τ ≤ t e não stop
SE ∃ (i , τ ,ξ ) ∈ I* ENTÃO SE τ ≤ t1 ENTÃO (i , τ ,ξ )→IA
+ FIMSE SENÃO (i , τ ,ξ )→IR
+ FIMSENÃO
Tempo = fim =τ -1 Stop = true FIMSE
SENÃO τ = τ +1 FIMSENÃO FIMENQUANTO ξ = ξ -1; τ =1
FIMENQUANTO SE não stop ENTÃO
(i , t1, fim )→IA+
Tempo = t1 - 1 FIMSE
FIMSE Tempo = tempo -1
FIMENQUANTO
Figura 2
O procedimento de verificação das condições de complementaridade não garante que
deixe de haver violações, pois para tal poderia ter de se construir soluções primais não
admissíveis (poderiam ser violadas as restrições (4) e (6)).
O que o procedimento de verificação das condições de complementaridade faz é começar
por verificar se existe violação das condições (19). Se tal acontecer, tenta reabrir o serviço i no
período t, mas respeitando as restrições (6) (verificando se existe alguma variável riτξ em IR
+ o
que, em caso afirmativo, faz com que só se possam considerar variáveis de reabertura ritζ, com
ζ < τ). Algo de semelhante acontece quando existe violação das condições de
complementaridade (21). Tenta (re)abrir-se o serviço i de modo a que esteja em funcionamento
no período t, mas considerando apenas intervalos de tempo que não incluam períodos já
abrangidos por variáveis que pertençam a IR+ ou IA
+. Quanto às condições de
complementaridade (20), se estas não forem satisfeitas, significa que não existe nenhum serviço
17
aberto em i em nenhum dos períodos temporais considerados. Neste caso pode escolher-se uma
qualquer variável cuja slack seja igual a zero e colocá-la em IA+ (não existe o perigo de
violação das restrições (6) ).
Procedimento de verificação das condições de complementaridade
i = 1 ENQUANTO i ≤ #I ρsatisfeito = false; πsatisfeito =false; t =1; ENQUANTO t ≤ T SE ui
t ≠0 e ∃ (i, τ ,ξ) ∈ IA+, ξ < t ENTÃO
SE ∃/ (i, t ,ξ) ∈ IR+ ENTÃO
tmax = T tmax = min {tmax , min {τ : (i, τ ,γ) ∈ IR
+ e τ > t } } SE ∃ (i, t ,ξ) ∈ I*, ξ < tmax ENTÃO
(i, t ,ξ)→ IR+
ρsatisfeito = true ; πsatisfeito =true FIMSE FIMSE SENÃO ρsatisfeito = true; πsatisfeito =true FIMSENÃO FIMSE SE πi
t = 0 e πsatisfeito = false ENTÃO SE i ∉ It
+ ENTÃO SE ∃ ( i ,τ , ξ ) ∈ IA
+ ENTÃO tmin = max {ξ : (i, τ , ξ ) ∈ IA
+ ∪ IR+, ξ < t }
tmax = min { τ: (i, τ , ξ ) ∈ IA+ ∪ IR
+, τ > t } FIMSE SENÃO tmin = 1 ; tmax = T FIMSENÃO SE ∃ ( i ,τ , ξ ) ∈ I* : τ ≥ tmin e ξ ≤ tmax ENTÃO ( i ,τ , ξ ) → IA
+ ou IR+
ρsatisfeito = false
FIMSE FIMSE SENÃO ρsatisfeito = true FIMSENÃO FIMSE FIMENQUANTO SE ρsatisfeito = false e ρi ≠ 0 ENTÃO Escolher ( i ,τ , ξ ) ∈ I*
( i ,τ , ξ ) → IA+
FIMSE FIMENQUANTO
Figura 3
No fim da execução do procedimento primal encontra-se uma solução primal admissível
para PLDAFR. Esta solução poderá violar as condições de complementaridade (22) ou (23),
18
pois poder-se-á construir uma solução em que ( i ,τ , ξ )∈ IA+ com SAiτ
ξ ≠0 e SRiτξ =0, ou então
(i,τ , ξ )∈ IR+ com SRiτ
ξ ≠0 e SAiτξ =0. Os procedimentos que a seguir se descrevem irão lidar
com estas situações.
4.4. Procedimento de ajuste dual para as variáveis ρi
Se for possível diminuir o valor de uma variável ρi que seja diferente de zero, mantendo-se
a admissibilidade da solução dual, estar-se-á a melhorar o valor da função objectivo de DC-
PLDAFR. O valor de ρi poderá ser diminuído sempre que SAiτξ≠0,∀1 ≤ τ ≤ ξ. Este
procedimento começa por verificar se isto acontece. Em caso afirmativo, diminui o valor da
variável dual, actualizando o valor de todas as slacks SAiτξ. Caso contrário, tenta aumentar-se o
valor da variável dual.
Se se aumentar o valor de uma variável dual ρi, vão aumentar-se todas as slacks SAiτξ. O
aumento destas slacks poderá fazer com que seja possível aumentar o valor de variáveis vjt que
estejam impedidas de crescer por alguma slack SAiτξ. No entanto as variáveis duais ρi entram na
função objectivo do problema dual DC-PLDAFR com o coeficiente –1, pelo que só deverão ser
aumentadas se a correspondente diminuição do valor da função objectivo for compensada pelo
aumento das variáveis vjt. Note-se ainda que só valerá a pena aumentar SAiτ
ξ se a slack SRiτξ for
maior do que zero. Caso contrário não se alteraria o valor de Siτξ. Esta situação ocorre sempre
que existe uma violação das condições de complementaridade descritas na secção anterior: (i, τ
, ξ )∈ IR+ com SRiτ
ξ ≠0 e SAiτξ =0. Aumentar o valor da variável dual ρi é uma maneira de
tentar evitar estas violações das condições de complementaridade. Sempre que se aumenta o
valor de ρi contrói-se o conjunto J+que irá corresponder a todas as variáveis vjt cujo valor
poderá aumentar. É então executado o procedimento dual ascendente para as variáveis vjt . No
caso de o aumento de ρi não ter sido totalmente aproveitado pelo aumento das variáveis vjt ,
diminui-se ρi, garantindo-se que a função objectivo dual nunca será piorada.
Considere-se ( ) ( ){ }tij
tj
tj cvIitiI ≥∈≤≤∃= e ,,| com ,: ** ξτξτξτ .
Procedimento de ajuste dual para as variáveis ρi
1. i ← 1;
2. { }ξτ
ξτρ ii SAmin
≤←∆ ;Se Δρi = 0 então ir para 3. Senão ir para 7.
19
3. ( ){ }0 e 0 com ,,: ≠=∈∃=∆ + ξτ
ξτ
ξτ ξτρ iiRii SRSAIiSRmax .
4. Se 0≠∆ iρ então iii ρρρ ∆+← ; τξτρξτ
ξτ ≥∀∆+← ,,iii SASA . Senão ir para 8.
5. ( ) { }{ }tiItjJ tj ∀==+ ,:, * . Executar o Procedimento Dual Ascendente para as variáveis t
jv .
JJ =+ . Executar o Procedimento Dual Ascendente para as variáveis tjv
6. ξτ
τξτ
ρ ii SAmin
≥
=∆ .
7. { }iii min ρρρ ,∆=∆ .Se 0≠∆ iρ então τξτρξτ
ξτ ≥∀∆−← ,,iii SASA ; iii ρρρ ∆−←
8. Se Ii #= então parar. Senão ;1+← ii ir para 2.
Apresenta-se em seguida a prova de que o algoritmo apresentado nunca poderá piorar o
valor da função objectivo de DC-PLDAFR.
Hipótese: O procedimento de ajuste dual para as variáveis ρi não piora o valor da função
objectivo dual de DC-PLDAFR.
Prova:
Ao diminuir o valor da variável ρi, mantendo-se a solução dual admissível, está a
melhorar-se o valor da função objectivo dual, pois a variável ρi contribui com o coeficiente –1
para a função objectivo dual.
Ao aumentar o valor de ρi , executa-se o procedimento de ajuste dual para as variáveis vjt .
Seja ∆vjt a variação ocorrida no valor da variável vj
t. Seja ∆1ρi o aumento relativo ao ponto 4,
∆2ρi a diminuição relativa ao ponto 7 e ∆ρi = ∆1ρi - ∆2ρi . Sejam SA’iτξ as slacks que se obtêm
após execução do procedimento de ajuste dual. Note-se que ∆1ρi ≥ ∆2ρi . Para verificar esta
desigualdade basta pensar na slack SA’iτξ que era igual a zero e que foi aumentada em ∆1ρi.
Durante a execução do procedimento dual ascendente para as variáveis vjt, esta slack só poderá
diminuir, pelo que ∆2ρi ≤ SA’iτξ ≤ ∆1ρi . Após a execução do procedimento, duas situações
podem ocorrer:
20
1. Se existir alguma slack SA’iτξ que tenha retomado o seu valor inicial, isto significa que este
aumento foi totalmente aproveitado pelo aumento das variáveis duais vjt, e por isso garante-
se que ∑∑ ∆≥∆j
it
tjv ρ1 (não se piora o valor da função objectivo). Com efeito:
∑ ∑=
∆−∆+=j t
tjiii vSASA
ξ
τ
ξτ
ξτ ρ' ,logo se SA’iτ
ξ =SAiτξ então 0=∆−∆ ∑ ∑
=j t
tji v
ξ
τρ .
2. Se todas as slacks SA’iτξ são maiores do que eram antes de se alterar o valor de ρi, então
significa que todas elas são maiores do que zero, pelo que se irá diminuir o valor de ρi .
Considere-se a slack SA’iτξ, com t
ijtj cv ≥ , que após a execução do ponto 6 do procedimento
de ajuste dual ficou: ∑ ∑=
∆−∆+=j t
tjiii vSASA
ξ
τ
ξτ
ξτ ρ1' .
Como SA’iτξ > SAiτ
ξ, isto significa que:
01 ≥∆−∆ ∑ ∑=j t
tji v
ξ
τρ , ou seja, ∑ ∑
=∆≥∆
j t
tji v
ξ
τρ1 .
Se o valor de ρi se mantivesse poderia haver uma deterioração no valor da função objectivo
dual. No entanto, o valor desta variável irá ser diminuído em ∆2ρi calculado como em 7.
Isto significa que pelo menos uma slack irá tomar o valor zero, o que significa que todo o
aumento de ρi foi compensado pelo aumento nas variáveis duais vjt:
0' 21 =∆−∆−∆+= ∑ ∑=j t
tjiiii vSASA
ξ
τ
ξτ
ξτ ρρ .
Como 0≥ξτiSA significa que:
021 ≤∆−∆−∆ ∑ ∑=j t
tjii v
ξ
τρρ , ou seja, ∑ ∑
=∆≤∆−∆
j t
tjii v
ξ
τρρ 21 .
Na pior das hipóteses, diminui-se a variável ρi exactamente do mesmo valor que tinha
aumentado antes, e a função objectivo não terá piorado nem melhorado.
4.5. Procedimento de Ajuste dual-primal para as variáveis vjt
O procedimento de ajuste dual-primal para as variáveis vjt tem como objectivo detectar
violações das condições de complementaridade (18), diminuindo o valor de algumas variáveis
vjt, e permitindo o aumento de outras variáveis vj
t. Desta forma pretende-se forçar a satisfação
21
das condições (18) e, simultaneamente, melhorar o valor da função objectivo dual. O
procedimento desenvolvido baseia-se no trabalho de Erlenkotter(1978) e Van Roy e Erlenkotter
(1982), com as obrigatórias alterações para o problema DC-PLDAFR.
Considere-se:
( ) ( ){ }tij
tj
tj cvIitiI ≥∈≤≤∃= e ,,| com ,: ** ξτξτξτ
{ }tij
tjt
tj cvIiiI >∈= ++ e :
( ) { } ( ){ }ξγττξγξγτ τ ≤≤<<≤≤∉==+ ttIiiIjJ jti ou ,,, e :, **
{ }tij
tj
tij
itj cvcc >=− :max
O conjunto +tjI indica, para cada cliente j, todos os serviços abertos no período t tais que a
variável vjt é maior do que o custo de afectação cij
t. Só existe violação das condições de
complementaridade (18) se existir pelo menos um par ( j , t ) tal que o cardinal de +tjI seja
maior do que um. Ao diminuir o valor de uma variável vjt tal que o cardinal de +t
jI é maior do
que um, significa que se vão aumentar pelo menos as slacks Siτξ,τ ≤ t ≤ ξ, para dois serviços
distintos. É isto que permite que o valor da função objectivo dual possa melhorar.
O conjunto +tiJ representa todas as variáveis vj
τ cujo valor poderá ser aumentado com o
aumento de uma slack Siτξ,τ ≤ t ≤ ξ. É a partir deste conjunto que se contrói J+, sendo depois
executado o procedimento dual ascendente para as variáveis vjt.
As variáveis vjt estão organizadas numa sequência de pares ( j, t ).
Procedimento de ajuste dual-primal para as variáveis vjt
1. Inicializar ( j , t ) ← ( j , t )1; q ←1; δ ← 0.
2. Se 1# ≤+tjI ir para 9.
3. Se 0/=
≥
+Utijct
jvi
tiJ então ir para 9.
4. Para cada ( ) tij
tj cvti >≤≤ e ,,, ξτξτ fazer −−+= t
jtjii cvSS ξ
τξτ ; −= t
jtj cv .
5. Utijct
jvi
tiJJ
≥
++ = . Executar o Procedimento Dual Ascendente para as variáveis tjv .
22
( )tjJJ ,∪= ++ .Executar o Procedimento Dual Ascendente para as variáveis tjv .
JJ =+ . Executar o Procedimento Dual Ascendente para as variáveis tjv .
6. Se vjt tiver sido alterado, então ir para 2.
7. Executar o procedimento primal.
8. Se tiver havido melhorias no valor da função objectivo primal ou dual então δ ← 0. Senão
δ←δ+1.
9. Se o valor actual da função objectivo primal for igual ao da função objectivo dual, ou δ
=δmax ou TJq ×≠# então parar; senão q ← q + 1; ( j , t ) ← ( j , t )q, ir para 2.
4.6. Procedimento dual ascendente para uit
Ao aumentar o valor de uma variável uit, aumentam-se as slacks SRit
ξ, ξ ≥ t, mas
diminuem-se as slacks SAiτξ, τ ≤ ξ < t. Se se conseguir aumentar slacks Siτ
ξ que estejam a
impedir o aumento de variáveis vjt, diminuindo slacks Siτ
ξ que não limitam o crescimento de
nenhuma variável vjt, será possível melhorar o valor da função objectivo de DC-PLDAFR.
Só interessará aumentar o valor de uma variável uit se existir SRit
ξ = 0 e SAitξ ≠ 0. Esta
situação ocorre, por exemplo, quando ( i, t, ξ )∈ IA+ com SAit
ξ ≠0 e SRitξ =0. Neste caso
interessa aumentar SRitξ no máximo no valor de SAit
ξ pois a partir daqui qualquer aumento em
SRitξ não se vai repercutir em Sit
ξ . Por outro lado, a variável uit poderá ser aumentada, no
máximo, no valor mínimo de SAiτξ,∀ τ ≤ ξ < t, para que se conserve a admissibilidade da
solução dual. Aumentar o valor da variável uit pode ajudar a combater a violação da restrição de
complementaridade (22).
O procedimento começa por verificar se é possível aumentar o valor de uit, mantendo-se a
admissibilidade da solução dual. Caso seja possível, aumenta-se o valor da variável,
actualizam-se as slacks, verifica-se quais as variáveis vjt que poderão ser aumentadas (aquelas
que estão impedidas de crescer devido, unicamente, a slacks que irão aumentar. Estas variáveis
constituem o conjunto J+) e executa-se o procedimento dual ascendente para as variáveis vjt.
Considere-se que as variáveis uit estão organizadas numa sequência de pares (i,t).
Procedimento Dual Ascendente para uit
23
1. Inicializar ( i , t ) ← ( i , t )1; q ←1.
2. ξ ← t ; ∆uit ← 0; δ ←0.
3. Se SRitξ = 0 e SAit
ξ ≠ 0, então ∆uit ← max { ∆ui
t , SAitξ } e δ ←1.
4. Se ξ = T ir para 5, senão ξ ←ξ +1, ir para 3.
5. Se δ = 0, ir para 7. Senão
∆←∆
<≤
γτ
γτit
ti
ti SAminuminu , , SRit
ξ ← SRitξ + ∆ui
t,∀ξ ≥ t.
SAiτξ ← SAiτ
ξ - ∆uit,∀ τ ≤ ξ < t e ui
t ← uit + ∆ui
t.
6. ( ) { }{ }tiItjJ tj ∀==+ ,:, * . Executar o Procedimento Dual Ascendente para as variáveis vj
t.
JJ =+ . Executar o Procedimento Dual Ascendente para as variáveis vjt.
7. Se q =#I ×T então parar. Senão q ← q + 1; ( i , t ) ← ( i , t )q, ir para 2.
4.7. Procedimento dual descendente para uit
Ao diminuir o valor de uma variável dual uit, diminuem-se as slacks SRit
ξ,ξ ≥ t, e
aumentam-se as slacks SAiτξ,τ ≤ ξ < t. Para que seja garantida a admissibilidade da solução
dual, só se poderá diminuir uit se SRit
ξ > 0, ∀ξ ≥ t. Também neste caso será possível melhorar a
função objectivo dual, desde que se consiga aumentar slacks Siτξ que estejam a impedir o
aumento de variáveis vjt , diminuindo slacks Siτ
ξ que não limitam o crescimento de nenhuma
variável vjt. Verifica-se quais as variáveis vj
t que podem aumentar o seu valor, e executa-se o
procedimento dual ascendente para as variáveis vjt.
Procedimento Dual Descendente para uit
1. Inicializar ( i , t ) ← ( i , t )1; q ←1.
2. Se uit =0 ir para 6; Caso contrário, ∆ui
t ← 0; δ ←0.
3. Se SRitξ > 0, ∀ξ ≥ t, então { } ξ
ξitt
ti SRminu
≥←∆ e δ ←1.
4. Se δ = 0 ir para 6. Senão ∆uit ← min { ∆ui
t , uit }; SRit
ξ ← SRitξ - ∆ui
t,∀ξ ≥ t.
SAiτξ ← SAiτ
ξ + ∆uit,∀ τ ≤ ξ < t e ui
t ← uit - ∆ui
t.
5. ( ) { }{ }tiItjJ tj ∀==+ ,:, * . Executar o Procedimento Dual Ascendente para vj
t.
JJ =+ . Executar o Procedimento Dual Ascendente para vjt.
6. Se q =#I ×T então parar. Senão q ← q + 1; ( i , t ) ← ( i , t )q, ir para 2.
24
4.8. Procedimento de ajuste dual para as variáveis πit
Ao aumentar o valor das variáveis πit aumenta-se o valor das slacks Siτ
ξ,τ ≤ t ≤ ξ. O
aumento destas slacks poderá permitir que variáveis vjt aumentem o seu valor. Aliás, só
compensa aumentar πit se aquilo que se perde na função objectivo (porque esta variável
contribui com o coeficiente –1) for compensado pelo que se ganha com o aumento de variáveis
vjt .
Se se diminuir o valor das variáveis πit, mantendo-se a admissibilidade da solução dual,
melhora-se automaticamente o valor da função objectivo de DC-PLDAFR.
O procedimento que a seguir se apresenta tenta diminuir ou aumentar o valor das variáveis
duais πit , mantendo a admissibilidade da solução dual e garantindo que o valor da função
objectivo dual não piora. Omite-se a prova, por ser semelhante à apresentada para o
procedimento de ajuste dual para as variáveis ρi .
Se todas as slacks Siτξ,τ ≤ t ≤ ξ forem maiores do que zero, significa que não vale a pena
aumentar o valor da variável πit . Se esta variável for maior do que zero, significa que se pode
descer o seu valor, actualizando-se as slacks Siτξ,τ ≤ t ≤ ξ . Se existir alguma slack igual a zero,
aumenta-se o valor da variável πit em M (um valor positivo e maior do que os custos
considerados no problema). Verifica-se quais as variáveis duais que poderão aumentar o seu
valor e executa-se o procedimento dual ascendente para as variáveis vjt. Se o aumento de πi
t não
for aproveitado na totalidade pelo aumento das variáveis vjt, significa que todas as slacks Siτ
ξ,τ
≤ t ≤ ξ serão maiores do que zero, procedendo-se de seguida à diminuição de πit.
Procedimento de ajuste dual para as variáveis πit
1. Inicializar ( i , t ) ← ( i , t )1; q ←1.
2. ξτ
ξτπ it
ti Smin
≤≤=∆ . Se ∆πi
t ≠0, então ir para 6. Senão ∆πi
t ← M.
3. Siτξ ← Siτ
ξ + ∆πit,∀ τ ≤ t ≤ ξ ; πi
t =πit +∆πi
t .
4. ( ) { }{ }tiItjJ tj ∀==+ ,:, * . Executar o Procedimento Dual Ascendente para as variáveis vj
t .
JJ =+ . Executar o Procedimento Dual Ascendente para as variáveis vjt .
5. ξτ
ξτπ it
ti Smin
≤≤=∆ .
6. ∆πit =min {∆πi
t , πit }. Se ∆πi
t ≠ 0 então Siτξ ← Siτ
ξ - ∆πit,∀ τ ≤ t ≤ ξ . πi
t =πit -∆πi
t .
7. Se q =#I ×T então parar. Senão q ← q + 1; ( i , t ) ← ( i , t )q, ir para 2.
25
4.9. Exemplos de Aplicação
Exemplo 1
Considere-se o seguinte problema, com três períodos temporais, em que não se considera a
hipótese de reabertura no período 1:
Custos de afectação:
t =1
i j 1 2 3 4
1 4 5 3 8
2 3 0 4 5
3 4 2 0 2
t =2
i j 1 2 3 4
1 6 6 4 9
2 5 1 5 5
3 5 4 0 3
t =3
i j 1 2 3 4
1 7 7 6 9
2 6 4 6 6
3 5 5 2 4
Custos fixos de abertura e reabertura:
i FAi11 FAi1
2 FAi13 FAi2
2 FRi22 FAi2
3 FRi23 FAi3
3 FRi33
1 4 8 5 10 9 10 9 5 5
2 7 6 5 10 9 10 9 6 5
3 5 10 20 6 6 10 8 4 4
Após o Procedimento Dual Ascendente para vjt ficamos com os seguintes valores para
as variáveis duais:
t j 1 2 3 4
1 4 2 3 4
2 6 2 4 3
3 6 4 4 4
26
E para as slacks:
i SAi11 SAi1
2 SAi13 SAi2
2 SRi22 SAi2
3 SRi23 SAi3
3 SRi33
1 4 8 5 10 9 10 9 5 5
2 4 1 0 8 7 8 7 6 5
3 0 0 7 1 1 2 0 1 1
A função objectivo do dual tem o valor 46.
I* = {(3,1,1),(3,1,2),(2,1,3),(3,2,3)}
I1*={2,3}; I2
*={2,3}; I3*={2,3}
I1+={3}; I2
+={2,3}; I3+={2,3}
O Procedimento 1 dará origem à solução:
IA+={(3,1,2),(2,1,3)}; IR
+={(3,3,3)} que viola condições de complementaridade pois SR333≠0. O
custo total desta solução é de 48.
O Procedimento 2 dará origem à solução:
IA+={(3,1,1),(2,1,3)}; IR
+={(3,2,3)}. O custo total desta solução é de 47. Existe violação das
condições de complementaridade porque v12>c21
2 e v12>c31
2.
O Procedimento de ajuste dual para as variáveis ρi não altera a solução dual, pelo que ρi = 0,∀i.
J22+={(2,2),(2,3)}; J3
2+={(3,2),(3,3),(4,2),(4,3)}.
A solução dual resultante do procedimento de ajuste dual-primal será:
t j 1 2 3 4
1 4 2 3 4
2 5 3 5 3
3 6 4 4 4
As slacks não sofrem alterações.
A função objectivo do dual fica com o valor 47, o que significa que a melhor solução
calculada anteriormente é a solução óptima.
27
Exemplo 2
Considere-se um exemplo com os mesmos custos de afectação do exemplo 1, e com os
seguintes custos fixos de abertura e reabertura:
i SAi11 SAi1
2 SAi13 SAi2
2 SRi22 SAi2
3 SRi23 SAi3
3 SRi33
1 4 8 5 10 9 10 9 5 5
2 7 7 5 10 9 10 7 6 5
3 10 2 20 6 6 10 3 6 5
Após o Procedimento Dual Ascendente para vjt ficamos com os seguintes valores para
as variáveis duais e para as slacks:
t j 1 2 3 4
1 4 2 2 2
2 5 3 0 3
3 6 4 4 4
i SAi11 SAi1
2 SAi13 SAi2
2 SRi22 SAi2
3 SRi23 SAi3
3 SRi33
1 4 8 5 10 9 10 9 5 5
2 4 2 0 8 7 8 5 6 5
3 8 0 15 6 6 7 0 3 2
A esta solução dual corresponde o valor da função objectivo igual a 39.
I* = {(3,1,2),(2,1,3),(3,2,3)}
I1*={2,3}; I2
*={2,3}; I3*={2,3}
I1+={3}; I2
+={2,3}; I3+={2,3}
O Procedimento 1 dará origem à solução:
IA+={(3,1,2),(2,1,3)}; IR
+={(3,3,3)} que viola condições de complementaridade pois SR333≠0. O
custo total desta solução é de 41.
O Procedimento 2 dará origem à solução:
IA+={(3,1,1),(2,1,3)}; IR
+={(3,2,3)}. O custo total desta solução é de 47. A solução viola
condições de complementaridade pois SA311≠0.
O Procedimento de ajuste dual para as variáveis ρi não altera a solução dual, pelo que ρi = 0,∀i.
O Procedimento de Ajuste Dual-Primal para as variáveis vjt não altera a solução dual.
Como SR323 = 0 e SA32
3 ≠ 0, faz-se ∆u32 = 7 (∆u3
2 = min{ SA323, SA31
1}).
28
Alterando-se as slacks respectivas e executando o procedimento de ajuste dual, ficamos com a
solução dual:
t j 1 2 3 4
1 4 2 2 2
2 5 3 0 3
3 6 4 6 4
i SAi11 SAi1
2 SAi13 SAi2
2 SRi22 SAi2
3 SRi23 SAi3
3 SRi33
1 4 8 5 10 9 10 9 5 5
2 4 2 0 8 7 8 5 6 5
3 1 0 13 6 13 5 5 1 0
O valor da função objectivo dual é 41, o que mostra que já tínhamos calculado a solução
óptima.
Exemplo 3
Considere-se o seguinte problema, com três períodos temporais, em que não se
considera a hipótese de reabertura no período 1:
Custos de afectação:
t =1
i j 1 2 3 4
1 7 2 4 0
2 5 1 3 4
3 3 0 5 9
t =2
i j 1 2 3 4
1 8 3 4 2
2 6 1 8 5
3 4 5 1 6
t =3
i j 1 2 3 4
1 9 6 5 3
2 5 8 3 6
3 5 4 4 10
29
Custos fixos de abertura e reabertura:
i FAi11 FAi1
2 FAi13 FAi2
2 FRi22 FAi2
3 FRi23 FAi3
3 FRi33
1 3 4 10 4 10 5 10 6 20
2 4 6 20 3 10 5 10 6 20
3 3 4 16 2 10 5 10 6 20
Após o Procedimento Dual Ascendente para vjt ficamos com os seguintes valores para
as variáveis duais:
t j 1 2 3 4
1 5 1 4 3
2 5 3 1 3
3 8 5 3 6
E para as slacks:
i SAi11 SAi1
2 SAi13 SAi2
2 SRi22 SAi2
3 SRi23 SAi3
3 SRi33
1 0 0 3 3 9 1 6 3 17
2 3 3 14 1 8 0 5 3 17
3 0 0 8 1 9 0 5 2 16
A função objectivo do dual tem o valor 47.
I* = {(1,1,1),(1,1,2),(3,1,1),(3,1,2),(2,2,3),(3,2,3)}
I1*={1,3}; I2
*={1,2,3}; I3*={2,3}
I1+={1,3}; I2
+={3,1}; I3+={2,3}
O Procedimento 1 dará origem à solução:
IA+={(1,1,2),(2,2,3),(3,1,2}; IR
+={(3,3,3)} que viola condições de complementaridade pois
SR333 ≠ 0. O custo total desta solução é de 66.
O Procedimento 2 dará origem à solução:
IA+={(1,1,2),(2,2,3),(3,1,1)}; IR
+={(3,2,3)}. O custo total desta solução é de 55. Como SA323 = 0
e SR323≠0, teremos de alterar o valor de ρ3, que irá passar a ser igual a 5.
Alterando as slacks e voltando a executar o Procedimento Dual Ascendente, ficamos com:
30
t j 1 2 3 4
1 7 2 4 3
2 6 3 2 3
3 8 7 3 6
i SAi11 SAi1
2 SAi13 SAi2
2 SRi22 SAi2
3 SRi23 SAi3
3 SRi33
1 0 0 2 3 9 0 5 2 16
2 0 0 11 1 8 0 5 3 17
3 2 0 6 4 7 1 1 5 14
Esta solução tem como valor da função objectivo 49.
I* = {(1,1,1),(2,1,1),(1,1,2),(2,1,2),(3,1,2),(1,2,3),(2,2,3)}
I1*={1,2,3}; I2
*={1,2,3}; I3*={1,2}
I1+={1}; I2
+={1,3}; I3+={1,2}
O Procedimento 1 dará origem à solução:
IA+={(1,1,2),(2,2,3),(3,1,2)}; IR
+={(1,3,3)}, que viola condições de complementaridade pois
SR133 ≠ 0. O custo total desta solução é de 65.
O Procedimento 2 dará origem à solução:
IA+={(1,1,1),(2,2,3),(3,1,2)}; IR
+={(1,2,3)}. O custo total desta solução é de 54.
Como SA123 = 0 e SR12
3 ≠ 0, teremos de alterar o valor de ρ1, que irá passar a ser igual a 5. Após
a execução do procedimento dual ascendente, o seu valor irá ser diminuído para 3. A solução
dual obtida é:
t j 1 2 3 4
1 7 2 4 4
2 6 3 2 5
3 8 8 3 6
i SAi11 SAi1
2 SAi13 SAi2
2 SRi22 SAi2
3 SRi23 SAi3
3 SRi33
1 2 0 1 4 7 0 2 4 15
2 0 0 11 1 8 0 5 3 17
3 2 0 5 4 7 0 0 4 13
Esta solução tem como valor da função objectivo 50.
I* = {(2,1,1),(1,1,2),(2,1,2),(3,1,2),(1,2,3),(2,2,3),(3,2,3)}
31
I1*={1,2,3}; I2
*={1,2,3}; I3*={1,2,3}
I1+={1}; I2
+={2,3}; I3+={2}
O Procedimento 1 dará origem à solução:
IA+={(1,1,2),(2,2,3),(3,1,2)}. O custo total desta solução é de 50. Esta é a solução óptima para o
problema. Como se pode verificar o valor da função objectivo dual é igual ao valor da função
objectivo primal, logo não são violadas quaisquer condições de complementaridade.
5. Cálculo da solução óptima através de pesquisa em
árvore Sempre que a heurística primal-dual não consegue encontrar a solução óptima de
PLDAFR, pode iniciar-se um processo de pesquisa em árvore. Este processo poderá ser
iniciado com a solução encontrada pela heurística, escolhendo as variáveis a fixar através das
condições de complementaridade que estiverem a ser violadas. Para se fixarem as variáveis a
zero ou a um podem utilizar-se os mecanismos descritos em Erlenkotter, 1978.
As condições de complementaridade que poderão ser violadas pela solução primal
calculada através da heurística são:
§ aiτξ=1 e SAiτ
ξ ≠ 0. Neste caso escolher a variável riτξ para fixar a zero e/ou a um.
§ riτξ=1 e SRiτ
ξ ≠ 0. Neste caso escolher a variável aiτξ para fixar a zero e/ou a um.
§ uit ≠0 e rit
ξ=0,∀ξ ≥ t. Escolher a variável ritξ tal que SRiτ
ξ = 0 para fixar igual a zero
e/ou a um.
§ πit ≠ 0 e ait
ξ = ritξ=0,∀τ ≤ t ≤ ξ. Escolher a variável ait
ξ ou ritξ tal que Siτ
ξ = 0 para fixar
igual a zero e/ou a um.
§ vjt > cij
t, para mais do que um serviço i ∈ I+. Neste caso escolher a variável aiτξ ∈ IA
+
ou riτξ ∈ IR
+ ,τ ≤ t ≤ ξ, para fixar igual a zero e/ou a um.
32
Fixam-se variáveis a zero e a um, utilizando a heurística primal-dual em cada nó da árvore
para encontrar soluções primais admissíveis. Só se poderá retroceder quando a heurística
encontrar a solução óptima de um nó da árvore.
6. Desenvolvimentos Futuros Vamos efectuar testes computacionais que nos permitam tirar conclusões
fundamentadas sobre o desempenho desta heurística: o número de vezes que consegue atingir a
solução óptima e, no caso de não a atingir, qual a distância a que fica do melhor limite inferior
conhecido; quais as dimensões do problema (quer em relação ao nº de clientes e serviços, quer
em relação ao n.º de períodos temporais considerados) com que consegue lidar.
Pretendemos também comparar o desempenho do algoritmo de pesquisa em árvore
descrito com o desempenho de um general solver.
Se a heurística e o algoritmo de pesquisa em árvore tiverem, como se espera, um bom
desempenho pode também pensar-se em generalizar o PLDAFR considerando capacidades
máximas associadas aos serviços.
7. Bibliografia Antunes, A. e D. Peeters (2001), “On solving complex multi-period location models using
simulated annealing”, European Journal of Operational Research,130, pp 190-201
Cornuejols, G., G. Nemhauser e L. Wolsey (1990), “The Uncapacitated Facility Location
Problem”, in Discrete Location Theory, Mirchandani e Francis Edts., Wiley Interscience, pp
119-172
Erlenkotter, D. (1978), “A Dual-Based Procedure for Uncapacitated Facility Location”,
Operations Research, 26(6), pp 992-1009
Erlenkotter, D. (1981), “A Comparative Study of Approaches to Dynamic Location Problems”,
European Journal of Operational Research, 6, pp 133-143
Fong, C. O. e V. Srinivasan (1981a), “The Multiregion Dynamic Capacity Expansion Problem -
Part I”, Operations Research, 29 (4), pp 787-799
33
Fong, C. O. e V. Srinivasan (1981b), “The Multiregion Dynamic Capacity Expansion Problem
- Part II”,Operations Research, 29 (4), pp 800-816
Galvão, R. D. e E. del R. Santibañez-Gonzalez (1992), “A Lagrangean Heuristic for the
P-Median Dynamic Location Problem”,European Journal of Operational Research, 58, pp 250-
262
Hinojosa, Y., J. Puerto e F.R. Fernández (2000), “A Multiperiod two-echelon multicommodity
capacitated plant location problem”, European Journal of Operational Research, 123, pp 271-
291
Krarup, J. e P. Pruzan (1983), “The Simple Plant Location Problem: Survey and Synthesis”,
European Journal of Operational Research, 12, pp 36-81
Laporte, G. e P. Dejax (1989), “Dynamic Location-Routing Problems”, Journal of the
Operational Research Society, 40 (5), pp 471-482
Melachrinoudis, E., H. Min, X. Wu (1995), “A Multiobjective Model for the Dynamic Location
of Landfills”, Location Science, 3(3), pp 143-166
Min, H. (1988), “The Dynamic Expansion and Relocation of Capacitated Public Facilities: a
Multi-Objective Approach”, Computers and Operations Research, 15(3), pp 243-252
Saldanha da Gama, F. e M. E. Captivo (1996), “A Note on Dual Based Procedure for Dynamic
Facility Location”,Working Paper 11/96 - Centro de Investigação Operacional - Faculdade de
Ciências da Universidade de Lisboa
Shulman, A. (1991), “An Algorithm for Solving Dynamic Capacitated Plant Location Problems
with Discrete Expansion Sizes”, Operations Research, 39(3), pp 423-436
Sweeney, D. J. e R. Tatham (1976), “An Improved Long-Run Model for Multiple Warehouse
Location”, Management Science, 22 (7), pp 748-758
34
Van Roy, T. e D. Erlenkotter (1982), “A Dual-Based Procedure for Dynamic Facility
Location”, Management Science, 28 (10), pp 1091-1105
Wesolowsky, G. O. (1973), “Dynamic Facility Location”, Management Science,19(11), pp
1241-1248
Wesolowsky, G. e W. Truscott (1975), “The Multiperiod Location-Allocation Problem with
Relocation of Facilities”,Management Science, 22 (1), pp 57-65