Análise de sensibilidade no PuLP

Introdução à Otimização em Python

Jasmin Ludolf

Content Developer

Análise de sensibilidade em programação linear

  • Análise de sensibilidade altera um parâmetro para ver mudanças na saída/resultado
  • Programação linear: quanto o objetivo muda
  • Três abordagens:
    1. Mudar um coeficiente no objetivo
    2. Mudar um coeficiente em uma restrição
    3. Mudar o termo constante em uma restrição
  • Resolver o modelo original e o alterado
  • Use PuLP!

Ícone de indicador com setor verde à esquerda para representar sensibilidade

Introdução à Otimização em Python

Definições

  • Restrição:
    • Vale com igualdade: ativa, vinculante
    • Vale com desigualdade estrita: inativa, não vinculante, com folga (adj.)
  • Folga (subst.):
    • Quantidade a somar ao lado esquerdo da restrição para torná-la vinculante
  • Preço-sombra:
    • Aumento marginal no objetivo em relação ao lado direito da restrição
Introdução à Otimização em Python

O problema da dieta no PuLP

Food Cost ($/lb) Protein (%) Fat (%)
corn 0.11 10 2.5
soybean 0.28 40 1

 

  • Recomendação: pelo menos 17% de proteína, 2% de gordura, 7 lb de alimento
  • Objetivo: $0.11C + 0.28S$
  • Proteína: $10C+40S \geq 17(C+S)$
  • Gordura: $2.5C + S \geq 2(C+S)$
  • Peso: $C + S \geq 7$
from pulp import *

model = LpProblem('diet', LpMinimize)

C = LpVariable('C', lowBound=0)
S = LpVariable('S', lowBound=0)

model += 0.11*C + 0.28*S

model += 10*C + 40*S >= 17 * (C+S), 'Protein' 
model += 2.5*C + S >= 2 * (C+S), 'Fat'
model += C + S >= 7, 'Weight' 

model.solve()
Introdução à Otimização em Python

Folga e preço-sombra no PuLP

print(f"Status: {LpStatus[model.status]}\n")
for name, c in model.constraints.items():
    print(f"{name}: slack = {c.slack:.2f}, shadow price = {c.pi:.2f}")
Status: Ótimo
Protein: slack = -0.00, shadow price = 0.01

Fat: slack = -1.05, shadow price = 0.00
Weight: slack = -0.00, shadow price = 0.15
Introdução à Otimização em Python

Vamos praticar!

Introdução à Otimização em Python

Preparing Video For Download...