ПочатиПочніть безкоштовно

Розподіл ресурсів

Чудова робота, час розв'язати наступну задачу, з якою ви вже познайомилися.

Менеджер розподіляє 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}")
Редагувати та запускати код