【问题标题】:Maximum Number Of "Teams"“团队”的最大数量
【发布时间】:2016-02-16 23:19:47
【问题描述】:

我对一群人有一个定义。我需要根据人员列表(及其适用的位置)找到我可以获得的最大数量的团队,因为一旦一个人被“用于”一个位置,他们就不能再次使用。

简化示例:

**Team Requirements**
Slot A: 2 People
Slot B: 1 Person
Slot C: 1 Person

**People And Which Slots Are Applicable**
Person 1: A
Person 2: A,C
Person 3: A,B
Person 4: B
Person 5: A,B
Person 6: C
Person 7: C
Person 8: A

可能的答案

Team 1
A: P1, P8
B: P4
C: P6

Team 2
A: P2, P3
B: P5
C: P7

对于我的实际问题,我有多个位置(每个团队 1-10 个)和 1-1000 人,每个人最多可以有 20 个位置。

谁能推荐一种适合这种类型的组优化问题的算法?

【问题讨论】:

  • 这是编程比赛吗?如果没有,请给出问题的链接
  • 您需要的 Google 术语是“作业问题”。
  • @Salvador - 不,这不是为了编程比赛。这是我遇到的一个现实世界的商业问题。确实没有指向问题的链接,因为它非常专业。
  • @j_random_hacker - 谢谢,我会看看。
  • @j_random_hacker - 我不确定这与分配有什么关系,因为每个分组并没有真正的“成本”。我错过了什么吗?

标签: algorithm grouping


【解决方案1】:

这可以通过在一系列图中的每一个图中找到一个Maximum Cardinality Bipartite Matching 来解决,总共需要 O(n^2.5 log n) 时间。

为此,首先将每个插槽 type 转换为一组适当数量的不同插槽,这样我们就可以得到插槽 A1、A2、B、C。最终的解决方案将分配一个人到特定团队中的特定位置(例如,人员 3 到团队 1 中的位置 A2),但我们可以简单地忘记“2”(以及团队的顺序,这同样是纯人为的)。

首先计算团队数量的乐观估计 k:RoundDown(n/4) 可以,因为每个团队使用 4 人,所以我们不能有比这更多的团队。现在在二分图的一部分中制作 4k 个顶点 - 即,为每个 k 个潜在团队中的 4 个插槽中的每一个创建一个顶点:A1_1、A2_1、B_1、C_1、A1_2、A2_2、B_2、C_2、.. .,A1_k,A2_k,B_k,C_k。在二分图的另一部分,为每个人制作一个顶点。最后,将每个人顶点与允许填充的所有槽顶点连接起来:例如如果一个人 x 可以占用插槽 A 或 C,则他们应该通过一条边连接到以“A”或“C”开头的每个插槽(对于 8 个人的示例,这将是 6 条边)。

然后,解决此图上的 MCBM 问题,例如使用Hopcroft-Karp algorithm 在 O(n^2.5) 时间内。结果将是边的子集,可以解释为将每个人分配到团队中的最多一个位置,并且最多用一个人填充团队中的每个位置。如果这导致每个插槽都被填满,万岁!我们拥有尽可能多的团队。否则,如果有一些团队名额未被任何人填补,请减少团队数量并重试。 (您可以每次将团队数量减少 1,这会导致需要解决的 MCBM 问题呈线性数量 - 但您可以通过二分搜索来节省时间。这意味着从将团队数量减半开始,并且此后将团队数量减少或增加一半,当一些团队有空缺时减少,当没有空缺时增加,直到收敛。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-14
    • 2021-04-30
    • 2017-10-29
    • 2017-12-09
    • 2020-11-20
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    相关资源
    最近更新 更多