PuLP의 민감도 분석

Python으로 배우는 Optimization 입문

Jasmin Ludolf

Content Developer

선형계획의 민감도 분석

  • 민감도 분석: 한 매개변수를 바꿔 결과의 변화를 확인
  • 선형계획: 목적함수가 얼마나 변하는지
  • 세 가지 접근:
    1. 목적함수 계수 변경
    2. 제약식 계수 변경
    3. 제약식의 상수항 변경
  • 원래 모델과 변경 모델 모두 풀기
  • PuLP 사용!

민감도를 나타내는 좌측 녹색 구간이 있는 게이지 아이콘

Python으로 배우는 Optimization 입문

정의

  • 제약식:
    • 등식으로 성립: 활성, 바인딩
    • 엄격한 부등식으로 성립: 비활성, 비바인딩, 슬랙(형용사)
  • 슬랙(명사):
    • 바인딩이 되도록 제약식 좌변에 더해야 할 양
  • 그림자 가격:
    • 제약식 우변에 대한 목적함수의 한계 증가량
Python으로 배우는 Optimization 입문

PuLP로 푸는 식단 문제

식품 비용 ($/lb) 단백질 (%) 지방 (%)
옥수수 0.11 10 2.5
대두 0.28 40 1

 

  • 권장사항: 단백질 최소 17%, 지방 2%, 총 7lb
  • 목적함수: $0.11C + 0.28S$
  • 단백질: $10C+40S \geq 17(C+S)$
  • 지방: $2.5C + S \geq 2(C+S)$
  • 중량: $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()
Python으로 배우는 Optimization 입문

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
Python으로 배우는 Optimization 입문

연습해 봅시다!

Python으로 배우는 Optimization 입문

Preparing Video For Download...