Przydzielanie zasobów
Dobra robota! Czas rozwiązać kolejny problem, który już poznałeś/poznałaś.
Menedżer przydziela 120 zadań do seniora (S), juniora (J) i stażysty (I) – programistów – i chce zminimalizować koszty.
Stażysta wymaga szkolenia kosztującego 500 $ przed przystąpieniem do pracy. Koszt realizacji każdego zadania wynosi c = [30, 40, 5] odpowiednio.
\(x\) oznacza liczbę przydzielonych zadań, a \(o\) to zmienna binarna określająca, czy stażysta odbędzie szkolenie. Całkowity koszt to:
\(TC = 30x_S+40x_J+(5x_I+500)o\)
Użyj metody BigM, aby zlinearyzować ten problem za pomocą nowej zmiennej \(z\):
\(z = (5x_I+500)o\)
\(-oM\leq z \leq oM\)
\(-(1-o)M \leq z- (5x_I+500)o \leq (1-o)M\)
Biblioteka pulp wraz z model, parametrami c, M i names oraz zmiennymi x, z, o zostały już zaimportowane.
To ćwiczenie jest częścią kursu
Wprowadzenie do optymalizacji w Pythonie
Instrukcje do ćwiczenia
- Zdefiniuj funkcję celu, zastępując część formuły zmienną
z. - Zdefiniuj ograniczenia, podając indeks stażysty.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# 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}")