PES Pesquisa Operacional

Prof. Milton Procópio de Borba

Originais do Prof. Fernando Deeke Sasse

6. Análise de Sensitividade e Dualidade

6.1 Mudanças nas restrições e preços duais

Voltemos ao problema da fábrica de brinquedos, ou seja

max z = 30*x[1]+40*x[2] ,

x[1] <= 90 , x[2] <= 60 ( limites de capacidade de produção de cada departamento)

5*x[1]+6*x[2] <= 600 ( limite das peças especiais)

Sabemos da solução do problema original que é ótimo produzir x[1]= 48 carros de brinquedo e x[2]= 60 trens de brinquedo, resultando num lucro diário de z = $3840. Com esta solução a capacidade do departamento de trens é utilizada completamente. Queremos saber agora se é desejável adquirir recursos adicionais e aumentar a capacidade de produção do departamento de trens.

Vamos supor que a capacidade de produção de trens é aumentada por 10 unidades, para 70. 

Temos então o novo problema

max z = 30*x[1]+40*x[2] ,

x[1] <= 90 , x[2] <= 70

5*x[1]+6*x[2] <= 600

> restart:

> with(simplex):

Warning, the protected names maximize and minimize have been redefined and unprotected

> Rest:=[ x1 <= 90, x2 <= 70,5*x1+6*x2 <= 600, x1>=0,x2>=0];

