开始使用免费开始使用

资源分配

做得很好,接下来来解决您刚刚接触的下一个问题。

一位经理需要将 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、参数 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}")
编辑并运行代码