Phân bổ nguồn lực
Làm tốt lắm, giờ đến lúc giải bài toán tiếp theo mà bạn đã được giới thiệu.
Một quản lý cần phân bổ 120 tác vụ cho kỹ sư phần mềm senior (S), junior (J) và intern (I) và muốn tối thiểu hóa chi phí.
Thực tập sinh cần được đào tạo với chi phí $500 trước khi bắt đầu thực hiện các tác vụ. Chi phí để xử lý mỗi tác vụ lần lượt là c = [30, 40, 5].
\(x\) là số tác vụ được giao và \(o\) là biến nhị phân thể hiện việc thực tập sinh có được đào tạo hay không. Tổng chi phí là
\(TC = 30x_S+40x_J+(5x_I+500)o\)
Hãy dùng phương pháp BigM để tuyến tính hóa bài toán này bằng biến mới \(z\):
\(z = (5x_I+500)o\)
\(-oM\leq z \leq oM\)
\(-(1-o)M \leq z- (5x_I+500)o \leq (1-o)M\)
pulp cùng với một model, các tham số c, M, và names, và các biến x, z, o đã được nhập sẵn cho bạn.
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ác định hàm mục tiêu bằng cách thay một phần công thức bằng
z. - Xác định các ràng buộc, điền đúng chỉ số của thực tập sinh.
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 += c[0]*x[0] + c[1]*x[1] + ____
# Define the constraints
model += -o * M <= z
model += z <= o * M
model += -(1-o) * M <= z - (c[___]*x[____] + 500)
model += z - (c[____]*x[____] + 500) <= (1-o) * M
model += lpSum(x) >= 120
status = model.solve()
print(f"{'Optimal found' if status == 1 else 'Ignore solution'}")
for i in range(len(c)):
print(f"{names[i]} was assigned {x[i].varValue:.0f}")