Giải bài toán phân bổ vốn đầu tư
Nhắc lại bài toán phân bổ vốn đầu tư.
Quản lý của bạn xây dựng chiến lược cho công ty và cân nhắc các dự án \(A\), \(B\), \(C\), trong đó \(A\) là điều kiện tiên quyết cho \(B\). Lợi nhuận lần lượt là \(V = [250, 200, 300]\), vốn đầu tư yêu cầu là I = [2000, 1900, 2500] và chỉ có $4600 khả dụng. \(o\) là biến nhị phân cho biết dự án có được chọn hay không.
Quản lý đưa cho bạn bài toán:
\(\max\ \ o_AV_A + o_{AB}V_B + o_CV_C\) \(s.t.\ o_AI_A + o_{AB}I_B + o_CI_C\leq 4600\)
Nhiệm vụ của bạn là tuyến tính hóa và giải bài toán tối đa hóa lợi nhuận.
Chúng tôi đã nhập pulp và định nghĩa một model với các tham số V, I, names cho tên dự án (A, B, C và AB theo đúng thứ tự chỉ mục đó), và o đại diện cho quyết định nhị phân dùng cùng cách đánh chỉ mục.
Bài tập này là một phần của khóa học
Nhập môn Tối ưu hóa với Python
Hướng dẫn bài tập
- Xây dựng hàm mục tiêu đã tuyến tính hóa bằng cách điền phần cho dự án B và C, có xét đến điều kiện tiên quyết của B.
- Thiết lập các ràng buộc sử dụng biến AB đã cập nhật.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
# Define the objective
model += o[0]*V[0] + ____*V[1] + ____*V[2]
# Define the constraints
model += o[0]*I[0] + ____*I[1] + o[2]*I[2] <= 4600, 'budget constraint'
model += o[____] <= o[0]
model += o[____] <= o[1]
model += o[____] >= o[0] + o[1] - 1
status = model.solve()
print(f"{'Optimal found' if status == 1 else 'Ignore solution'}")
for i, name in enumerate(names):
print(f"{name}: {'accepted' if o[i].varValue == 1 else 'rejected'}")
print(f'Total profit = ${value(model.objective)}')