Analisi di sensibilità in PuLP

Introduzione all'ottimizzazione in Python

Jasmin Ludolf

Content Developer

Analisi di sensibilità nella programmazione lineare

  • Analisi di sensibilità: cambia un parametro e osserva l’effetto sull’output
  • Programmazione lineare: di quanto varia l’obiettivo
  • Tre approcci:
    1. Cambia un coefficiente nell’obiettivo
    2. Cambia un coefficiente in un vincolo
    3. Cambia il termine noto di un vincolo
  • Risolvi modello originale e modificato
  • Usa PuLP!

Indicatore a quadrante con settore verde a sinistra per rappresentare la sensibilità

Introduzione all'ottimizzazione in Python

Definizioni

  • Vincolo:
    • Vale in uguaglianza: attivo, vincolante
    • Vale in stretta disuguaglianza: non attivo, non vincolante, slack (agg.)
  • Slack (sost.):
    • Quantità da aggiungere al lato sinistro del vincolo per renderlo vincolante
  • Prezzo ombra:
    • Aumento marginale dell’obiettivo rispetto al lato destro del vincolo
Introduzione all'ottimizzazione in Python

Il problema della dieta in PuLP

Cibo Costo ($/lb) Proteine (%) Grassi (%)
mais 0,11 10 2,5
soia 0,28 40 1

 

  • Requisiti: almeno 17% proteine, 2% grassi, 7 lb di cibo
  • Obiettivo: $0.11C + 0.28S$
  • Proteine: $10C+40S \geq 17(C+S)$
  • Grassi: $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()
Introduzione all'ottimizzazione in Python

Slack e prezzo ombra in 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: Optimal
Protein: slack = -0.00, shadow price = 0.01

Fat: slack = -1.05, shadow price = 0.00
Weight: slack = -0.00, shadow price = 0.15
Introduzione all'ottimizzazione in Python

Passiamo alla pratica !

Introduzione all'ottimizzazione in Python

Preparing Video For Download...