• Nenhum resultado encontrado

Aplicação a matrizes inteiras

No documento Algoritmos de Programação Linear (páginas 129-135)

Tudo que dissemos até aqui não depende da natureza dos componentes de D. Suponha agora que todos os componentes da matriz dada D são inteiros. Sub- meta D ao algoritmo de Gauss-Jordan-Chio. No início de cada iteração, todos os componentes de E serão determinantes de submatrizes da matriz D; portanto, todos os componentes de G e E serão inteiros (veja figura11.8). Ademais, de acordo com a delimitação11.5, todos os componentes de G e E estarão entre

−ω e + ω ,

onde ω = Q

p Q

q(1 + αpq) e αpq é o valor absoluto de D[p, q]. A delimitação permanece válida se ω for definido pelo produto de somas Q

p(1 + P

qαpq)ou pelo produto de somasQ

q P

pαpq.

É oportuno perguntar se os componentes da matriz E que o algoritmo gera não são muito maiores que o estritamente necessário. A resposta é negativa, ainda que num sentido fraco: os componentes de E admitem, não raro, um divisor comum não-trivial; mas há matrizes D para as quais pelo menos um dos componentes de E — digamos δ — resulta primo.

Quando a matriz dada D é inteira, o algoritmo de Gauss-Jordan-Chio pode ser executado usando somente aritmética inteira. Para isso, basta calcular as expressões que definem a operação de pivotação exatamente na ordem indicada: primeiro a expressão no numerador e depois a divisão por δ, que será exata. (Veja a figura11.9.)

δ3E[4, 4]− δ4E[3, 4]

δ =

5 · 1 + 5 · 15 2

Figura 11.8: Examine o exemplo da figura11.2. Apesar das divi- sões por δ, todos os números permanecem inteiros ao longo das su- cessivas iterações. Por exemplo, durante a terceira iteração ocorre uma pivotação em torno de 3 , 3 e o valor de E0[4, 4] é dado pela

expressão da figura. A expressão tem valor inteiro, ainda que as sub-expressões 5 · 1/2 e 5 · 15/2 tenham valor fracionário.

3 2 1 4 5 6 7 8 9 10 4 3 2 5 6 7 8 9 73 1 5 6 3 4 7 9 8 10 1 2 1 5 4 7 5 10 9 6 2 3 32 6 5 8 9 10 9 2 7 4 8 7 6 9 10 5 2 3 4 5 9 8 7 11 3 2 1 4 5 8 −129574 118845 −13654 6748 1192 955 −7880 35638 −35661 20158 −10816 −2992 −5203 9236 2472 −3186 36 −864 1860 −678 288 53560 −45906 −5780 3584 −208 1874 4436 −9064 15372 −460 −5852 −1244 5848 −3680 41406 −60315 −750 18000 3480 5679 −6000 −45114 61527 450 −10800 −2088 −8475 3600 0 0 50676 0 0 0 0 −89310 7482125 −1237456 0 50676 0 0 0 0 0 116190 −2279561 364492 50676 0 0 0 0 0 0 −10884 −200274 25368 0 0 0 50676 0 0 0 1980 −2839490 532912 0 0 0 0 50676 0 0 26460 1024700 −98920 0 0 0 0 0 50676 0 −111090 −3978015 400560 0 0 0 0 0 0 50676 117330 4033779 −443040

Figura 11.9:Resultado da aplicação do algoritmo de Gauss-Jordan-Chio à ma- triz que aparece no topo da figura. O algoritmo devolve o número 50676 e as matrizes G (meio da figura) e E (parte inferior da figura). O valor da expressão Q

