Розв'язання задачі інвестування капіталу
Згадайте задачу інвестування капіталу.
Ваш менеджер формує стратегію компанії та розглядає проєкти \(A\), \(B\), \(C\), причому \(A\) є передумовою для \(B\). Прибутки відповідно: \(V = [250, 200, 300]\), потрібні інвестиції: I = [2000, 1900, 2500], і доступно лише $4600. Змінна \(o\) — бінарна, показує, чи обрано проєкт.
Ваш менеджер сформулював задачу:
\(\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\)
Ваше завдання — лінеаризувати та розв'язати задачу максимізації прибутку.
Ми вже імпортували pulp і створили model з параметрами V, I, names для назв проєктів (A, B, C та AB — саме в такому порядку індексації) і o, що представляє бінарні рішення з тим самим індексуванням.
Ця вправа є частиною курсу
Вступ до оптимізації в Python
Інструкції до вправи
- Визначте лінеаризовану цільову функцію, доповнивши частини для проєктів B і C з урахуванням передумов для B.
- Задайте обмеження з використанням оновленої змінної AB.
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
# 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)}')