Você está na página 1de 20

Lista 1 de Programação Inteira

Flávio K. Miyazawa

2022-09-27

1. Exercícios de Fluxos e Programação Linear


1. Considere o problema de cobertura por vértices com pesos nos vértices. Resolva este problema
por duas abordagens diferentes quando o grafo G é bipartido:

• Reduza o problema para o problema de fluxo máximo/corte mínimo. Sugestão: Suponha que a
partição dos vértices seja dada pelos conjuntos X e Y . Acrescente dois vértices s e t e coloque
arcos de s para X com pesos dados pelo vértice em X. Oriente as arestas de X para Y colocando
peso infinito nos arcos. Coloque arcos de Y para t, colocando o peso nos arcos igual ao dos
vértices de Y. Mostre a relação do corte mínimo com cobertura mínima.

Para a formulação sugerida, qualquer caminho de s a t terá exatamente 3 arestas, e terá a


forma s->x->y->t. Qualquer corte que separe s de t deverá passar por uma quantidade
ímpar dessas 3 arestas (1 ou 3), em alguma direção. Qualquer corte que inclua uma aresta
x->y na direção do fluxo gerará um corte de peso infinito; os cortes que isolam s ou t tem
peso finito e não incluem nenhuma aresta x->y, e portanto nenhum corte que passe por
uma aresta x->y na direção do fluxo é mínimo.

Um caminho que seja cortado apenas uma vez, em x->y, na direção reversa ao fluxo, é
impossível.

Qualquer corte mínimo C, portanto, passa por pelo menos uma das arestas (s,x) e (y,t),
para todo caminho de s a t. Como toda aresta do grafo original está em um desses
caminhos, pode-se dizer que 𝐶' = {𝑥 ∈ 𝑋 : (𝑠, 𝑥) ∈ 𝐶 } ∪ {𝑦 ∈ 𝑌: (𝑦, 𝑡) ∈ 𝐶 } é uma
cobertura do grafo original. Arestas x->y que estiverem no corte são direcionadas na
direção reversa do fluxo e não interferem no peso do corte. Portanto, o algoritmo do fluxo
máximo / corte mínimo garante que a cobertura equivalente também é mínima.
• Formule o problema como programação linear inteira e relaxe as variáveis. Mostre que o
poliedro associado é inteiro.

𝑚𝑖𝑛𝑖𝑚𝑖𝑧𝑒 ∑ 𝑝𝑣𝑤𝑣 , 𝑝𝑖 ∈ {0, 1} ∀𝑖 ∈ 𝑉


𝑣∈𝑉
s.a.

𝑥𝑣,𝑒 = 1 if e incides on v,
0 otherwise

∑ 𝑝𝑣𝑥𝑣,𝑒 ≥ 1 ∀𝑒 ∈ 𝐸
𝑣∈𝑉

A matriz das restrições é 𝑋𝑝 ≥ 1, e 1 é um vetor inteiro. X é TU, pois é a matriz de


incidência de um grafo bipartido (pag. 34). Portanto, o poliedro {𝑝 : 𝑋𝑝 ≥ 1} é
inteiro (pag. 32).
2. Considere o problema do item anterior. Mostre que também é possível aplicar as mesmas
ideias para resolver o problema do conjunto independente em grafos bipartidos.

O conjunto independente máximo é o complemento da cobertura mínima. (Skiena 1990, p


218). Basta resolver o problema da cobertura por vértices, com todos os pesos = 1, como em (1).
Como a cobertura é mínima, o seu complemento é máximo.

i.
𝑚𝑎𝑥 ∆(𝑠)
s.a. 0 ≤ 𝑥𝑒 ≤ 𝑐𝑒

∆(𝑣) = 0 ∀ 𝑣 ∈ 𝑉 / {𝑠, 𝑡}

ii. Para cada arco não-orientado, transforme-o em dois arcos orientados entre os mesmos
vértices, com a mesma capacidade, mas em sentidos opostos. Aplique o mesmo algoritmo
que em (i). Alternativamente: fixe a direção arbitrariamente (por exemplo, do nó de menor
índice ao nó de maior índice), mas permita fluxo negativo:− 𝑐𝑒 ≤ 𝑥𝑒 ≤ 𝑐𝑒.

