【发布时间】:2022-07-23 03:29:51
【问题描述】:
我在使用 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
【问题讨论】:
标签: python numpy optimization scipy assignment-problem