Phân tích độ nhạy trong PuLP

Nhập môn Tối ưu hóa với Python

Jasmin Ludolf

Content Developer

Phân tích độ nhạy trong quy hoạch tuyến tính

  • Phân tích độ nhạy: thay đổi một tham số để xem kết quả thay đổi ra sao
  • Quy hoạch tuyến tính: mục tiêu thay đổi bao nhiêu
  • Ba cách:
    1. Đổi hệ số trong hàm mục tiêu
    2. Đổi hệ số trong ràng buộc
    3. Đổi hằng số vế phải của ràng buộc
  • Giải mô hình gốc và mô hình đã đổi
  • Dùng PuLP!

Biểu tượng đồng hồ đo có vùng xanh bên trái biểu thị độ nhạy

Nhập môn Tối ưu hóa với Python

Định nghĩa

  • Ràng buộc:
    • Đúng với dấu bằng: hoạt động, ràng buộc chặt
    • Đúng với bất đẳng thức nghiêm: không hoạt động, không chặt, có dư (tính từ)
  • Độ dư (slack) (danh từ):
    • Lượng cần cộng vào vế trái để ràng buộc trở nên chặt
  • Giá bóng (shadow price):
    • Mức tăng biên của mục tiêu theo hằng số vế phải của ràng buộc
Nhập môn Tối ưu hóa với Python

Bài toán khẩu phần trong PuLP

Thức ăn Chi phí ($/lb) Protein (%) Mỡ (%)
ngô 0.11 10 2.5
đậu nành 0.28 40 1

 

  • Khuyến nghị: ít nhất 17% protein, 2% mỡ, 7 lb thức ăn
  • Mục tiêu: $0.11C + 0.28S$
  • Protein: $10C+40S \geq 17(C+S)$
  • Mỡ: $2.5C + S \geq 2(C+S)$
  • Khối lượng: $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()
Nhập môn Tối ưu hóa với Python

Độ dư và giá bóng trong 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
Nhập môn Tối ưu hóa với Python

Ayo berlatih!

Nhập môn Tối ưu hóa với Python

Preparing Video For Download...