iii. seja f(i) a fonte do arco i e s(i) o sorvedouro do arco i, x fixo. Resolva o PLI:
𝑚𝑖𝑛 ∑ 𝑥𝑎𝑦𝑎
𝑎 ∈𝑉
s.a. 0 ≤ 𝑦𝑎 ≤ 1 ∀ 𝑎 ∈ 𝐴 𝑦𝑎 = 1 ⇔ 𝑎 está no corte
0 ≤ 𝑧𝑣 ≤ 1 ∀ 𝑣 ∈ 𝑉 𝑧𝑣 = 1 ⇔ 𝑣 está em K
𝑧𝑣 − 𝑧𝑢 − 𝑦(𝑣,𝑢) = 0 ∀ (𝑣, 𝑢) ∈ 𝐴

Seja 𝐶(𝐾) o custo do tipo de carne 𝐾 por quilo, 𝑋(𝐾) a variável da quantidade e
𝑀 = {𝐴𝐵 : (𝐴, 𝐵) ∈ {𝐻, 𝐵, 𝐹} × {𝐹, 𝐷, 𝑁}} (cada variedade de carne e processamento).

𝑚𝑎𝑥 ∑ 𝑋(𝐾) 𝐶(𝐾)


𝐾∈𝑀

s.a. 𝐻𝐹 + 𝐻𝐷 + 𝐻𝑁 = 480
𝐵𝐹 + 𝐵𝐷 + 𝐵𝑁 = 400
𝑃𝐹 + 𝑃𝐷 + 𝑃𝑁 = 230
𝐻𝐷 + 𝐵𝐷 + 𝑃𝐷 ≤ 420
𝐻𝑁 + 𝐵𝑁 + 𝑃𝑁 ≤ 250
𝐾 ≥ 0∀𝐾 ∈ 𝑀
Queremos provar que 𝑧 ∈ 𝑐𝑜𝑛𝑣(𝑆). Sejam 𝐼 = {𝑖1, 𝑖2,..., 𝑖𝑛} os vértices de 𝑐𝑜𝑛𝑣(𝑆).
𝑛 𝑛
𝑑
𝐼: 𝑎 ∈ 𝑐𝑜𝑛𝑣(𝑆) ⇔ ∃(𝑏1,..., 𝑏𝑛) : 𝑎 = ∑ 𝑏𝑖𝑖𝑖 , ∑ 𝑏𝑖 = 1, 𝑎 ∈ 𝑅 , 𝑏 ∈ 𝑅+ .
𝑖=1 𝑖=1
𝐼𝐼: 𝑧 ∈ 𝑐𝑜𝑛𝑣(𝑥, 𝑦) ⇔ ∃𝑡 : 𝑧 = 𝑡𝑥 + (1 − 𝑡)𝑦, 𝑡 ∈ [0, 1].

Expandindo I em II:

𝑛 𝑛 𝑛
𝑧 = ∑ 𝑡𝑏𝑖𝑖𝑖 + (1 − 𝑡)𝑐𝑖𝑖𝑖 = ∑ (𝑡(𝑏𝑖 − 𝑐𝑖) + 𝑐𝑖 )𝑖𝑖 = ∑ 𝑑𝑖𝑖𝑖
𝑖=1 𝑖=1 ,𝑖=1
𝑛
Se ∑ 𝑑𝑖 = 1, 𝑧 se conforma a I.
𝑖=1

𝑛 𝑛 𝑛 𝑛
∑ 𝑑𝑖 = 𝑡 ∑ 𝑏𝑖 + ∑ 𝑐𝑖 − 𝑡 ∑ 𝑐𝑖 = 𝑡(1) + 1 − 𝑡(1) = 1. //
𝑖=1 𝑖=1 𝑖=1 𝑖=1

Indução.

