匈牙利算法:每个工人有多个工作
Hungarian algorithm: multiple jobs per worker
是否有匈牙利算法的扩展,可以满足为每个工人分配多个工作?在其最简单的形式中,该算法将单个工作分配给单个工人。
我的申请是一个利润最大化问题,有 3 个工人和 180 个职位。我也会添加约束条件(每个工人至少分配 50 个工作)。
我已经设法使用 Python 中的 mungres 库实现了匈牙利算法,效果很好。我只是在努力寻找与每个工人的多项任务相关的文献。
https://pypi.python.org/pypi/munkres
https://en.wikipedia.org/wiki/Hungarian_algorithm
https://en.wikipedia.org/wiki/Generalized_assignment_problem
我已经尝试过评论中列出的标准 numpy 方法,但无法将其扩展到每个工人的多个任务。如果我的矩阵是矩形的(即 3 个工人和 4 个工作),只有前 3 个工作分配给工人。我也试过添加虚拟变量来创建一个方阵,但随后工作被分配给那些虚拟工人而不是实际工人
The linear sum assignment problem is also known as minimum weight
matching in bipartite graphs. A problem instance is described by a
matrix C, where each C[i,j] is the cost of matching vertex i of the
first partite set (a “worker”) and vertex j of the second set (a
“job”). The goal is to find a complete assignment of workers to jobs
of minimal cost.
方法一
一个简单的方法是,例如,为每个工人制作 50 个克隆,然后正常解决问题。
要找到工人 1 的工作,您可以收集分配给工人 1 的克隆的所有工作。只有 50 个克隆,因此工人 1 最多分配到 50 个工作。
方法二
这种分配问题可以表示为最小成本流问题,如果一个工人做一份工作,就会有从一个工人到另一个工作的流动。
在这个公式中,每个工人都有 1 个流量单位的容量。然后,您可以根据需要通过简单地增加容量来增加作业数量。
这种方法可能更有效(因为图形更小)但需要修改底层算法,而方法 1 应该很容易实现。
这可以通过将其表述为运输问题来解决,其中工人的边界为 [50,inf)。如果我错了,请纠正我,彼得解决方案中的方法 1 是针对一个人最多可以做 50 次而不是最少的情况。
是否有匈牙利算法的扩展,可以满足为每个工人分配多个工作?在其最简单的形式中,该算法将单个工作分配给单个工人。
我的申请是一个利润最大化问题,有 3 个工人和 180 个职位。我也会添加约束条件(每个工人至少分配 50 个工作)。
我已经设法使用 Python 中的 mungres 库实现了匈牙利算法,效果很好。我只是在努力寻找与每个工人的多项任务相关的文献。
https://pypi.python.org/pypi/munkres
https://en.wikipedia.org/wiki/Hungarian_algorithm
https://en.wikipedia.org/wiki/Generalized_assignment_problem
我已经尝试过评论中列出的标准 numpy 方法,但无法将其扩展到每个工人的多个任务。如果我的矩阵是矩形的(即 3 个工人和 4 个工作),只有前 3 个工作分配给工人。我也试过添加虚拟变量来创建一个方阵,但随后工作被分配给那些虚拟工人而不是实际工人
The linear sum assignment problem is also known as minimum weight matching in bipartite graphs. A problem instance is described by a matrix C, where each C[i,j] is the cost of matching vertex i of the first partite set (a “worker”) and vertex j of the second set (a “job”). The goal is to find a complete assignment of workers to jobs of minimal cost.
方法一
一个简单的方法是,例如,为每个工人制作 50 个克隆,然后正常解决问题。
要找到工人 1 的工作,您可以收集分配给工人 1 的克隆的所有工作。只有 50 个克隆,因此工人 1 最多分配到 50 个工作。
方法二
这种分配问题可以表示为最小成本流问题,如果一个工人做一份工作,就会有从一个工人到另一个工作的流动。
在这个公式中,每个工人都有 1 个流量单位的容量。然后,您可以根据需要通过简单地增加容量来增加作业数量。
这种方法可能更有效(因为图形更小)但需要修改底层算法,而方法 1 应该很容易实现。
这可以通过将其表述为运输问题来解决,其中工人的边界为 [50,inf)。如果我错了,请纠正我,彼得解决方案中的方法 1 是针对一个人最多可以做 50 次而不是最少的情况。