Rest := [x1 <= 90, x2 <= 70, 5*x1+6*x2 <= 600, 0 <=...

> z:=30*x1+40*x2;

z := 30*x1+40*x2

> sol:=maximize(z,Rest);

sol := {x1 = 36, x2 = 70}

> assign(sol);

> z;

3880

>

Portanto, com uma capacidade extra de 10 unidades no departamento de trens, é agora ótimo produzir 36 carros, 70 trens, com um lucro diário z = $3880. Portanto, o máximo lucro aumentou em $40. Isso implica que o aumento marginal no lucro para um aumento unitário na capacidade do departamento de trens é $40/10 = $4. Este valor é denominado preço dual da capacidade de produção do departamento. Se o custo marginal do aumento da capacidade neste departamento é menor do que o benefício marginal de $4, então a gerência deveria aumentar a capacidade, pois o benefício líquido é positivo.

Para pequenos aumentos na capacidade disponível do departamento de trens, observamos que o preço dual é $4. Não devemos esperar que este resultado aplique-se independentemente do aumento de capacidade. Vamos examinar aumentos de capacidade em intervalos de 10 unidades e observar o lucro:

Capacidade 

x[1]

x[2]

z ($)

60

48

60

3840

70

36

70

3880

80

24

80

3920

90

12

90

3960

100

100

4000

110

100

4000

Podemos observar que se, por exemplo, a nova capacidade é 110 , a solução ótima é x[1] = 0 , x[2] = 100 e z = $4000. Portanto, para um aumento de 50 unidades na capacidade, o lucro máximo aumenta em $4000 - $3840 = $160, implicando que o benefício marginal por unidade é agora $160/50 = $3.20. É fácil explicar tal comportamento observando a solução gráfica, que mostra que para uma capacidade de produção de trens acima de 100, a restrição das partes especiais as torna redundantes. Neste caso é imediato que para manter o preço dual em $4.00, devemos utilizar uma capacidade de produção de trens de no máximo 100 unidades. Vamos apresentar o tratamento a ser utilizado no caso geral, e determinar o intervalo na capacidade de modo a manter o preço dual em $4.00.

Do método manual sabemos que a solução ótima para o problema original é obtida pela relação x[B] = B^(-1)*b , onde B = [a[1], a[2], a[3]] . Vamos estabelecer as possíveis variações na capacidade de produção, alterando b e examinando as possíveis variações na capacidade de produção de trens.

> restart;

> with(linalg):

Warning, the protected names norm and trace have been redefined and unprotected

> sistema:=[x[1]+x[3]=90,x[2]+x[4]=60+Delta[2],5*x[1]+6*x[2]+x[5]=600];

sistema := [x[1]+x[3] = 90, x[2]+x[4] = 60+Delta[2]...

> A:=genmatrix(sistema,[x[1],x[2],x[3],x[4],x[5]],b):

> evalm(b);

vector([90, 60+Delta[2], 600])

> for j to 5 do a[j]:=col(A,j) od;

a[1] := vector([1, 0, 5])

a[2] := vector([0, 1, 6])

a[3] := vector([1, 0, 0])

a[4] := vector([0, 1, 0])

a[5] := vector([0, 0, 1])

> B:=augment(a[1],a[2],a[3]);

B := matrix([[1, 0, 1], [0, 1, 0], [5, 6, 0]])

> xB:=evalm(B^(-1)&*b);

xB := vector([48-6/5*Delta[2], 60+Delta[2], 42+6/5*...

> solve({seq(xB[i]>=0,i=1..3)});

{Delta[2] <= 40, -35 <= Delta[2]}

Obviamente, a solução Delta[2] = 40 é a que otimiza o lucro.

Exercício 6.1  
Determine o intervalo de possível variação da capacidade de fornecimento de peças especiais, assim como o respectivo preço dual.

6.2 Mudanças nos coeficientes da função objetivo

O segundo problema em análise de sensitividade está relacionado com os efeitos das mudanças na solução decorrentes de variações nos coeficientes da função objetivo. Por exemplo, vamos supor que, devido a economias de custo no departamento de carros de brinquedo, o lucro por unidade passa de $30 a $35. Em que isso muda a solução original? Resolvendo o problema novamente verificamos que a solução ótima muda de vértice:

x[1] = 90 , x[2] = 25 e z = $4150. Portanto, para este aumento de $5 no lucro unitário c[1] , a solução ótima se modifica.Por outro lado, se o aumento em c[1] for muito pequeno, digamos, $2, a solução ótima ainda mudará ? De modo mais geral, para qual intervalo de valores c[1] (intervalo de optimalidade) a solução ótima permanecerá inalterada ?

Vamos supor que o lucro de cada carro é 30+theta[1] , onde theta[1] é a quantidade que mede a variação do lucro por unidade. Portanto, o vetor de preço agora torna-se

c[B] = (30 + theta[1] , 40,0,0,0) .

Esta mudança em c[B] afeta os valores de z[j] = c[B]*B^(-1)*a[j] , e portanto os valores de c[j]-z[j] no algoritmo simplex. Para que a solução ótima permaneça inalterada, devemos ter c[j]-z[j] < 0 (para que processo termine no mesmo ponto). Vamos resolver este problema no Maple:

> restart:

> with(linalg):

Warning, the protected names norm and trace have been redefined and unprotected

> sistema:=[x[1]+x[3]=90,x[2]+x[4]=60,5*x[1]+6*x[2]+x[5]=600];

sistema := [x[1]+x[3] = 90, x[2]+x[4] = 60, 5*x[1]+...

> A:=genmatrix(sistema,[x[1],x[2],x[3],x[4],x[5]],b):

> c:=vector(5,[30+theta[1],40,0,0,0]);

c := vector([30+theta[1], 40, 0, 0, 0])

> for j to 5 do a[j]:=col(A,j) od;

a[1] := vector([1, 0, 5])

a[2] := vector([0, 1, 6])

a[3] := vector([1, 0, 0])

a[4] := vector([0, 1, 0])

a[5] := vector([0, 0, 1])

> B:=augment(a[1],a[2],a[3]);

B := matrix([[1, 0, 1], [0, 1, 0], [5, 6, 0]])

> xB:=evalm(B^(-1)&*b);

xB := vector([48, 60, 42])

> cB:=[30+theta[1],40,0];

cB := [30+theta[1], 40, 0]

> for j to 5 do

> y[j]:=evalm(B^(-1)&*a[j]);

> z[j]:=evalm(cB&*y[j]);

> od;

y[1] := vector([1, 0, 0])

z[1] := 30+theta[1]

y[2] := vector([0, 1, 0])

z[2] := 40

y[3] := vector([0, 0, 1])

z[3] := 0

y[4] := vector([-6/5, 1, 6/5])

z[4] := 4-6/5*theta[1]

y[5] := vector([1/5, 0, -1/5])

z[5] := 6+1/5*theta[1]

> ineg:={seq(c[j]-z[j]<=0,j=1..5)};

ineg := {0 <= 0, -4+6/5*theta[1] <= 0, -6-1/5*theta...

> solve(ineg);

{-30 <= theta[1], theta[1] <= 10/3}

Portanto, alterações no lucro por unidade de carros em até 3.33 não alteram a optimalidade do problema.

Exercício 6.2  
Determine o máximo aumento possível no lucro por unidade de trens.

Exercício 6.3  
Faça análises similares (alterar restrições e coeficientes da função objetivo)
para o problema das duas minas.