開始使用免費開始

資源分配

做得好,接著來解你剛剛看到的下一個問題。

一位主管要把 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\)

pulpmodel,參數 cMnames,以及變數 xzo 都已為你匯入。

本練習屬於課程

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}")
編輯並執行程式碼