Base: uma matriz coluna nx1 onde todos os elementos pertencem a {-1,0,1} é TU,
pois todas suas submatrizes quadradas são 1x1 com determinante em
{-1,0,1}.
Hipótese: A propriedade do enunciado vale para matriz de tamanho nxk', k' < k.
Passo: Pela hipótese, todas as submatrizes quadradas são TU. Vamos adicionar uma
coluna c com no máximo um 1, no máximo um -1 e o restante 0.
Todas as novas submatrizes quadradas A' incluem um subvetor c' de c.
Para cada nova submatriz:
(i) se alguma coluna = 0, |A'| = 0.
(ii) se A' contém alguma coluna com exatamente 1 elemento 𝑎 ∈ {− 1, 1},
aplicar Laplace nessa coluna. 0s zeros cancelam o valor de |Ai,j | e o
𝑖+𝑗 𝑖,𝑗
determinante será |𝐴'| = 𝑎(− 1) |𝐴 | ∈ {− 1, 0, 1}.
(iii) se todas as colunas contém 1 e -1, a soma de suas linhas vale zero e o
determinante é 0.
A possui colunas no formato da questão (a). Transformando alguns elementos não nulos
em 0, as sub-matrizes quadradas afetadas vão do caso (iii) da indução para o caso (ii), ou do
caso (ii) para o caso (i), e portanto ainda tem determinantes -1, 0 ou 1.

Seja a restrição seguinte, que preserva o fluxo em cada vértice:

∑ − 𝑥𝑎 + ∑ 𝑥𝑎 = 0 ∀𝑛 ∈ 𝑁
+ −
𝑎∈δ (𝑛) 𝑎∈δ (𝑛)

A matriz formada pela restrição acima contém colunas com exatamente uma ocorrência de 1 e
uma de -1, sendo assim TU. Pelo mesmo argumento de (b), podemos zerar alguns elementos
nã0-nulos e manter a unimodularidade.
Na linha de S, zeramos os valores relacionados aos arcos que entram em S, e fazemos os que
saem de S somar a 1.
Na linha de T, zeramos os valores relacionados aos arcos que saem de T, e fazemos os que entram
somarem a 1.
Adicionamos uma matriz identidade para zerar os arcos que entram em S e saem de T.
Removemos as linhas restantes.
A matriz ainda é unimodular, e, como a única fonte e sorvedouro são S e T, os únicos caminhos
possíveis são caminhos de S a T.

(problema: como impedir ciclos disjuntos?)

Um algoritmo guloso:
Ordene os subconjuntos por lucro individual. (bj - soma dos custos dos integrantes). O(m*n + m
log m)
Enquanto houver lucro positivo: O(m) times
adicione o conjunto à solução O(n)
desconte os custos dos subconjuntos que tiverem itens em comum. O(m*n)
Reordene. O(m log m)

Total: O(m^2 log m + m * n)

𝑚 𝑛
𝑚𝑎𝑥 ∑ 𝑦𝑗𝑏𝑗 − ∑ 𝑥𝑖𝑐𝑖
𝑗=1 𝑖=1

s.a.

|𝑆𝑗|

∑ 𝑥𝑖 − |𝑆𝑗|𝑦𝑗 + 1 = 1
𝑖∈𝑆𝑗

|𝑁|
𝑚𝑎𝑥 ∑ 𝑥𝑖𝑤𝑖
𝑖=1
s.a.
𝑥𝑖 − 𝑥𝑗 ≤ 0 ∀ (𝑖, 𝑗) ∈ 𝐴 Se há uma aresta de i para j, ou ambos estão dentro
do conjunto fechado, ou ambos estão fora, ou j está
fora e i está dentro.

Aparecem apenas dois valores não-zero em cada linha -> TU.

Atribuir capacidade 1 para todas as arestas, executar st-path. o fluxo máximo é o número de
caminhos disjuntos (que não compartilham aresta). A matriz de incidência é TU (grafo
direcionado), PLI polinomial
Mesma formulação de (a): se há K caminhos disjuntos, precisamos remover pelo menos 1 aresta
de cada. Se não utilizar caminhos residuais, usar BFS a partir de s, não atravessar arestas
saturadas, o corte equivale ao caminho.

Abrir arestas:
w w
a —------- b => a —------> b
←—-----
w

Formulação de (a).

Juntando (c) e (b), mas quando remover uma aresta, remover também seu par criado em (c).

𝑚𝑖𝑛 ∑ 𝑥𝑒𝑐𝑒
𝑐∈𝐸

∑ 𝑥𝑒 − ∑ 𝑥𝑒 = 1 if v = s,
+ −
𝑒∈δ (𝑣) 𝑒∈δ (𝑣)
-1 if v = t,
0 otherwise
𝑥𝑒 ∈ [0, 1].
𝑚𝑖𝑛 ∑ 𝑥𝑒𝑐𝑒
𝑒∈𝐸

