UNIVERSIDADE FEDERAL DE SANTA CATARINA – UFSC
DEPARTAMENTO DE ENGENHARIA DE PRODUÇÃO E SISTEMASGRAFOS
Teoria e AlgoritmosDisciplina:
Pesquisa Operacional III
Professor: Sérgio Fernando Mayerle e-mail: mayerle@deps.ufsc.br
1. Grafos e Algoritmos
1.1. Definição
Grafo é uma estrutura matemática G=(X,A), onde X ={x1,x2,...,xn} é um conjunto de nós (ou vértices) e A={a1,a2,...,am} é o conjunto de ligações entre os vértices de X . Cada ligação ak =(xi,xj) corresponde a um par ordenado.
Quando a orientação do par é relevante, as ligações recebem o nome de arcos, e o grafo é dito orientado. Em caso contrário, as ligações são denominadas de arestas, e o grafo é dito não-orientado. Na figura 01 econtram-se exemplos de grafos.
(a)
(b)
(c)
Os problemas de grafos (ou redes) surgem em uma grande variedade de situações. As redes de transporte, elétricas e comunicações, predominam em nossa vida diária. A representação de grafos se utiliza amplamente em áreas tão diversas como produção, distribuição, localização de instalações, planejamento de projetos, administração de recursos e planejamento financeiro. De fato, a representação de redes proporciona um panorama geral poderoso, e uma ajuda conceitual para visualizar as relações entre os componentes dos sistemas que se usa em quase todas as áreas científicas, sociais e econômicas.
Alguns problemas associados com G=(X,A) estão relacionados na seqüência: a) Problema de expansão de árvores de mínimo custo
b) Problema dos caminhos de mínimo custo c) Problema das p-medianas
d) Problema dos p-centros e) Problema do caixeiro viajante
1.2. Notação
Ainda em relação a um grafo G=(X,A) são usados as seguintes notações com base na teoria dos conjuntos:
Conjunto sucessor de um vértice: Γ(xi)={xj |(xi,xj)∈A}
Conjunto sucessor de um conjunto: Γ({x1,x2,...})=Γ(x1)∪Γ(x2)∪...
Conjunto sucessor de ordem k: ( ) ( ...( ( )))
i i k x x =Γ Γ Γ Γ
Conjunto predecessor de um vértice: 1( ) { |( , ) } A x x x xi = j j i ∈ Γ−
Conjunto predecessor de um conjunto: ({ , ,...}) ( ) ( ) ...
2 1 1 1 2 1 1 ∪ Γ ∪ Γ = Γ− x x − x − x
Conjunto predecessor de ordem k: ( ) 1( 1...( 1( ))) i i k x x − − − − =Γ Γ Γ Γ
Grau de saída de um vértice: ( ) ( )
i i
o x x
d = Γ
Grau de entrada de um vértice: ( ) 1( )
i i
t x x
d = Γ−
Grau de um vértice (grafos não-orientados): ( ) ( ) 1( ) i i
i x x
x
d = Γ = Γ−
Grafo parcial:
G
P=
(
X
,
A
P)
no qualA
P⊂
A
Sub-grafo:
(
,
)
S S SX
A
X
=
, no qualX
S⊂
X
e } , | ) , {( i j i j S S x x A x x X A = ∈ ∈Grafo bipartido: GB =(X1∪X2,A), tal que
(
x
i,
x
j)
∈
A
,∅ = ∩ 2 1 X
X , e para todo (xi,xj)∈A tem-se
x
i∈
X
1 e xj ∈X21.3. Representação matricial
Duas formas matriciais distintas poderão ser usadas para representar um grafo G=(X,A): (a) matriz de adjacência; (b) matrix de incidência.
Matriz de Adjacência ] [aij = A onde:
=
∈
∈
contrário
caso
em
vértice
do
sucessor
é
se
0
1
jX
iX
ijx
x
a
Matriz de Incidência]
[
b
ij=
B onde: − + = ∈ ∈ contrário caso em arco do final vértice é se arco do inicial vértice é se 0 1 1 j i j i ij X a a X x x bConsidere, como exemplo, o grafo apresentado na figura 02. Na seqüência são apresentadas as respectivas matrizes de adjacência e de incidência.
1 a 2 a 3 a 4 a 5 a 6 a 7 a 1 x 2 x 3 x 4 x 5 x
Figura 02 – Grafo orientado
= 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 A − + + − + + + − + − − − − + = 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 1 B
Considerando a esparsidade destas matrizes, a implantação de métodos computacionais mais eficientes poderá ser realizada usando métodos de armazenamento em listas
encadeadas, como mostra o esquema da figura 03, aplicado para a matriz de adjacência do grafo apresentado na figura 02.
A 1 2 3 4 1 1 2 ˄ 5 ˄ 2 2 3 ˄ ˄ 3 3 1 3 4 ˄ ˄ 4 4 2 ˄ 5 ˄ 5 1 ˄ ˄ 4 5 ˄ ˄
1.4. Caminhos mínimos
Suponha um grafo G=(X,A) com custos c(xi,xj)≥0,∀(xi,xj)∈A. Deseja-se encontrar um caminho de mínimo custo associado a G, que inica no vértice s∈X e termina no vértice t∈X . Para resolver este problema, existe um algoritmo proposto por Edsger Dijkstra (1959).
Considere que a cada vértice xi∈X existe um rótulo l(xi) e p(xi).
P1. Inicialização: Faça l(s)=0 e p(s)=nil. Marque este rótulo como permanente. Faça l(xi)=∞ para todo xi≠s e marque estes rótulos como temporários. Faça
s m= .
P2. Atualização dos rótulos: Para todo xi∈Γ(m) que tem um rótulo temporário, atualize os rótulos como segue:
m x x l x l x l x m c m l i i i i i = = = + = ) ( p faça ) ( Se ] ), ( [ min ) ( ) , ( ) (
β
β
β
P3. Fixa um rótulo como permanente: De todos os rótulos temporários encontre
m
para o quall
(m
)=min[l
(x
i)]. Marque o rótulo como permanente.P4. Teste de finalização: Se
m
=t
, então l(m) é o custo do caminho mínimo desejado.Apresente o caminho s,...,p(p(t)),p(t),t e o respectivo custo l(m), e pare. Em
caso contrário volte ao passo 2.
Se o objetivo é encontrar um caminho mínimo entre s e todos os demais vértices do grafo, o teste de finalização acima deverá ser adaptado para que a parada ocorra apenas quando todos os vértices tiverem sido rotulados como permanentes. Na figura 04 é apresentado como exemplo um de grafo contendo 8 nós e 13 arcos, às quais estão associados custos, para o qual pede-se encontrar o caminho mínimo entre o vértice 1 e o vértice 8.
Inicialização
Rotula-se como temporário o vértice 1, com custo nulo e predecessor ∅.
Iteração 1
Escolhe-se o vértice temporário com menor custo (vértice 1). Marca-se este vértice como permanente, e a partir dele rotula-se como temporários todos os seus vértices sucessores (vértice 2 e 3).
5 ) ); , ( ) ( min( ) ( 7 ) ); , ( ) ( min( ) ( 3 1 1 3 2 1 1 2 = ∞ + = = ∞ + =
x
x
c
x
l
x
l
x
x
c
x
l
x
l
Iteração 2Escolhe-se o vértice temporário com menor custo (vértice 3). Marca-se este vértice como permanente, e a partir dele rotula-se como temporário todos os seus vértices sucessores (vértice 2 e 4). O vértice 2 manté-se com o rótulo inalterado. 11 ) ); , ( ) ( min( ) ( 7 ) 7 ); , ( ) ( min( ) ( 4 3 3 4 2 3 3 2 = ∞ + = = + =
x
x
c
x
l
x
l
x
x
c
x
l
x
l
Iteração 3Escolhe-se o vértice temporário com menor custo (vértice 2). Marca-se este vértice como permanente, e a partir dele rotula-se como temporário todos os seus vértices sucessores (vértice 4 e 5). O vértice 4 permanece com o rótulo inalterado. 11 ) ); , ( ) ( min( ) ( 11 ) 11 ); , ( ) ( min( ) ( 5 2 2 5 4 2 2 4 = ∞ + = = + =
x
x
c
x
l
x
l
x
x
c
x
l
x
l
Iteração 4Escolhe-se o vértice temporário com menor custo. Como há empate entre os vértices 4 ou 5, optou-se pelo vértice 4. Marca-se este vértice como permanente, e a partir dele rotula-se como temporário todos os seus vértices sucessores (vértice 5 e 6). O vértice 5 mantém o rótulo inalterado. 18 ) ); , ( ) ( min( ) ( 11 ) 11 ); , ( ) ( min( ) ( 6 4 4 6 5 4 4 5 = ∞ + = = + =
x
x
c
x
l
x
l
x
x
c
x
l
x
l
Iteração 5
Escolhe-se o vértice temporário com menor custo (vértice 5). Marca-se este vértice como permanente, e a partir dele rotula-se como temporário todos os seus vértices sucessores (vértice 7 e 8).
23 ) ); , ( ) ( min( ) ( 20 ) ); , ( ) ( min( ) ( 8 5 5 8 7 5 5 7 = ∞ + = = ∞ + =
x
x
c
x
l
x
l
x
x
c
x
l
x
l
Iteração 6Escolhe-se o vértice temporário com menor custo (vértice 6). Marca-se este vértice como permanente, e a partir dele rotula-se como temporário todos os seus vértices sucessores (vértice 5 e 8). O vértice 5 permanece inalterado.
20 ) 23 ); , ( ) ( min( ) ( 11 ) 11 ); , ( ) ( min( ) ( 8 6 6 8 5 6 6 5 = + = = + =
x
x
c
x
l
x
l
x
x
c
x
l
x
l
Iteração 7Escolhe-se o vértice temporário com menor custo (vértice 7 e 8). Como existe empate, optou-se por escolher o vértice 8, por ser este o vértice de destino. Marca-se este vértice como permanente, e finaliza-se o processo. O caminho mínimo é determinado recursivamente, do vértice 8 ao vértice 1 (em azul).
Figura 04 – Busca de caminho mínimo entre os vértices 1 e 8, com as respectivas iterações. Para problemas onde se deseja encontrar o caminho mínimo entre todos os pares de vértices, é utiliza-se o algoritmo proposto por Floyd & Hu (1962). Suponha um grafo
) , (X A
G= com custos c(xi,xj) quaisquer, associados os arcos (xi,xj)∈A. Deseja-se encontrar caminhos de mínimo custo em G, associados a todos os pares de vértices. Assume-se, como dado de entrada, uma matriz de custos C =[cij], tal que:
∈ ∉ ∞ + = = A ) , ( se ) , c( A ) , ( se se 0 j i j i j i j i ij x x x x x x x x c
e uma matriz de roteiros, Θ=[
θ
ij], ondeθ
ij é o predecessor imediato dex
j no caminhomínimo de
x
i para xj. Inicializa-se a matriz Θ=[θ
ij], fazendo-seθ
ij =xi,∀i, j. P1. Inicialização: Faça k=0.P2. Incrementa iteração: Faça k= k+1.
P3. Para todo i≠k tal que
c
ik ≠∞, e todo j≠k tal que ckj ≠∞ realize a operação:kj ij ij ij ij kj ik β c c c c c
θ
θ
β
β
= = = + = faça Se ] , [ minP4. Teste de finalização: (i) Se existe
c
ii <0, então um circuito de custo negativocontendo o vértice
x
i existe em G, e nenhuma solução é possível. Pare. (ii) Se todos osc
ii ≥0 e k=n, então a solução foi obtida,C
=[c
ij] e Θ=[θ
ij] são as matrizes de custos mínimos e roteiros entre todos os pares de vértices. Pare. (iii) Se todos osc
ii ≥0 e k<n, retorne ao passo 2 e continue.Para recompor o caminho mínimo entre dois vértices quaisquer, denotados por xi,xj∈X, utiliza-se os ponteiros da matriz Θ=[
θ
ij], como segue:j ij i i i i
x
x
x
x
x
x
θ
θ
θ
θ
α α β β γ ν ν = = = =No exemplo da figura 05 encontra-se um grafo com 5 vértices e 7 arcos. Para este grafo, na seqüência, é aplicado o algoritmo de Floyd & Hu.
4 2 3 6 5 2 1 1 2 4 3 5 Tabela 05 – Grafo orientado
0 = k ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ = 0 6 5 0 1 0 4 2 2 0 3 0
C
= Θ 5 5 5 5 5 4 4 4 4 4 3 3 3 3 3 2 2 2 2 2 1 1 1 1 1 1 = k ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ = 0 6 5 0 4 1 0 4 2 2 0 3 0C
= Θ 5 5 5 5 5 4 4 4 1 4 3 3 3 3 3 2 2 2 2 2 1 1 1 1 1 2 = k ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ = 0 6 5 6 0 4 1 6 0 4 2 2 0 5 3 0C
= Θ 5 5 5 5 5 2 4 4 1 4 2 3 3 3 3 2 2 2 2 2 2 1 1 1 1 3 = k ∞ ∞ ∞ ∞ ∞ ∞ ∞ = 0 6 5 9 7 6 0 4 1 6 0 4 2 2 0 5 3 0C
= Θ 5 5 5 3 3 2 4 4 1 4 2 3 3 3 3 2 2 2 2 2 2 1 1 1 1 4 = k ∞ ∞ ∞ ∞ ∞ ∞ ∞ = 0 6 5 9 7 6 0 4 1 6 0 4 2 2 0 5 3 0C
= Θ 5 5 5 3 3 2 4 4 1 4 2 3 3 3 3 2 2 2 2 2 2 1 1 1 1 5 = k = 0 6 5 9 7 6 0 11 4 1 6 12 0 4 2 2 8 7 0 9 5 11 10 3 0C
= Θ 5 5 5 3 3 2 4 5 1 4 2 5 3 3 3 2 5 5 2 3 2 5 5 1 1Nestas matrizes, é possível encontrar o caminho mínimo entre quaisquer pares de vértices. Como exemplo, considere que o objetivo é encontrar o caminho mínimo entre os vértices
x
3 e x4. Então: 12 34 =c
5 34 =x
θ
θ
35 =x
2θ
32 =x
3Caminho mínimo =
x
3 →x
2→x
5 →x
41.5. Expansão de árvores
Este problema consiste em encontrar a árvore de extensão mínima. Uma árvore é um grafo em que todos nós se conectam sem que hajam ciclos. Este problema tem muitas aplicações práticas diretas, além de servir de estratégia para resolução de outros problemas mais complexos. O procedimento utilizado para resolver este problema é baseado no algoritmo proposto por Prim (1961).
Considere um grafo G=(X,A) conexo e não direcionado, com custos
c
(x
i,x
j) associados aos arcos (xi,xj)∈A. Deseja-se encontrar uma árvore em G, tal que a soma dos custos de suas arestas seja mínimo. A cada vérticex
j∈X
associa-se um rótulo [α
j,β
j], ondeα
j é custo de inclusão do vértice xj, eβ
j é o vértice da árvore com o qual xj deve se conectar ao ser incluído na árvore.P1. Faça
T
s ={x
s}, ondex
s é um vertice arbitrário qualquer, eA
s=∅.T
s eA
s são,respectivamente, o conjunto de nós e arestas da árvore em formação. P2. Para todo
x
j∉T
s encontre o vérticeα
j∈T
s, tal que:j j i T x j j x c x x c s i
β
α
= = ∈ [ ( , )] min ) , (e defina o rótulo de xj como [
α
j,β
j]. Se não for possível encontrarα
j, isto é, se∅ = ∩
Γ(xj) Ts , defina o rótulo de xj como [nil,+∞].
P3. Escolha o vértice * j x tal que: )] [ min * j T x j s j
β
β
∉ =Atualize Ts =Ts∪{xj*} e faça As = As∪{(
α
j*,xj*)}. Se |Ts|=n, pare (as ligaçõesem As formam a árvore desejada). Se |Ts|≠n, vá ao passo 4.
P4. Para todo xj∉Ts e xj∈Γ(xj*), tal que
β
j >c(xj*,xj), atualize o rótulo de xjfazendo: * *, ) ( j j j j j x x x c = =
α
β
e volte ao passo 3.Na figura 05 é apresentado como exemplo um de grafo contendo 8 nós e 13 arestas, às quais estão associados custos. Nesta figura estão apresentados os resultados parciais obtidos em todas as iterações do algoritmo.
7 5 3 4 11 6 7 3 9 12 2 10 9 1 3 6 2 4 5 7 8 [ , ] ] , [ ] , [ ] , [ ] , [ ] 5 , [ ] 7 , [ } { 8 7 6 5 4 1 3 1 2 1 ∞ ← ∞ ← ∞ ← ∞ ← ∞ ← ← ← ∅ = = nil x nil x nil x nil x nil x x x x x A x T s s 7 5 3 4 11 6 7 3 9 12 2 10 9 1 3 6 2 4 5 7 8 [ , ] [ , ] [ , ] ] , [ ] 6 , [ ] 3 , [ )} , {( } , { 8 7 6 5 3 4 3 2 3 1 3 1 3 * ∞ ← ∞ ← ∞ ← ∞ ← ← ← = = = nil x nil x nil x nil x x x x x x x A x x T x x s s j 7 5 3 4 11 6 7 3 9 12 2 10 9 1 3 6 2 4 5 7 8 [ , ] [ , ] ] , [ ] 4 , [ ] 6 , [ )} , ( ), , {( } , , { 8 7 6 2 5 3 4 2 3 3 1 2 3 1 2 * ∞ ← ∞ ← ∞ ← ← ← = = = nil x nil x nil x x x x x x x x x A x x x T x x s s j ] 12 , [ ] 9 , [ ] 3 , [ ] 6 , [ )} , ( ), , ( ), , {( } , , , { 5 8 5 7 5 6 3 4 5 2 2 3 3 1 5 2 3 1 5 * x x x x x x x x x x x x x x A x x x x T x x s s j ← ← ← ← = = = ] 2 , [ ] 9 , [ ] 6 , [ )} , ( ), , ( ), , ( ), , {( } , , , , { 6 8 5 7 3 4 6 5 5 2 2 3 3 1 6 5 2 3 1 6 * x x x x x x x x x x x x x x A x x x x x T x x s s j ← ← ← = = =
] 9 , [ ] 6 , [ )} , ( ), , ( ), , ( ), , ( ), , {( } , , , , , { 5 7 3 4 8 6 6 5 5 2 2 3 3 1 8 6 5 2 3 1 8 * x x x x x x x x x x x x x x A x x x x x x T x x s s j ← ← = = = ] 9 , [ )} , ( ), , ( ), , ( ), , ( ), , ( ), , {( } , , , , , , { 5 7 4 3 8 6 6 5 5 2 2 3 3 1 4 8 6 5 2 3 1 4 * x x x x x x x x x x x x x x A x x x x x x x T x x s s j ← = = = )} , ( ), , ( ), , ( ), , ( ), , ( ), , ( ), , {( } , , , , , , , { 7 5 4 3 8 6 6 5 5 2 2 3 3 1 7 4 8 6 5 2 3 1 7 * x x x x x x x x x x x x x x A x x x x x x x x T x x s s j = = =
Figura 05 – Algoritmo de Prim para expansão de árvores de mínimo custo
1.6. Problema de localização de p-medianas
Considere um grafo G=(X,A), com custos dij =d(xi,xj) associados aos caminhos que conectam os pares de vértices xi,xj∈X . Seja Xp ⊆X um subconjunto de X contendo p vértices. Define-se transmissão de Xp como:
∑
∈ = X x p j j p j X x d v X ) ( , ) (σ
Nesta expressão, vj é um peso associado ao vértice xj e d(xj,Xp) é a distância entre o
vértice xj e o conjunto de vértices Xp, dado por:
)] , ( [ min ) , ( j i X x p j X d x x x d p i∈ =
O problema das p-medianas consiste em encontrar o subconjunto * p
X de cardinalidade p para o qual a transmissão
σ
(X*p) seja mínima, isto é: = ∈ ⊆
∑
min[ ( , )] min ) ( * j i X x j X X p v d x x Xσ
Este problema pode ser modelado pelo seguinte problema de otimização inteira 0-1:
{ }
i j n n i n p n j d v ij n j ii ij n i ii n i ij n i n j ij ij j ,... 1 , 1 , 0 ,... 1 ,... 1 1 : s.a z Min 1 1 1 1 1 = ∀ ∈ = ∀ ≤ = = ∀ = =∑
∑
∑
∑∑
= = = = =ξ
ξ
ξ
ξ
ξ
ξ
onde
ξ
ij =1 implica que xj∈X está alocado ao vértice mediana xi∈Xp, eξ
ij =0 em casocontrário. Se
ξ
ii =1 então xi é um vértice mediana; em caso contrárioξ
ii =0.Tipicamente, para problemas de grande porte (n>1000), o modelo acima apresenta
milhares de equações e milhões de variáveis, e sua resolução através de métodos convencionais de programação matemática não é viável. Então, este problema pode ser resolvido de modo aproximado por meio do algoritmo de substituição de vértices proposto por Teitz & Bart (1968), e que encontra-se descrito abaixo.
P1. Selecione um subconjunto S ⊆ X, contendo p vertices, para formar uma solução inicial para as p-medianas. Marque todos os vértices xj∉S como “não-testados”. P2. Selecione algum vértice xj∉S “não-testado” e para cada vértice xi∈S calcule a
redução ∆ij no valor da transmissão, ao substituir o vértice xi pelo vértice xj na formação do conjunto S, isto é, calcule:
}) { } { ( ) ( j i ij = S − S∪ x − x ∆
σ
σ
. P3. Encontre max[ ij] S x j i i o = ∆ ∆∈ . (i) Se ∆ioj ≤0, marque xj como “testado” e volte para o passo 2. (ii) Se ∆i j>0
o , faça S←S∪{xj}−{xi}, marque xi como “testado” e volte para o passo 2.
P4. Repita os passos 2 e 3 até que todos os vértices em X −S tenham sido marcados como “testados” (este procedimento é denominado ciclo). Se durante o último ciclo nenhuma substituição de vértices foi realizada (passo 3.ii), vá ao passo 5. Em caso contrário, se alguma substituição foi realizada em 3.ii, marque todos os vértices
S
xj∉ como “não-testados” e volte ao passo 2.
P5. Pare. O conjunto S é uma solução aproximada para o problema das p-medianas. Para exemplificar, na figura 06 encontra-se um problema de p-medianas, com 200 vértices e 10 medianas, onde a distância entre vértices é calculada pela métrica euclidiana.