НачатьНачать бесплатно

Распределение ресурсов

Отличная работа! Пришло время решить следующую задачу.

Менеджер распределяет 120 задач между старшим (S), младшим (J) и стажёром (I) в команде разработчиков и хочет минимизировать затраты.

Стажёру требуется обучение стоимостью $500 до начала работы над задачами. Стоимость выполнения каждой задачи равна c = [30, 40, 5] соответственно.

\(x\) — количество назначенных задач, \(o\) — бинарная переменная, указывающая, проходит ли стажёр обучение. Общие затраты:

\(TC = 30x_S+40x_J+(5x_I+500)o\)

Применив метод BigM, линеаризуйте задачу с помощью новой переменной \(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, модель model, параметры c, M и names, а также переменные x, z, o уже импортированы.

Это упражнение является частью курса

Введение в оптимизацию на Python

Посмотреть курс

Инструкции к упражнению

  • Определите целевую функцию, заменив часть формулы на z.
  • Задайте ограничения, указав индекс стажёра.

Интерактивное практическое упражнение

Попробуйте выполнить это упражнение, дополнив этот пример кода.

# 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}")
Редактировать и запускать код