s.a. ∑ 𝑥𝑒 − ∑ 𝑥𝑒 = k if v = s,
+ −
𝑒∈δ (𝑣) 𝑒∈δ (𝑣)
-k if v = t,
0 otherwise
𝑥𝑒 ∈ [0, 1]

Mesmos algoritmos, abrindo os vértices, e adicionando a restrição de que apenas um dos


pares pode ser usado (x_a + x_b <= 1)

transforme cada vértice em dois:


\ / \ 1 /
- A - ⇒ - A1 —--- B1 -
/ \ / \

Dessa forma, apenas um caminho pode usar cada vértice.

Mesma solução do 7d, colocar a capacidade do novo arco como ci

vide (1). Ford Fulkerson é polinomial para grafos orientados


Capacidade 1 nos nós s->x e y->t
fluxo máximo. cap(s->n) = dj, cap(n->m) = 1, cap(m->t) = mi

𝑚𝑎𝑥 ∑ 𝑝𝑖𝑗𝑥𝑖,𝑗

fluxo máximo, s->a = ai, b->t = bi, a->b = xij/inf, max xij*cij
sum ai - sum bi = 0

fluxo máximo, s->a = ai, b->t = bi, a->b = xij/uij, min xij*cij
sum ai - sum bi = 0

fluxo máximo, s->a = ai, b->t = bi, a->b = xij/uij, min xij*cij
adicionar novo consumidor com arestas infinitas e custo zero
sum ai - sum bi = 0

fluxo maximo, cap(s->a) = ba, cap(b->t) = bb, cap(a->b) = 1

cobertura por vertices =


min sum yi
s.a.
yi + yj >= 1 for all (i, j) in E
0 <= yi <= 1

1 . . . 1 . . . . . … (2 por linha)
1 . 1 . . . . . . .
. . 1 . . . 1 . . .

emparelhamento (dual):
max sum (i, j in e) xe
sum (e in delta(v)) <= 1 for all v in V
o <= xe <= 1

1 . . 1 . . . . 1 . … (2 por coluna)
1 . . . . 1 . . . .
. . . . . 1 . . 1 .
. . . 1 . . . . . .

ambas sao TU -> dualidade forte

conjunto independente: nenhum vertice conectado = nenhuma aresta com as duas


extremidades no conjunto
max sum (v in V) wv xv

s.a.

xi + xj <= 1 for all i, j in E -> 2 per line -> TU


xv in {0,1}

1. min sum(v in V) wv xv
s.a.
xi + xj >= 1 for all i, j in E -> 2 per line -> TU
xv in {0,1}

2. O complemento da cobertura por vértices é um conjunto independente. Uma cobertura


mínima implica num conjunto independente máximo, já que a soma dos pesos é o peso
do grafo completo.

min sum (e in E) we xe
s.a.
sum (for e in delta (v)) >= 1 for all v in V -> 2 per column (one in A, one in B) -> TU
xe in {0,1}
max sum (ij in nxm) pij * xij

s.a.

sum (i in m) pim = 1 for all j in n; // cada candidato so pode se matricular em 1


sum (j in n) pnj <= vi for all i in m; // cada universidade so tem vi vagas
pij in [0,1]
cada pij só aparece em 2 linhas -> TU
tu * x = b, b in Z -> poliedro é inteiro, solução por programação linear é inteira,
pode ser resolvido com algoritmo polinomial

fluxo maximo: cap(s->n) = pi , cap(n->m) = inf, cap (m->n) = kj


min sum (ij in E) xij * cij
grafo direcionado -> TU
b inteiro
poliedro inteiro
prog linear polinomial

Variante 1:
separar camarotes em m*|D|camarote-dias.
fluxo: cap(s->p) = di, cap(p->cd) = xijk of 1, cap (cd->t) = dj
max (ijk in E) xijk
grafo direcionado -> TU
Variante 2:
separar pessoas em pessoas*dia.
fluxo: cap(s->pd) = 1, cap(pd->cd) = xijk of 1, cap(cd->t)=dj
max (ijk in E) xijk
grafo direcionado -> TU
http://thejavamathematician.blogspot.com/2015/02/the-n-queens-puzzle-and-0-1-integer.html
Versión melhorada:
(http://math.ucdenver.edu/~sborgwardt/wiki/index.php/An_Integer_Linear_Programming_Approa
ch_to_Graph_Coloring)

Você também pode gostar