Professional Documents
Culture Documents
i
Agradecimentos
Agradeco a Deus por ter me dado saude e forca para que eu pudesse chegar ao
fim desta etapa.
Aos meus pais, Francisco e Fatima, pelo apoio, confianca, incentivo e pelas
oracoes que por mim fizeram.
A minha prima Lylian e ao meu irmao Adriano pelo apoio que me deram ao
longo do curso aqui em Belo Horizonte.
Ao meu orientador Prof. Sergio Ricardo de Souza, por ter me ajudado a realizar
este trabalho.
Aos professores e funcionarios do CEFET pelo apoio que recebi durante o curso.
ii
Resumo
iii
Abstract
iv
Sumario
1 Introducao 1
2 Problemas Multiproduto 5
2.1 Introducao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Definicao do Problema . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Formulacoes No-Arco . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Formulacao Arco-Rota . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5 Variacoes em Problemas Multiproduto . . . . . . . . . . . . . . . . . 11
2.5.1 Modelo Nao Linear . . . . . . . . . . . . . . . . . . . . . . . . 11
2.5.2 Redes nao direcionadas . . . . . . . . . . . . . . . . . . . . . . 12
2.5.3 Problema de Projeto de Rede . . . . . . . . . . . . . . . . . . 14
2.6 Problemas Multiproduto Inteiro . . . . . . . . . . . . . . . . . . . . . 15
2.6.1 Aplicacoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.7 Conclusao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3 Metodos de Decomposicao 20
3.1 Introducao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.2 Decomposicao de Dantzig-Wolfe . . . . . . . . . . . . . . . . . . . . . 20
3.2.1 Algoritmo de Decomposicao de Dantzig-Wolfe . . . . . . . . . 22
3.2.2 Calculo do Limite Inferior . . . . . . . . . . . . . . . . . . . . 25
3.2.3 Resumo do Metodo de Decomposicao de Dantzig-Wolfe . . . . 26
3.3 Relaxacao Lagrangeana . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.3.1 Definicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.3.2 Relaxacao Lagrangeana e Relaxacao Linear . . . . . . . . . . . 30
3.4 Decomposicao de Benders . . . . . . . . . . . . . . . . . . . . . . . . 32
3.5 Conclusao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
v
Sumario vi
A Implementacoes MatLab 56
A.1 Script Principal - resolve.m . . . . . . . . . . . . . . . . . . . . . . . . 56
A.2 Leitura dos Dados - carbin.m . . . . . . . . . . . . . . . . . . . . . . 58
A.3 Criacao do Modelo de Programacao Linear - gera formulacao.m . . . 60
A.4 Heuristica - heuristica.m . . . . . . . . . . . . . . . . . . . . . . . . . 62
A.4.1 caminhos minimos.m . . . . . . . . . . . . . . . . . . . . . . . 63
A.4.2 Metaheuristica Busca Tabu - busca tabu.m . . . . . . . . . . . 63
A.4.3 Geracao dos vizinhos - vizinhos tabu.m . . . . . . . . . . . . . 68
A.4.4 Geracao dos vizinhos - vizinhos tabu2.m . . . . . . . . . . . . 70
A.5 Algoritmo de Decomposicao de Benders - benders.m . . . . . . . . . . 72
A.5.1 Problema Mestre - simplex.m . . . . . . . . . . . . . . . . . . 75
A.6 Algoritmo de Dijkstra - dijkstra.m . . . . . . . . . . . . . . . . . . . . 77
Referencias Bibliograficas 80
Captulo 1
Introducao
Preliminares
O interesse em pesquisa em torno do problema de fluxo de rede multiproduto data
do incio dos anos 60. Os trabalhos iniciais foram de Fulkerson(1962) [15] e Hu(1963)
[19]. Os problemas multiproduto surgem quando varios produtos compartilham
os arcos em uma rede e competem pela capacidade destes arcos. O objetivo e
determinar o fluxo dos produtos em cada arco, a um custo mnimo, de modo a
atender as restricoes de conservacao de fluxo.
Em geral, o modelo de programacao matematica deste problema apresenta
muitas variaveis e muitas restricoes. Contudo, seu conjunto de restricoes apresenta
uma estrutura especial, que torna bastante adequado o uso de metodos de decom-
posicao. A maioria dos trabalhos realizados aplica, de uma forma ou de outra,
tecnicas de decomposicao que procuram tirar proveito desta estrutura especial do
conjunto de restricoes.
Ja os problemas multiproduto inteiro foram resolvidos utilizando dentre outros,
o metodo branch-and-price-and-cut [5] e o metodo branch-and-price [12]. Ambos
sao uma variacao do algoritmo branch-and-bound, combinado com o metodo de
decomposicao de Dantzig-Wolfe.
Os problemas multiproduto, de um modo geral, tem recebido muita atencao,
devido ao crescimento de aplicacoes em areas de transportes e telecomunicacoes. A
dificuldade pratica de se resolver modelos de fluxo de rede multiproduto aumenta
de forma muito rapida a medida que o problema cresce em numero de variaveis e,
principalmente, em relacao ao numero de produtos. Aplicacoes em telecomunicacoes
tipicamente conduzem a instancias com um alto numero de produtos. Resolver tais
instancias torna-se, portanto, um grande desafio [22].
1
1 Motivacao 2
Motivacao
O problema multiproduto inteiro e um problema NP-difcil, ou seja, nao ha
algoritmo polinomial que o resolva. Problemas de otimizacao desta classe tem sido
foco de recentes estudos. Como exemplo, pode-se citar a grande aceitacao das
heursticas computacionais na busca de solucoes sub-otimas para problemas em que
os metodos exatos tem dificuldades na determinacao de solucoes otimas, em especial
para problemas combinatoriais.
Do ponto de vista teorico, a estrutura da formulacao deste problema motiva
o estudo dos metodos de decomposicao, devido a facilidade de aplicacao destes
metodos em problemas que possuem estruturas especiais de restricoes.
De um ponto vista pratico, a grande gama de aplicacoes dessa classe de problemas
torna a procura de melhores solucoes uma questao de forte impacto economico,
visando ao melhor uso das redes de comunicacoes existentes ou dos sistemas de
transporte, em particular.
Caracterizacao do Problema
Objetivos
Proposta de Desenvolvimento
Organizacao do Trabalho
Problemas Multiproduto
2.1 Introducao
Desde os anos 60, varios artigos surgiram tratando diversos modelos de problemas
de fluxo multiproduto. Os trabalhos iniciais, segundo [27], foram os apresentados
por Fulkerson(1962) e Hu(1963). Estes problemas, de um modo geral, possuem um
grande numero de variaveis e de restricoes e, principalmente, uma larga variedade
de aplicacoes. Em especial, essa classe de problemas tem se voltado para o estudo
de modelos de otimizacao de projetos de rede, postos como problemas de fluxo de
rede multiproduto [27].
Um fato que tem contribudo para o aumento de interesse no estudo deste pro-
blema e que, apesar de o problema multiproduto ser modelado como um problema
de programacao matematica generico, de um modo geral, as instancias que surgem
sao muito grandes. Problemas com um pequeno numero de arcos, nos e produtos
geram modelos com um grande numero de variaveis e restricoes, o que torna inviavel
a utilizacao de metodos de programacao matematica genericos [10].
Este captulo esta organizado como segue. Na proxima secao, e apresentada
uma definicao do problema multiproduto. Em seguida, uma visao das formulacoes
no-arco e arco-rota, e os principais metodos utilizados. Depois disso, sao apresen-
tadas algumas variacoes do problema e, no final, uma visao geral de problemas
multiproduto inteiro, ao qual o estudo deste trabalho se dedica.
5
2.2 Problema Multiproduto 6
P
X
min c p xp (2.1a)
p=1
P
X
suj. a xp u (2.1b)
p=1
Axp = bp , 1 p P, (2.1c)
xp 0, 1 p P, (2.1d)
sendo:
X
min cij xij (2.2a)
(i,j)A
X X
suj. a xij xji = bi , iN (2.2b)
(i,j)A (j,i)A
no qual
Por outro lado, um modo de fazer uso destas propriedades e utilizando-se tecnicas
de decomposicao. A estrutura de blocos diagonais de (2.1), formada por P blocos
de restricoes de conservacao de fluxo, sugere a utilizacao de tais tecnicas. Ao inves
de se resolver o problema original diretamente, em geral e criado um problema
mestre e um conjunto de subproblemas, que sao mais faceis de serem resolvidos
que o problema original proposto. As principais tecnicas de decomposicao sao:
decomposicao guiada ao preco, decomposicao guiada ao recurso e decomposicao
guiada pela particao da base (primal partitioning ou basis partitioning). Em [3] e
apresentado uma comparacao entre estes tres metodos.
Em [2], e apresentada uma aplicacao da tecnica de relaxacao lagrangeana a pro-
blemas de fluxo multiproduto com o metodo subgradiente usado para resolver o
problema dual Lagrangeano. Ao aplicar relaxacao lagrangeana ao problema mul-
tiproduto, as restricoes de aglutinacao, consideradas complicantes, sao relaxadas,
fazendo surgir um subproblema que pode ser decomposto em problemas de fluxo de
custo mnimo - um para cada produto [9].
P
X X
min cpr xpr (2.3a)
p=1 rR(p)
P
X X
suj. a arij xpr uij , (i, j) A (2.3b)
p=1 rR(p)
X
xpr = dp , 1pP (2.3c)
rR(p)
p
sendo ij o consumo da capacidade do arco (i, j) por unidade do produto p [2].
Na formulacao arco rota, arij deixa de conter apenas os valores {0,1} para ar-
mazenar a quantidade que o produto p consome no arco (i, j) ao fazer uso de sua
rota r. Neste caso, nao ha necessidade de alteracao do modelo (2.3).
P
X X
min cpij |xpij | (2.6a)
p=1 (i,j)A
2.5 Problema Multiproduto 13
P
X X
s. a |xpij | uij (i, j) A (2.6b)
p=1 (i,j)A
X X
xpij xpji = bpi i N , 1 p P, (2.6c)
(i,j)A (j,i)A
sendo:
Neste modelo, xpij < 0 indica que o fluxo do produto p e de j para i. Quando
positivo, de i para j. Assim, as restricoes de capacidade nos arcos consideram a
soma do valor absoluto de xpij para todos os produtos, como apresentado em (2.6b).
A mesma definicao e valida para a funcao objetivo.
Uma maneira alternativa de se solucionar um problema multiproduto de uma
rede nao direcionada e transforma-la em uma rede direcionada. Em [2], e apresen-
tada uma metodologia para esse proposito. Considera-se que cp 0 para p =
1, 2, ..., P . A figura 2.1 apresenta a modificacao realizada. Nesta nova rede, todo
o fluxo de i para j devera passar pelo arco (i0 , j 0 ) e o mesmo ocorre para o fluxo
de j para i. Os valores de b0i e b0j devem ser nulos e os valores bi e bj permanecem
inalterados para todos os produtos.
PSfrag replacements (0,
) i0 )
(0,
(c(i,j) , u(i,j) )
i j i (c(i,j) , u(i,j) ) j
(0,
)
)
(0,
j0
Figura 2.1: Transformacao de um arco nao-direcionado em uma estrutura direcionada.
P
X X
min cpij dp xpij (2.7a)
p=1 (i,j)A
P
X
s. a dp xpij uij (i, j) A (2.7b)
p=1
X X
xpij xpji = bpi i N,1 p P (2.7c)
(i,j)A (j,i)A
xpij - quando igual a 1, indica que o fluxo do produto p faz uso do arco (i, j);
sendo:
1 se i = s,
bpi = 1 se i = t,
0, caso contrario.
Ao considerar o modelo inteiro nessa formulacao, a oferta/demanda para cada
produto, que deveria ser dp no no de origem e dp no no de destino, foi modificada
para 1 e 1, respectivamente. Em virtude disto, ocorreu a modificacao nos coefi-
cientes da funcao objetivo (2.7a) e nas restricoes de capacidade nos arcos (2.7b),
adicionando a demanda dp para cada produto. Desse modo, a variavel xpij , que, no
modelo (2.1) foi utilizada para armazenar o fluxo do produto p no arco (i, j), e,
no modelo (2.7), utilizada apenas para indicar se o arco (i, j) faz ou nao parte do
caminho gerado para este produto.
Uma vez que se trata de uma formulacao origem-destino especficos, este
problema inteiro tambem pode ser modelado utilizando a formulacao arco-rota,
mostrada pela expressao (2.8).
P
X X
min cpr dp xpr (2.8a)
p=1 rR(p)
P
X X
s. a arij dp xpr uij (i, j) A (2.8b)
p=1 rR(p)
X
xpr = 1 1pP (2.8c)
rR(p)
na qual:
xpr - quando igual a 1, indica que a rota r e a rota utilizada pelo produto p;
arij - elemento da matriz arco-rota da rede. Seu valor sera igual a 1 se o arco
(i, j) estiver contido na rota r R(p) e 0, caso contrario.
(2.8c) teve seu valor dp substitudo por 1, indicando que o fluxo do produto p deve
fazer uso de uma unica rota.
Existem varios metodos que sao utilizados para solucionar um problema de pro-
gramacao linear inteira - PLI. Uma forma, por exemplo, seria utilizando relaxacao
linear, eliminando as restricoes de integralidade das variaveis, em um algoritmo
do tipo branch-and-bound [16]. Porem, este metodo se torna ineficiente devido ao
grande numero de variaveis inteiras. Sem a utilizacao de tecnicas de decomposicao,
estas relaxacoes podem requerer uma elevada quantidade de memoria e um grande
tempo de execucao [5].
Em [5], foi utilizado o algoritmo branch-and-price-and-cut, que e uma variacao
de branch-and-bound, com limites calculados pela solucao de programas lineares
usando geracao de colunas e cortes nos nos da arvore gerada pelo algoritmo branch-
and-bound. Ao utilizar branch-and-bound, os autores nao conseguiram obter uma
solucao factvel inteira para alguns problemas de maior porte. No entanto, com a
utilizacao da geracao de colunas e linhas em cada no da arvore, foi possvel nao
so obter solucoes factveis inteiras, como tambem que estas estivessem proximas
da otimalidade do problema. Ate entao, poucos trabalhos haviam sido realizados
fazendo uso de geracao de linhas e colunas para resolver problemas de PLI.
Uma alternativa interessante para solucionar os problemas multiproduto inteiro,
que estao na classe dos problemas NP-difceis, sao os metodos de aproximacao e
heursticas. Contudo, para problemas de fluxo multiproduto linear, como obser-
vado anteriormente, a maioria das tecnicas desenvolvidas e baseada em metodos de
solucao para problemas nao-lineares ou lineares de grande porte [33].
Os metodos heursticos sao bastante eficientes para a determinacao de uma
solucao, porem, nao garantem a otimalidade da solucao final determinada [11].
Em [33], e resolvido um problema multiproduto nao-linear inteiro. Segundo o au-
tor, diante das dificuldades de se obter a solucao otima para este problema, pode-se
optar pela obtencao de uma solucao aproximada, que pode ser obtida por heursticas.
Porem, embora algumas heursticas obtenham alguma solucao satisfatoria, e geral-
mente difcil avaliar a qualidade da solucao em relacao a solucao otima global.
Outro modo de resolver este problema nao-linear seria utilizar relaxacao das
restricoes nao-lineares ou restricoes de integralidade. No entanto, ao relaxar as re-
stricoes de aglutinacao, o problema dual lagrangiano obtido pode ser decomposto
em um conjunto de subproblemas bem mais faceis de serem resolvidos. Em [33],
foi utilizado a tecnica de relaxacao lagrangeana. As restricoes de aglutinacao foram
substitudas por um termo de penalidade na funcao objetivo. O metodo de subgra-
diente foi utilizado para encontrar os multiplicadores de Lagrange otimos.
2.7 Conclusao 18
2.6.1 Aplicacoes
Redes de comunicacoes usando fibras oticas podem ser modeladas na forma do
problema multiproduto inteiro. Nestas redes, os dados sao transportados entre pon-
tos de acesso utilizando apenas uma rota conhecida como lightpath. Para que os
dados possam ser transportados de um ponto a outro, e necessario estabelecer uma
rota na rede e alocar um wavelength livre em todos os arcos pertencentes a rota. A
bandwidth inteira sobre o caminho e reservada para esta conexao, ate que ela seja
finalizada, quando os wavelengths tornam-se disponveis em todos os arcos da rota.
Este problema pode ser modelado como um problema multiproduto inteiro, no qual
o fluxo de cada origem para cada destino e restrito a utilizar uma unica rota [28].
Em [30], e utilizada a tecnica de geracao de colunas para resolver duas classes de
problemas multiproduto inteiro, definidos em uma rede com capacidade limitada nos
arcos. Em um dos problema, e dado um conjunto de produtos, com suas demandas
e o custo unitario de cada produto em cada arco. O objetivo e selecionar um
subconjunto de produtos para serem roteados e associar, a cada um deles, uma
unica rota, que liga sua origem ao seu destino, tendo, como finalidade, maximizar o
benefcio da distribuicao. Este benefcio e medido utilizando-se um valor constante
para cada produto em cada rota. O outro problema consiste na selecao de todos os
produtos necessarios. Nesse caso, o problema se torna um problema de minimizacao
de custos.
2.7 Conclusao
Metodos de Decomposicao
3.1 Introducao
20
3.2 Decomposicao de Dantzig-Wolfe 21
Ax1 = b1 (3.1c)
Ax2 = b2 (3.1d)
..
. (3.1e)
AxP = bP (3.1f)
xp 0, 1pP (3.1g)
f 0 (3.1h)
Nessa expressao, tem-se que:
P - numero total de produtos da rede;
cp - vetor de custo unitario do produto p nos arcos da rede;
xp - vetor de fluxo do produto p nos arcos da rede;
I - matriz identidade;
f - vetor das variaveis de folga;
u - vetor de capacidade dos arcos;
A - matriz de incidencia no-arco da rede;
bp - vetor de ofertas e demandas para o produto p.
O conjunto de restricoes do modelo (3.1) e formado pelas restricoes de capacidade
nos arcos (3.1b) e pela estrutura bloco diagonal dada pelas restricoes (3.1c)-(3.1f),
na qual cada bloco e composto pelo conjunto de restricoes de conservacao de fluxo
para cada produto. Esta estrutura e que torna interessante a aplicacao do metodo
de decomposicao de Dantzig-Wolfe.
3.2 Decomposicao de Dantzig-Wolfe 22
pj 0, 1 j vp (3.2c)
jp 0, 1 j tp (3.2d)
Neste modelo, pj e jp sao escalares nao-negativos; vp e tp indicam, respectivamente,
o total de vertices e de direcoes extremas contidos em p , para cada p.
Uma vez conhecidos todos os vertices e direcoes extremas pertencentes aos con-
juntos p , pode-se eliminar, do modelo (3.1), as restricoes Axp = bp , p = 1, . . . P , e
xp 0, p = 1, . . . P , que delimitam p , e substituir o vetor xp da funcao objetivo
(3.1a) e das restricoes de capacidade dos arcos (3.1b) pela combinacao convexa e
linear nao-negativa dos pontos extremos e direcoes extremas de p , respectivamente,
na forma apresentada em (3.2). Feito isto para todos os produtos p, o problema de
programacao linear multiproduto (3.3) e obtido.
v1
X t1
X vP
X tP
X
min (c1 x1j )1j + (c1 d1j )j1 + . . . + (cP xPj )Pj + (cP dPj )jP + 0f (3.3a)
j=1 j=1 j=1 j=1
v1
X t1
X vP
X tP
X
suj. a x1j 1j + d1j j1 + ... + xPj Pj + dPj jP + If = u (3.3b)
j=1 j=1 j=1 j=1
3.2 Decomposicao de Dantzig-Wolfe 23
vp
X
pj = 1, p = 1, 2, ..., P (3.3c)
j=1
pj 0, 1 j vp , p = 1, 2, ..., P (3.3d)
jp 0, 1 j tp , p = 1, 2, ..., P (3.3e)
f 0 (3.3f)
b
cB - vetor de custo das variaveis basicas na funcao objetivo. Cada componente
deste vetor e dada pelo custo associado a um ponto extremo cp xpj , j = 1, . . . , vp ,
p = 1, . . . , P ; pelo custo associado a uma direcao extrema cp dpj , j = 1, . . . , vp ,
p = 1, . . . , P ; ou pelo custo de uma variavel de folga fi , que e nulo.
3.2 Decomposicao de Dantzig-Wolfe 24
1 ... 1})0 .
b - valor corrente das variaveis basicas, dado por b = B 1 (u0 1| 1 {z
P
xp
j = max
p p
( cp )xp + p (3.6)
x
Em (3.6), p , sendo uma constante, pode ficar fora desse modelo. Para isto, seu
valor deve ser adicionado ao valor da funcao objetivo do problema mestre no incio
do procedimento de decomposicao.
A solucao otima xp
j do subproblema (3.6) e ou limitada, na forma de um ponto
extremo xj ; ou ilimitada, na forma de uma direcao extrema dpj , tal que (cp )dpj > 0.
p
Em relacao as variaveis de folga fi , cada uma possui seu custo relativo, dado por i ,
em que o ndice i indica o arco da rede.
Desse modo, deve-se resolver um subproblema (3.6) para cada produto p. Em
seguida, comparar os resultados obtidos com os custos relativos das variaveis de
folga f . A solucao que possuir o maior custo relativo e a coluna k escolhida. Assim,
esta solucao, quando maior que zero, indica a variavel pj , jp ou fi a entrar na base.
3.2 Decomposicao de Dantzig-Wolfe 25
P
X
Mas, xp + f = u, pois xp e factvel. Entao:
p=1
P P P
!
X X X
cp xp u + p (zkp b
cpk ) + (zk b
ck ) (3.11)
p=1 p=1 p=1
Porem, como:
u
( ) 1
P
X z }| {
1
u + p = [ ] [u0 |1 1{z... 1}]0 = b
cB B 1 cB b
P = b
..
p=1 P .
1
e um limite inferior (LI) para o problema original. Alem disso, toda solucao obtida
para o problema mestre, b cB b, e um limite superior (LS) para o problema original.
Portanto, em cada iteracao, pode-se interromper a execucao do algoritmo caso seja
obtida uma solucao dentro de um limite de tolerancia aceitavel, ou seja, LS LI
gap, sendo que o valor gap indica a tolerancia.
?
- Tableau
6 do problema mestre
(, )
?
Resolva os subproblemas e
Coluna k
encontre a coluna k com
max{zk ck }
Coluna k
?
Q
Q
Q Solucao otima do problema
Adicione a coluna k Q
Sim -
Q zk c k 0
Q
ao tableau do mestre dada por (, , f ) e
Q
problema mestre Q obtida
Q
6 Q
Nao ?
? Calcule a solucao otima do
Calcule problema original
novo LI
?
? Fim
Q
Q
Q
Q Solucao para o
Nao LS LI gapQ Sim -
Q problema original
Q
Q
Q
Q
?
Fim
Figura 3.1: Algoritmo de Decomposicao de Dantzig-Wolfe.
Maiores detalhes sobre este metodo podem ser encontrados em [6] e [20], dentre
3.3 Relaxacao Lagrangeana 28
outras referencias.
3.3.1 Definicao
min cx (3.13a)
suj. a Ax b (3.13b)
Dx = e (3.13c)
x 0 e inteiro (3.13d)
suj. a Ax b (3.14b)
Dx = e (3.14c)
x 0 e inteiro (3.14d)
O valor otimo de (3.15), para fixo e nao negativo, e tambem um limite inferior para
o problema (3.13). Alem disso, o subproblema (3.15) e mais facil de ser resolvido que
o problema (3.13). Desse modo, deve-se calcular o valor de de forma a maximizar
o resultado do problema (3.15), ou seja, maximizando o valor da funcao lagrangeana
L() dada em (3.16).
Observe que, para cada x factvel nas restricoes (3.16b) e (3.16c), e gerada uma
funcao linear em dada por (Axb)0 0 +cx. Uma vez que, para cada 0, deve-se
minimizar a funcao objetivo (3.16a), entao a funcao L() e composta pelos menores
valores destas funcoes lineares. A figura 3.2 apresenta o grafico da funcao L().
Ou seja, a solucao do problema dual lagrangeano (3.17) fornece o melhor limite
inferior para o problema original.
Como observado pelo grafico da figura 3.2, a funcao L() e concava e linear por
partes. Logo, o valor otimo obtido para o problema dual lagrangeano (3.17) e otimo
global.
Por outro lado, uma vez que a funcao lagrangeana que se quer otimizar viola as
restricoes Ax b, a otimalidade do problema original nao e garantida.
Desse modo, pode-se fazer uso de um limite superior LS, dado pela melhor
solucao factvel obtida para o problema original. Caso seja encontrada uma solucao
para o problema dual lagrangeano (3.17), que possua valor otimo igual ao melhor
limite superior encontrado, entao essa solucao e otima para o problema original. Ou
3.3 Relaxacao Lagrangeana 30
cx + (Ax b)
PSfrag replacements
L()
seja, essa solucao possui gap de dualidade igual a zero. Caso contrario, a solucao
obtida apresenta uma folga primal-dual, dada por = LS LI.
Em [21], e desenvolvido um conjunto de condicoes de otimalidade aplicadas a for-
mulacao do problema lagrangeano, considerando um gap de dualidade previamente
definido como meta a ser alcancada no procedimento de otimizacao.
Em [13], e citado um metodo capaz de eliminar a folga primal-dual. Este metodo
utiliza uma funcao de Lagrange generalizada, em lugar do vetor de multiplicadores
de Lagrange. Porem, a solucao do problema dual e extremamente complicada.
Maiores detalhes sobre relaxacao lagrangeana podem ser obtidos em [2], [6] e
[14].
max e b (3.21)
,
suj. a D A c
0
livre
min cx (3.22)
suj. a Ax b
Dx = e
x0
valor que a solucao dos problemas (3.20) e (3.19). Uma vez que a solucao de (3.19)
e igual a solucao obtida pela relaxacao linear do problema original apresentada em
(3.22), pode-se concluir que o limite inferior obtido pela relaxacao lagrangeana sera
maior ou igual ao limite obtido pela relaxacao linear [14].
Ja em problemas multiproduto inteiro, o limite inferior obtido pela relaxacao
lagrangeana e igual ao limite obtido pela relaxacao linear, pois os subproblemas
lagrangeanos sao problemas de fluxo de custo mnimo que contem uma matriz de
restricoes unimodular, o que garante a integralidade de x. Embora isto aconteca,
ainda e interessante utilizar a relaxacao lagrangeana, pois a estrutura do problema
lagrangeano, formada por problemas de caminho mnimo, o torna bem mais facil de
ser resolvido.
Vale ressaltar que esta comparacao e valida considerando-se um modelo linear
com funcao objetivo linear. Em [26], um modelo de programacao linear que considera
uma funcao objetivo de custo concava e linear por partes e utilizado para resolver um
problema multiproduto de custos concavos. Neste caso, e mostrado que os limites
inferiores resultantes da relaxacao lagrangeana nao sao melhores do que os limites
gerados pela relaxacao linear.
max Z (3.24a)
suj. a Z cx + (Ax b), x (3.24b)
0 e Z variavel livre (3.24c)
3.4 Relaxacao Lagrangeana 33
que e equivalente ao problema (3.23). Uma vez que o numero de pontos contidos
em e infinito, torna-se inviavel criar um problema deste tipo com todas as suas
restricoes. Contudo, supondo que sejam conhecidos os pontos x1 , x2 , . . . , x(K1)
factveis em , ao inves de resolver o problema (3.24), pode-se resolver o problema
mestre (3.25).
max Z (3.25a)
suj. a Z cx1 + (Ax1 b) (3.25b)
Z cx2 + (Ax2 b) (3.25c)
..
.
Z cx(K1) + (Ax(K1) b) (3.25d)
0 e Z variavel livre. (3.25e)
t Incio
?
Encontre uma solucao x1
factvel para o problema
original. Faca LS = cx1
?
k=2
?
Resolva o problema mestre
max Z
- suj. a Z cxj + (Axj b) 1 j k 1
6
0
Z livre
Z k , k
?
Resolva o problema
min cx + k (Ax b)
suj. a x
k k+1 xk
?
6
Q
Q
Q
- Novo LS
Q Sim
Axk b Q
Q
Q
igual a cxk
Q
Q
Q
Nao
?
Novo LI igual a
?
cxk + k Axk b
?
PP
PP
Adicione a restricao PP Solucao otima do
Nao k PP Sim -
k k
Z cx + Ax b
PPZ cx + Axk b
k k problema dual
PP
no problema mestre PP lagrangeano: Z k , k
P
P
?
Fim
3.5 Conclusao
Aplicacao de Relaxacao
Lagrangeana ao Problema
Multiproduto
4.1 Introducao
36
4.3 Decomposicao de Benders 37
substituindo as restricoes de capacidade nos arcos, dadas por (2.7b), pelo termo de
penalidade que e adicionado a funcao objetivo, obtem-se a funcao lagrangeana L()
apresentada em (4.1):
P P
!
X X p X X
p p p p
L() = min cij d xij + ij d xij uij (4.1a)
p=1 (i,j)A (i,j)A p=1
X X
suj. a xpij xpji = bpi i N, 1 p P (4.1b)
(i,j)A (j,i)A
..
.
P P
!
X X X X
Z cpij dp xpij(k1) + ij dp xpij(k1) uij (4.4c)
p=1 (i,j)A (i,j)A p=1
Z livre e 0. (4.4d)
Nesta mesma iteracao, tambem e resolvido o subproblema (4.5), que e decom-
posto em P problemas de caminho mnimo. Ao final, caso nao seja atingida a
otimalidade do problema dual lagrangeano, o vetor x e enviado ao problema mestre.
P P
!
X X p X X
min cij dp xpij + ijk dp xpij uij (4.5a)
p=1 (i,j)A (i,j)A p=1
X X
suj. a xpij xpji = bpi i N, 1 p P (4.5b)
(i,j)A (j,i)A
..
.
P
X X X P
X X
Z cpr dp xpr(k1) + ij arij dp xpr(k1) uij (4.6c)
p=1 rR(p) (i,j)A p=1 rR(p)
Z livre e 0 (4.6d)
4.3 Problema Mestre 39
na funcao objetivo. Considerando que o custo cpr , associado a cada rota, e dado por:
X p
cpr = cij arij (4.9)
(i,j)A
sendo cpij o custo unitario do produto p no arco (i, j), o coeficiente (4.8) da variavel
xpr pode ser escrito como:
X
cpij + ijk arij dp (4.10)
(i,j)A
4.3.2 Subproblema
3. wq = wp + cpq
4. {q}
5. Volte ao passo 2.
A equacao (4.14) mostra que o no q , a ser transferido para , e aquele que
possui a menor distancia do no-origem. Esse valor de distancia e armazenado em
wq .
PSfrag replacements
Como exemplo, considere a aplicacao do algoritmo de Dijkstra para encontrar o
caminho mnimo entre o no-origem 1 e o no-destino 4 da rede apresentada na figura
4.1.
2
2
1 5
1 1 4 4
4
2 3
3
3
Figura 4.1: Rede orientada com custos em cada arco.
Para esse exemplo, sao obtidos os seguintes valores das variaveis, em cada itera-
cao do algoritmo:
1. = {1}; = {2, 3, 4}; w1 = 0;
2. min{(w1 + c12 ), (w1 + c13 )} = min{1, 2} = 1; = {1, 2}; = {3, 4}; w2 = 1;
3. min{(w1 + c13 ), (w2 + c23 ), (w2 + c24 )} = min{2, 5, 6} = 2;
= {1, 2, 3}; = {4}; w3 = 2;
4. min{(w2 + c24 ), (w3 + c34 )} = min{6, 5} = 5; = {1, 2, 3, 4}; = {}; w4 = 5;
5. Como e vazio, o algoritmo e finalizado. A solucao otima e o caminho {1,3,4}.
Em [6] e apresentada uma demonstracao de que o algoritmo de Dijkstra sempre
encontra uma solucao otima para o problema de caminho mnimo.
Como as instancias que foram resolvidas possuem todos os custos cpij nao-
negativos, entao o vetor de custo de cada subproblema, dado por cp + k , tambem
e nao-negativo. Logo, e aceitavel a utilizacao deste algoritmo para solucionar os
problemas de caminho mnimo gerados.
4.3 Solucao Factvel Inicial 43
Metodo da descida
1. Escolha uma solucao inicial s em S.
2. x caminhos minimos();
3. x x;
5. atual 0;
6. melhorIter 0;
7. L [ ];
9. atual atual + 1;
13. x x0 ;
15. x x;
19. x x ;
foi utilizada para avaliar cada solucao x obtida. Seu objetivo e penalizar
os arcos com capacidade violada. O arco i com capacidade violada possui
Ai x > ui . Essa funcao de avaliacao fornece uma medida do quanto a solucao
atual e infactvel. Logo, o algoritmo procura a solucao para a qual o valor
f (x) seja mnimo.
3. A cada 2tmax , o tamanho da lista tabu e modificado, de modo a evitar a
ciclagem. Esta estrategia de modificacao do tamanho da lista tabu no intervalo
[tmin , tmax ] mostrou-se eficiente ao resolver um problema de roteamento de
veculos, conforme esta apresentado em [31]. Na referencia citada, tmin = 0.9n
e tmax = 1.1n, sendo n o numero de cidades da instancia considerada.
4. No passo 12 do algoritmo, sao gerados os vizinhos da solucao atual e o melhor
vizinho e escolhido como nova solucao para o problema. Um vizinho x0 e gerado
como segue. Para cada produto p que faz uso do arco (i, j) com capacidade
violada, seu custo cpij e penalizado e um novo problema de caminho mnimo e
resolvido para este produto p. Desse modo, o arco (i, j) atual nao mais fara
parte do novo caminho encontrado para o produto p. Em seguida, este novo
0
caminho mnimo, identificado por xp , e agregado ao vetor x atual de modo
a gerar um novo x0 . Cada x0 , entao, representa uma nova solucao, dada pela
modificacao do fluxo nos arcos para cada produto p. Alem disso, se ja existir
na lista tabu n-uplas (p a) para o produto p, todos os arcos contidos na lista
sao tambem penalizados.
5. Apos a realizacao do movimento escolhido, a n-upla (p a) e adicionada a lista
tabu.
6. Em seguida, no passo 15, e realizado um teste que atualiza a melhor solucao
encontrada.
A condicao de parada do algoritmo e encontrar uma solucao factvel para o
problema original, ou realizar um numero de iteracoes sem melhora maior ou igual
a BT max.
4.4 Resultados Computacionais 47
determinstico, ou seja, dada uma entrada, a sada obtida nao e garantida ser a
mesma sempre que o algoritmo e executado. Esta variacao no resultado gerado
pela metaheurstica ocorre porque o tamanho da lista tabu e modificado de forma
aleatoria. Assim, para todas as instancias, foram realizadas tres tentativas de se
obter a solucao factvel inicial e o melhor resultado das tres esta apresentado na
tabela 4.2.
Uma dificuldade de se usar a metaheurstica busca tabu esta no ajuste de seus
parametros, principalmente o tamanho da lista tabu. Por exemplo, para a instancia
Bl01, o tamanho ideal foi um valor aleatorio entre 0, 9n e 1, 1n, para n igual a 12.
Ja para as instancias Bl05 a Bl08, que possuem uma rede mais densa, o tamanho
da lista tabu foi um valor aleatorio neste mesmo intervalo, porem com n igual a 6.
Quando o tamanho da lista tabu e muito pequeno, ocorre ciclagem. Por outro
lado, ao aumentar demasiadamente o tamanho da lista tabu para a mesma instancia,
o numero de iteracoes sem melhora atinge o limite BT max = 500. Isto significa
que, caso nao ocorra melhoria na solucao atual por 500 iteracoes, entao o algoritmo
e interrompido com uma solucao infactvel.
A tabela 4.2 apresenta o tempo de execucao gasto pela metaheurstica busca
tabu e pelo algoritmo de decomposicao de Benders, quando aplicados as instancias
da tabela 4.1. Alem do tempo de execucao, sao apresentados, tambem, o numero de
arcos violados obtidos ao final da aplicacao da metaheurstica busca tabu e o valor
do gap de dualidade, dado pela formula (4.16).
O gap de dualidade e usado como medida da qualidade da solucao obtida, in-
PSfrag replacements
1016
7
f (x)
6
Figura 4.2: Solucoes obtidas pela metaheurstica busca tabu na instancia Bl01.
min(LS) max(LI)
gap = 100 (4.16)
min(LS)
1016
2
f1 ( )
1, 5
f2 ( )
1
0, 5
0, 5
1 0 5 10 15 20 25
Iteracao
Figura 4.3: Limites encontrados pelo algoritmo de Benders na instancia Bl01.
4.5 Conclusao
Na secao (4.3) foi mostrado que o problema mestre e o subproblema gerados pelo
algoritmo de decomposicao de Benders para resolver o problema dual lagrangeano
nas formulacoes no-arco e arco-rota sao identicos. Desse modo, nao houve necessi-
dade de realizar testes com a formulacao arco-rota para verificar o desempenho do
algoritmo de Benders.
A metaheurstica utilizada para encontrar a solucao factvel inicial tem um papel
4.5 Conclusao 52
muito importante na qualidade da solucao final obtida. Prova disso e que, para
nenhuma instancia, o algoritmo de decomposicao de Benders conseguiu melhorar o
limite superior encontrado.
Como pode ser observado, a otimalidade do problema original nao foi garantida
para nenhuma instancia. Ou seja, todas as solucoes foram obtidas com um gap maior
que zero, indicando uma folga primal-dual. Contudo, as solucoes obtidas para as
instancias Bl05 a Bl08 atingiram um gap dentro de um limite de tolerancia aceitavel.
Em [12], estas instancias foram resolvidas utilizando o metodo branch-and-price,
que e um algoritmo tipo branch-and-bound, sendo que em cada no da arvore ge-
rada um problema multiproduto e resolvido, utilizando o metodo de decomposicao
de Dantzig-Wolfe. Caso a solucao apresente alguma variavel com valor fracionario,
novas restricoes ou cortes sao adicionados ao problema mestre gerado pela decom-
posicao de Dantzig-Wolfe.
Captulo 5
5.1 Conclusoes
53
5.2 Conclusao 54
Implementacoes MatLab
% -------------------------------------------------------------
% Os parametros de configuracao da metaheuristica busca tabu
% s~ao configurados na funcao busca_tabu.m apresentada
% sec~
ao 4.2 deste anexo.
% -------------------------------------------------------------
56
A.1 Implementacoes MatLab 57
% Tenta obter uma solucao factivel inicial x_k para o problema original
% utilizando a funcao heuristica.
tic
[z,x_k,fx] = heuristica;
tempo_heuristica = toc
z_inicial = z;
end
% 0 - resultado de benders
% 1 - valores f(x) das solucoes obtidas pela busca tabu.
grafico_metaheuristica = 1;
if grafico_metaheuristica
% Apresenta o grafico com os valores f(x) obtidos para todas as
% solucoes visitadas pela metaheuristica busca_tabu.
A.2 Implementacoes MatLab 58
fx=round(fx);
k = length(fx);
x = 1:k;
hold off;
hold on;
grid on;
plot(x,fx,b);
else
% Apresenta o grafico com os limites inferiores.
hold off;
hold on;
grid on;
plot(x,LI,g);
plot(x,LS,b);
end
fid=fopen(arq);
atual=1;
q_arcos=0; q_produtos=0;
arco_atual=1; produto_atual=1;
while 1
linha = fgetl(fid);
if ~ischar(linha)
break
end
if isempty(linha)
disp(linha em branco);
else
A.2 Implementacoes MatLab 59
vet_atual = str2num(linha);
end
% disp(linha)
%Cabecalho
if (atual == 2)
C = vet_atual(1);
elseif (atual == 5)
q_nos = vet_atual(1);
elseif (atual == 6)
q_arcos = vet_atual(1);
elseif (atual == 7)
q_produtos = vet_atual(1);
% inicializa as variaveis no_arco e custo
no_arco=zeros(q_nos,q_arcos);
custo = zeros(q_produtos,q_arcos);
elseif (atual>=9) && (atual < 9+q_arcos)
% matriz de incidencia no-arco da rede
no_arco(vet_atual(1),arco_atual) = 1;
no_arco(vet_atual(2),arco_atual) = -1;
% vetor de capacidade
u(arco_atual) = vet_atual(3);
% matriz de custos
if (C==2)
for p = 1 : q_produtos
custo(p,arco_atual)=vet_atual(4);
end
else
for p = 1 : q_produtos
custo(p,arco_atual)=vet_atual(3+p);
end
end
arco_atual=arco_atual+1;
atual=atual+1;
end
fclose(fid);
u = u;
% Func~
ao utilizada para gerar a formulac~
ao no-arco ODP de um PFCMMI.
% Entrada:
% tabela = [ K S T D ]. Onde:
% kst - identifica um produto k que sai de s e vai para t.
% d - indica a demanda do produto.
%
% Exemplo: [ 1 2 3 5] - Devem ser coletadas 5 unidades do produto 1
% no no 2 e serem entregues no no 3.
% O indice K nao e necessario. Ele foi criado devido a outras
% instancias que foram utilizadas como teste.
%
% no_arco = e a matriz de incidencia no-arco da rede.
%
% custo = e uma matriz onde cada linha identifica um produto e, cada
% coluna representa um arco da rede.
% Na mesma sequencia que a matriz de incidencia no-arco da rede.
%
% capacidade = e um vetor que contem, em cada posic~
ao, a capacidade
% total de cada arco.
%
A.3 Implementacoes MatLab 61
% Sada:
% sp A = matriz dos coeficientes do conjunto de restric~
oes Ax <= u.
% sp no_arco = matriz de incidencia no-arco da rede.
%
% sp B = Uma matriz onde cada coluna e um vetor b de ofertas e
% demandas de cada produto.
%
% sp indica que as matrizes sao esparsas.
global c no_arco B u A
% vetor c
c = [];
for i = 1 : size(custo,1)
c = [ c custo(i,:) ];
end
end
% -----------------------------------------------------------------------
% Script que encontra uma solucao inicial x e faz uma chamada a funcao
% busca_tabu(x) com o objetivo de retornar uma solucao factivel para o
% problema multiproduto inteiro.
% -----------------------------------------------------------------------
% Saida:
% fx_min - valor da funcao objetivo no problema original para a melhor
% solucao encontrada.
% x_min - vetor x da solucao encontrada.
% valor_fx - vetor contendo os valores f(x) obtidos para cada solucao x
% encontrada pelo metodo busca tabu, onde f(x)=cx+alfa*max{Ax-u,0}.
global c A u no_arco B
q_produtos = size(B,2);
q_arcos = size(no_arco,2);
c_atual = c;
toc
% --------------------------------------------------------------
% Esta funcao encontra uma solucao x referente a todos
% os caminhos minimos para todos os produtos.
% --------------------------------------------------------------
global no_arco B
arcos = size(no_arco,2);
produtos = size(B,2);
z = 0;
x = [];
for i = 1 : produtos
demanda = B(find(B(:,i)>0),i);
b = B(:,i)/demanda;
[z_atual,x_atual] = dijkstra(c((i-1)*arcos+1:i*arcos),b);
x = [ x; demanda*x_atual ];
end
z = c*x;
% ------------------------------------------------------
% Parametros a serem ajustados para cada instancia.
BTmax = 500;
t_min = 0.9*12; % Bl01-04 - 12; Bl05-08 - 6
t_max = 1.1*12;
% ------------------------------------------------------
q_produtos = size(B,2);
q_arcos = size(no_arco,2);
x_otimo = x;
Atual = 0;
MelhorIteracao = 0;
cont_vizinho2 = 0;
Lista = [];
f_min = 0;
tam_lista = round((t_max-t_min)*rand+t_min);
delta = sum(c);
valor_fx(Atual + 1) = f(x);
while (f(x) > f_min) && (Atual - MelhorIteracao < BTmax)
Atual = Atual + 1;
if Atual > 30
Atual = Atual;
end
tam_lista = round((t_max-t_min)*rand+t_min);
if (size(Lista,1) > tam_lista)
Lista(1:(size(Lista,1) - tam_lista),:) = [];
end
end
V = [];
if (Atual - MelhorIteracao) > 5 && (Atual - cont_vizinho)> 5
vizinhos_tabu2(x, Lista);
cont_vizinho = Atual;
else
vizinhos_tabu(x, Lista);
end
if isempty(V)
fx_min = f(x_otimo);
x_min = x_otimo;
return;
end
% Selecione x em V de modo que f(x) seja minimo e nao seja tabu. Ou,
% seja tabu e com valor de f(x)<f(x_otimo).
encontrou = 0;
cont_tabu = 0;
while ~ encontrou
if ~ isempty(V)
[ fx_viz, viz_escolhido] = min(V(:,1));
produto = V(viz_escolhido,2);
arco = V(viz_escolhido,3);
if e_tabu(V(viz_escolhido,2:3)) % se e tabu
% realizo este movimento em x.
x_viz = x;
x_viz((produto-1)*q_arcos+1:produto*q_arcos) =
V(viz_escolhido,4:length(V(viz_escolhido,:)));
if f(x_viz) < f(x_otimo)
encontrou = 1;
else
% nao sendo permitido o movimento da lista,
% outro x e procurado.
V(viz_escolhido,1) = inf;
end
A.4 Implementacoes MatLab 66
cont_tabu = cont_tabu + 1;
else
encontrou = 1;
end
end
produto = Lista(1,1);
arco = Lista(1,2);
V(1,2) = produto;
V(1,3) = arco;
V(viz_escolhido,4:length(x_p)+3) = demanda*x_p;
Lista(1,:) = [];
encontrou = 1;
end
end
produto = V(viz_escolhido,2);
arco = V(viz_escolhido,3);
if ~ e_tabu(mov)
Lista = [ Lista; mov ];
end
if (size(Lista,1) > tam_lista)
Lista(1,:) = [];
end
if (size(Lista,1) == size(Lista1,1))
if (Lista == Lista1)
pare = listas iguais
end
end
%f(x)
valor_fx(Atual + 1) = f(x);
arcos = find(A*x_otimo>u);
arcos_capacidade_violada = size(find(A*x_otimo>u))
end
end
iter = Atual
x_min = x_otimo;
fx_min = f(x_otimo);
function vf = e_tabu(m)
global Lista
vf = 0;
i = 1;
while (i <= size(Lista,1)) && ~ vf
if all(Lista(i,:) == m)
vf = 1;
end
i = i + 1;
end
% -----------------------------------------------------------------
% Gera os vizinhos para a metaheuristica busca tabu.
% Esta funcao penaliza os custos para todos os arcos
% contidos na Lista tabu para todo produto que faz uso do
% arco (i,j) com capacidade violada.
% -----------------------------------------------------------------
global A u no_arco B c V
q_produtos = size(B,2);
A.4 Implementacoes MatLab 69
q_arcos = size(no_arco,2);
fx = f(x);
delta = sum(c);
%delta = 100;
c_atual = c;
aux = find(x(indice_x_produtos_arco_violado));
indice_x_produtos_arco_violado = indice_x_produtos_arco_violado(aux);
qde_produtos_arco = length(indice_x_produtos_arco_violado);
for i = 1 : qde_produtos_arco
indice_atual = indice_x_produtos_arco_violado(i);
produto = ceil(indice_atual/q_arcos);
demanda = B(find(B(:,produto)>0),produto);
for i = 1 : size(Lista,1)
if (Lista(i,1) == produto)
A.4 Implementacoes MatLab 70
c_atual((produto-1)*q_arcos+Lista(i,2)) =
c_atual((produto-1)*q_arcos+Lista(i,2)) + delta;
end
end
% -----------------------------------------------------------------
% Gera os vizinhos para a metaheuristica busca tabu.
% Esta funcao penaliza os custos para os arcos contidos na
% Lista tabu de forma aleatoria, para todo produto que faz
% uso do arco (i,j) com capacidade violada.
% -----------------------------------------------------------------
global A u no_arco B c V
q_produtos = size(B,2);
q_arcos = size(no_arco,2);
fx = f(x);
delta = sum(c);
A.4 Implementacoes MatLab 71
%delta = 100;
c_atual = c;
aux = find(x(indice_x_produtos_arco_violado));
indice_x_produtos_arco_violado = indice_x_produtos_arco_violado(aux);
qde_produtos_arco = length(indice_x_produtos_arco_violado);
for i = 1 : qde_produtos_arco
indice_atual = indice_x_produtos_arco_violado(i);
produto = ceil(indice_atual/q_arcos);
demanda = B(find(B(:,produto)>0),produto);
c_atual((produto-1)*q_arcos+Lista(i,2)) + delta;
end
end
end
% Entrada:
% x_k - solucao factivel inicial para o problema multiproduto inteiro.
% Saida:
% LI - vetor contendo os limites inferiores para o problema.
% LS - vetor contendo os limites superiores encontrados para o problema.
% x_factivel - melhor limite superior encontrado. E a solucao
% final para o problema multiproduto inteiro.
global c A u no_arco B
produtos = size(B,2);
arcos = size(no_arco,2);
nos = size(no_arco,1);
LS(1) = c*x_k;
x_factivel = x_k;
k=1;
A_mestre = [];
b_mestre = [];
fim = 0;
while ~fim & k<30
% PROBLEMA MESTRE
% z = z - z
%
% max z - z
% S.a z - z <= cx + pi*(Ax-u)
% pi >= 0, z >= 0 e z >= 0.
%
%
folga = zeros(n_restricoes,n_restricoes);
for i = 1 : n_restricoes
folga(i,i) = 1;
end
if ~ isempty(A_mestre)
A_mestre = A_mestre(:,1:length(u)+2);
end
A.5 Implementacoes MatLab 74
coef_pi = (u-A*x_k);
A_mestre = [ A_mestre; 1 -1 coef_pi ];
A_mestre = [ A_mestre folga ];
lin = size(A_mestre,1);
col = size(A_mestre,2);
ibase = [ col-lin+1 : col ];
% SUBPROBLEMA
c_sub = c + pi_k*A;
[z,x_k] = caminhos_minimos(c_sub);
LI(k) = z - pi_k*u;
k = k + 1;
end
%Observac~
oes:
% Tem que fornecer uma base inicial factivel.
% Ele identifica uma unica soluc~
ao. Soluc~
ao ilimitada ele apresenta
% z=-inf e um
% *No caso de multiplas soluc~
oes, ele apresenta apenas um vertice.
% *N~
ao trata soluc~
oes degeneradas.
A = full(A);
b = full(b);
for i = 1 : length(indiceBase)
base(:,i) = full(A(:,indiceBase(i)));
cb(i) = c(indiceBase(i));
end
terminou = 0;
vertices_visitados = 0;
epsilon = 0.01;
while ~ terminou
%inv_base = inv(base);
A.5 Implementacoes MatLab 76
xb = base\b;
z = cb*xb;
vertices_visitados = vertices_visitados + 1;
c_relativo = w*A-c;
[ maxCustoRelativo, k ] = max(c_relativo);
terminou = 1;
%mostra o resultado:
x_otimo(length(c)) = 0;
for i = 1 : length(indiceBase)
x_otimo(indiceBase(i)) = xb(i);
end
xb;
base_otima = indiceBase;
x_otimo = x_otimo;
z;
vertices_visitados;
else
%ocorre mudanca de base.
yk = base\A(:,k);
if any(yk > 0) %soluc~
ao limitada
raioMinimo = inf;
for i = 1 : length(b)
if yk(i) > 0
bbarra = base\b;
if bbarra(i)/yk(i) < raioMinimo
raioMinimo = bbarra(i)/yk(i);
r = i; %linha da variavel que sai.
A.6 Implementacoes MatLab 77
end
end
end
base(:,r) = A(:,k);
cb(r) = c(k);
indiceBase(r) = k;
else % soluc~
ao ilimitada
M = 5000000;
% apenas para evitar erro de nao atribuic~
ao aos parametros de sada.
z = -M;
x_otimo(length(c)) = 0;
x_otimo(k) = M;
for i = 1 : length(indiceBase)
% raio ao longo o valor tende a inf
x_otimo(indiceBase(i)) = xb(i) - x_otimo(k)*yk(i);
end
x_otimo = x_otimo;
terminou = 1;
end
end %end if maxCustoRelativo == 0
base_otima = 0;
% ------------------------------------------------
% Algoritmo de Dijkstra.
% ------------------------------------------------
% Entrada:
% c - vetor custo
% no_arco - matriz de incid^
encia no-arco da rede.
% b - vetor de oferta/demanda.
% b(o)=1, b(d)=-1 e b(i)=0 para todo i diferente de O e D.
A.6 Implementacoes MatLab 78
%
% Saida:
% z - valor do caminho mnimo
% x - o vetor x do problema linear
% {min cx : no_arco.x=b x=[0,1]}
%
% Exemplo: [z, x] = dijkstra(c,b)
global no_arco
qde_nos = length(b);
qde_arcos = length(c);
o = find(b==1);
d = find(b==-1);
X = [o];
% X_ = find(b~=1);
XX_ = find(no_arco(o,:)==1);
p = o;
q = o;
w(o) = 0;
arco = 1;
while (q~=d)
p = find(no_arco(:,arco)==1);
q = find(no_arco(:,arco)==-1);
w(q) = min; % potencial do no.
X = [ X q ];
anterior(q) = p;
arco_pq(q) = arco;
i = length(arcos);
while i >= 1
destino = find(no_arco(:,arcos(i))== -1);
if ~isempty(find(X==destino)) % se existe destino em X
arcos(i) = [];
end
i = i-1;
end
end
z = w(d);
Referencias Bibliograficas
[4] F. Babonneau, O. du Merle, and J. P. Vial. Solving large scale linear mul-
ticommodity flow problems with an active set strategy and proximal-accpm.
Operations Research, Aceito para publicacao.
[9] A. Bompadre and J. B. Orlin. A simple method for improving the primal
simplex method for the multicommodity flow problem. 2004.
80
Referencias Bibliograficas 81
[10] C. B. Browne. Using interior point methods to solve the multicommodity net-
work flow problem. Faculty of Administration - University of Ottawa, pages
132, 1992.
[12] F. Alvelos et. al. Comparing branch-and-price algorithms for the unsplittable
multicommodity flow problem. In Proceedings of the International Network
Optimization Conference, pages 712, 2003.
[17] J. Gondzio, R. Sarkissian, and J. P. Vial. Using an interior point method for the
master problem in a decomposition approach. European Journal of Operational
Research, 101:577587, 1997.
[21] T. Larsson and M. Patriksson. Global optimality conditions for discrete and
nonconvex optimization - with applications to lagrangian heuristics and column
generation. Operations Research, Aceito para publicacao.
Referencias Bibliograficas 82
[26] Ana Muriel and Farhad Munshi. Capacitated multicommodity network flow
problems with piecewise linear concave costs. IIE Transactions, Volume
36(7):683696, 2004.
[27] A. Ouorou, P. Mahey, and J.-Ph. Vial. A survey of algorithms for convex
multicommodity flow problems. Management Science, 46:126147, 2000.
[30] S. Park, D. Kim, and K. Lee. An integer programming approach to the path
selection problems. In Proceedings of INOC2005 - International Network Op-
timization Conference, Faculdade de Ciencias, Universidade de Lisboa, Lisboa,
Portugal, 2002.
[32] I-Lin Wang. Shortest Paths and Multicommodity Network Flows. Phd thesis,
School of Industrial and Systems Engineering. Georgia Institute of Technology,
EUA, 2003.
Referencias Bibliograficas 83