我在使用scipy.optimize.linear_sum_assignment
将任务(成本)平均分配给员工时遇到了困难,因为每个员工可以分配多个任务。成本矩阵表示每个员工的每个任务的工作量。
我们希望最小化所有工人的总成本,同时平均分配每个工人的成本。
在本例中,我们有3个名为a
、b
和c
的工作人员。每个工作人员总共可以分配4个任务,因此在成本矩阵中,我们有座席a_1
、a_2
等。linear_sum_assignment
给予了总成本最小化的任务,为了简单起见,我们的例子使用了一个成本矩阵,使得任何任务都能给出相同的总成本。
但是,成本并不是平均分配给3个员工。在我们的示例中,3个员工的成本分别为65
、163
和192
。
是否有可能尽可能地最小化成本,同时在3个工人之间更均匀地分配每个工人的成本?
from scipy.optimize import linear_sum_assignment
import numpy as np
worker_capacities = [
"a_1", "a_2", "a_3", "a_4",
"b_1", "b_2", "b_3", "b_4",
"c_1", "c_2", "c_3", "c_4",
]
n_tasks = len(worker_capacities)
c = np.array([
[27, 42, 65, 33, 67, 45, 60, 76, 6, 6, 43, 26],
[27, 42, 65, 33, 67, 45, 60, 76, 6, 6, 43, 26],
[27, 42, 65, 33, 67, 45, 60, 76, 6, 6, 43, 26],
[27, 42, 65, 33, 67, 45, 60, 76, 6, 6, 43, 26],
[27, 42, 65, 33, 67, 45, 60, 76, 6, 6, 43, 26],
[27, 42, 65, 33, 67, 45, 60, 76, 6, 6, 43, 26],
[27, 42, 65, 33, 67, 45, 60, 76, 6, 6, 43, 26],
[27, 42, 65, 33, 67, 45, 60, 76, 6, 6, 43, 26],
[27, 42, 65, 33, 67, 45, 60, 76, 6, 6, 43, 26],
[27, 42, 65, 33, 67, 45, 60, 76, 6, 6, 43, 26],
[27, 42, 65, 33, 67, 45, 60, 76, 6, 6, 43, 26],
])
_, assignments = linear_sum_assignment(c)
print("Costs for worker a:", sum(c[i][j] for i, j in enumerate(assignments[0:4])))
print("Costs for worker b:", sum(c[i+4][j] for i, j in enumerate(assignments[4:8])))
print("Costs for worker c:", sum(c[i+8][j] for i, j in enumerate(assignments[8:12])))
给出输出
Costs for worker a: 65
Costs for worker b: 163
Costs for worker c: 192
1条答案
按热度按时间s3fp2yjn1#
linear_sum_assignment
方法不支持约束或自定义目标,因此我认为这是不可能的。然而,您可以将问题表述为混合整数线性规划问题(MILP),并通过PuLP 1来求解。为了平均分配每个工人的总成本,您可以使每个工人的最大总成本与最小总成本之间的差异最小化。以下是一个可能的表述:
代码很简单:
这给了我
[1]确切地说,PuLP不是一个解算器,它只是一个建模框架,可以将MILP传递给MILP解算器,如CBC、SCIP、HiGHS等。