p(1 +

P

Eficiência. O número de dígitos na representação de ω vale, aproximada- mente, log ω. Se adotarmos o produto-de-produtos como definição de ω, tere- mos

log ω =P p

P

qlog(1 + αpq)

e, portanto, o número de dígitos de ω será igual, aproximadamente, ao número total de dígitos de D. Pode-se dizer que ω é uma medida do tamanho da matriz dada D.

Cada operação de pivotação envolve menos que 3(m−1)n multiplicações e divisões e menos que (m−1)n subtrações, onde m é o número de linhas e n o número de colunas de D. Como o número de iterações não passa de m, o número total de operações aritméticas é menor que

4m2n .

Suponhamos que o tempo necessário para executar uma operação aritmética entre dois números inteiros que estejam entre −ω e ω é limitado por log2ω. Então o consumo total de tempo do algoritmo será da ordem de

m2n log2ω

no pior caso. Em suma, o tempo que o algoritmo consome é limitado por uma função polinomial do espaço necessário para descrever a matriz D. Esta delimi- tação polinomial foi originalmente demonstrada por Jack Edmonds [Edm67].

Matrizes totalmente unimodulares. Uma matriz é totalmente unimodu-

lar se o determinante de cada uma de suas submatrizes quadradas vale −1, 0 ou +1 (em particular, o valor de cada componente é −1, 0 ou +1). Matrizes totalmente unimodulares aparecem, naturalmente, em vários problemas de oti- mização combinatória [CCPS98,Sch86,AMO93].

Se o algoritmo de Gauss-Jordan-Chio for aplicado a uma matriz totalmente unimodular D então, de acordo com a propriedade11.2, o número δ será igual a −1 ou +1 em todas as iterações. Portanto, o algoritmo devolverá uma matriz inversível inteira G tal que GD ou −GD é 1-escalonada.

11.6

Conclusão

Ao receber uma matriz inteira D, o algoritmo de Gauss-Jordan-Chio devolve uma matriz inversível inteira G e um número inteiro não-nulo δ tais que

a matriz GD é δ-escalonada.

(É como se o algoritmo produzisse uma matriz escalonada cujos componentes são números racionais, todos com o mesmo denominador δ.) O valor absoluto de cada componente de G e GD (e, em particular, o número δ) será limitado

pelo produto ω de todos os números da forma 1 + α onde α é o valor absoluto de um componente de D.

A quantidade de tempo que o algoritmo consome no pior caso é da ordem de m2n log2ω, onde m é o número de linhas e n o número de colunas de D.

Exercícios

11.1 Use o algoritmo de Gauss-Jordan-Chio para calcular o determinante da matriz abaixo.

1 2 4 8

1 3 9 27

1 4 16 64

1 5 25 125

11.2 Suponha que ω é o produto das somas de colunas de D. Mostre que log ω ≤ n log(nα), onde α = maxqmaxpαpq e n é o número de colunas de D.

11.3 Implemente o algoritmo de Gauss-Jordan-Chio em um computador. Supo- nha que a matriz dada, D, é inteira. Seu programa deve detectar overflow de operações aritméticas ou fazer aritmética inteira com precisão ilimitada.

Algoritmo Simplex-Chio

A operação de pivotação característica do algoritmo de Gauss-Jordan-Chio (veja capítulo11) pode também ser usada no algoritmo Simplex. O resultado dessa combinação será chamado algoritmo Simplex-Chio, por falta de um nome me- lhor.

O algoritmo transforma qualquer matriz D numa matriz equivalente E que é simples a menos de um fator multiplicativo. Cada componente de E é igual ao determinante de alguma submatriz de D; portanto, se cada componente de D é inteiro então os componentes de E também serão inteiros. É possível dar uma boa delimitação superior para o valor absoluto dos componentes de E e assim mostrar que o consumo de tempo de cada iteração é polinomialmente limitado (ainda que o número de iterações possa ser exponencial).

12.1

Algoritmo

Para qualquer número não-nulo δ, diremos que uma matriz E é δ-simples com relação a um par n, m de índices se a matriz

δ−1E

é simples (solúvel, inviável ou ilimitada) com relação a n, m. O algoritmo Simplex-Chio recebe uma matriz arbitrária D e um par n, m de índices e devolve um número não-nulo δ e uma matriz E que é δ-simples com relação a n, m.

Para simplificar a exposição, vamos descrever apenas a heurística Simplex- Chio; essa heurística pode ser convertida num algoritmo pela introdução de um mecanismo de convergência como o que usamos no Simplex Lexicográfico (seção5.3).

Heurística Simplex-Chio Recebe uma matriz D sobre M ×N e elemen- tos n e m de N e M respectivamente; se convergir, devolve matrizes F e G e um número não-nulo δ tais que

F G = δI , G[ , m]= δI[ , m] e GDé δ-simples 124

n 0 0 δ ≥ 0 δ 0 ≥ δ 0 0 ≥ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 m ≥ ≥ ≥ ≥ ≥ ≥ ≥ ≥ ≥ ≥ 0 0 0

Figura 12.1:Matriz δ-simples solúvel.

(solúvel, inviável ou ilimitada) com relação a n, m.

Cada iteração começa com matrizes F , G e E , um número δ, uma parte L de M − me um elemento h de M − L. A primeira iteração começa com F = G = I , h E = D, δ = 1, L = ∅ e com h em M , se possível distinto de m. Cada iteração consiste no seguinte, com f = E[ , n]:

ALTERNATIVAI: h é diferente de m .

CASOI.1: E[h, k] > 0e f[h]≥ 0 ou E[h, k] < 0e f[h]≤ 0 para

algum k em N − n . k

Para cada p em M − m, seja δp o número E[p, k]. δp= E [p, k]

Seja L∗ o conjunto dos índices p em L para os quais δp/δ > 0. CASOI.1A: f[h]/δh≤ f[p]/δp para todo p em L∗.

Seja F0, G0, E0 o resultado da pivotação de F, G, E em torno de h, k. Seja L0 o conjunto L + h.

Escolha h0 em M − L0, se possível distinto de m. Comece nova iteração com F0, G0, E0, δh, L0, h0 nos papéis de F , G, E , δ, L, h.

CASOI.1B: f[h]/δh> f[p]/δp para algum p em L∗. Escolha qualquer p em L∗ tal que f[p]/δp é mínimo.

Seja F0, G0, E0 o resultado da pivotação de F, G, E em torno de p, k. Comece nova iteração com F0, G0, E0 e δp

nos papéis de F , G, E e δ.

CASOI.2: E[h, N −n] ≤ o e f[h]> 0 ou E[h, N −n] ≥ o e f[h]< 0. Devolva F , G, δ e pare.

CASOI.3: E[h, N −n] = oe f[h]= 0. Seja L0 o conjunto L + h.

Escolha h0 em M − L0, se possível distinto de m. Comece nova iteração com L0 e h0 nos papéis de L e h. ALTERNATIVAII: h é igual a m .

CASOII.1: E[h, k]/δ < 0para algum k em N − n . k

Para cada p em M − m, seja δp o número E[p, k]. δp= E [p, k]

Seja L∗ o conjunto dos índices p em L para os quais δp/δ > 0. CASOII.1A: L∗ é vazio .

Devolva F , G, δ e pare. CASOII.1B: L∗ não é vazio .

Escolha qualquer p em L∗ tal que f[p]/δp é mínimo.

Seja F0, G0, E0 o resultado da pivotação de F, G, E em torno de p, k. Comece nova iteração com F0, G0, E0 e δp

nos papéis de F , G, E e δ. CASOII.2: E[h, N −n]/δ ≥ o. Devolva F , G, δ e pare. 2

A operação de pivotação é definida exatamente como no algoritmo de Gauss-Jordan-Chio.

No documento Algoritmos de Programação Linear (páginas 129-135)

Documentos relacionados