リソースの割り当て
よくできました。次に、先ほど紹介した問題を解いていきましょう。
マネージャーはシニア (S)、ジュニア (J)、インターン (I) のソフトウェアエンジニアに合計120件のタスクを割り当て、コストを最小化したいと考えています。
インターンはタスクに取り組む前に$500の研修費用が必要です。各タスクの処理コストはそれぞれ c = [30, 40, 5] です。
\(x\) は割り当てたタスク数、\(o\) はインターンが研修を受けるかどうかのバイナリ変数です。総コストは次のとおりです。
\(TC = 30x_S+40x_J+(5x_I+500)o\)
新しい変数 \(z\) を用いて、この問題を Big-M 法で線形化してください。
\(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で学ぶOptimization入門
演習の手順
- 目的関数を、式の一部を
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}")