找到具有首选组的组和对象的最佳分配的算法
Algorithm to find the best assignment of groups and objects with preferred group
起初,有一堆物体。每个对象都有一个属性,该属性告诉它想要属于的组的类型。组是给定数量的对象的容器。它有一个类型。
现在我正在寻找组合,其中 大多数对象都在该对象首选的组中。 因为组的数量是通过一个公式计算的,该公式给出了可能的最低值number,有些组合不是所有对象都在首选类型的组中。没关系,因为我正在寻找大多数对象都在首选组中的组合。
一个对象可以偏爱多种类型的组,所以它属于哪个偏爱组并不重要。
群类型可以在请求的群类型中自由选择。
有算法可以解决这个问题吗?
例子
有五个对象。前两个并不关心他们是否在A或B类型的组中。第三个想要在一组类型 A 中,第四个想要在一组类型 C 中,最后一个想要在类型 B.
小组人数为两人。组数通过以下公式计算。
组的每个类型都可以从请求的类型中自由选择(A,B或C)。
编辑
考虑组大小为 6 和 12 的对象。其中有 11 个偏爱 A 组,其中 1 个偏爱 B 组。
对于 12 个对象和组大小 6,有 2 个组。最好的解决方案是将类型 A 分为两组。然后 11 个对象在一个首选组中,一个在它不喜欢的组中。澄清一下,每个对象都应该在一个组中。
如何找到组类型的最佳组合?在此示例中,如何将首选组类型 B 的对象连接到组(图中)?据我了解,Ford Fulkerson 要求组类型已经知道。
这个问题可以使用 max flow. In the comment section @sascha suggests min-cost max-flow. But i think there's no need to add cost to the flow network for this problem. Also complexity of min-cost max flow
is greater than the complexity of max flow
. There are several algorithm for max flow
(see https://en.wikipedia.org/wiki/Maximum_flow_problem#Solutions) 来解决,具有不同的复杂度。
最大流量问题: 给定流量网络容量。现在您必须找到从源节点到目标节点的最大流量。例如看下图:
将您的问题转换为最大流问题:
你的问题:给你对象。每个对象都有首选的组类型(它们可以有多个组类型)。每个组都有一个容量,即他们可以容纳多少个对象。现在您正在寻找大多数对象都在该对象首选的组中的组合。
转换为最大流:将每个对象和每个组视为一个节点。每个对象都有首选组类型,因此将每个对象的边设置为其首选组并将容量设置为 1(因为每个对象都可以分配给一个组)。还设置从源节点到每个对象的边缘,设置容量 1(作为一个对象)。每个组都有一个他们可以容纳多少对象的容量,因此设置从每个组到目标节点的边缘并设置它可以容纳多少对象的容量。
对于您给出的示例,流网络如下图所示:
经过运行算法后,您可以从流程中找出哪个对象分配给哪个组。
起初,有一堆物体。每个对象都有一个属性,该属性告诉它想要属于的组的类型。组是给定数量的对象的容器。它有一个类型。
现在我正在寻找组合,其中 大多数对象都在该对象首选的组中。 因为组的数量是通过一个公式计算的,该公式给出了可能的最低值number,有些组合不是所有对象都在首选类型的组中。没关系,因为我正在寻找大多数对象都在首选组中的组合。
一个对象可以偏爱多种类型的组,所以它属于哪个偏爱组并不重要。
群类型可以在请求的群类型中自由选择。
有算法可以解决这个问题吗?
例子
有五个对象。前两个并不关心他们是否在A或B类型的组中。第三个想要在一组类型 A 中,第四个想要在一组类型 C 中,最后一个想要在类型 B.
小组人数为两人。组数通过以下公式计算。
组的每个类型都可以从请求的类型中自由选择(A,B或C)。
编辑
考虑组大小为 6 和 12 的对象。其中有 11 个偏爱 A 组,其中 1 个偏爱 B 组。 对于 12 个对象和组大小 6,有 2 个组。最好的解决方案是将类型 A 分为两组。然后 11 个对象在一个首选组中,一个在它不喜欢的组中。澄清一下,每个对象都应该在一个组中。
如何找到组类型的最佳组合?在此示例中,如何将首选组类型 B 的对象连接到组(图中)?据我了解,Ford Fulkerson 要求组类型已经知道。
这个问题可以使用 max flow. In the comment section @sascha suggests min-cost max-flow. But i think there's no need to add cost to the flow network for this problem. Also complexity of min-cost max flow
is greater than the complexity of max flow
. There are several algorithm for max flow
(see https://en.wikipedia.org/wiki/Maximum_flow_problem#Solutions) 来解决,具有不同的复杂度。
最大流量问题: 给定流量网络容量。现在您必须找到从源节点到目标节点的最大流量。例如看下图:
将您的问题转换为最大流问题:
你的问题:给你对象。每个对象都有首选的组类型(它们可以有多个组类型)。每个组都有一个容量,即他们可以容纳多少个对象。现在您正在寻找大多数对象都在该对象首选的组中的组合。
转换为最大流:将每个对象和每个组视为一个节点。每个对象都有首选组类型,因此将每个对象的边设置为其首选组并将容量设置为 1(因为每个对象都可以分配给一个组)。还设置从源节点到每个对象的边缘,设置容量 1(作为一个对象)。每个组都有一个他们可以容纳多少对象的容量,因此设置从每个组到目标节点的边缘并设置它可以容纳多少对象的容量。
对于您给出的示例,流网络如下图所示:
经过运行算法后,您可以从流程中找出哪个对象分配给哪个组。