【问题标题】:Algorithm to assign Team based on player's choice根据玩家的选择分配团队的算法
【发布时间】:2016-12-17 04:17:47
【问题描述】:

我在这里发现了非常相似的问题,但我找不到适合我的解决方案。那么问题来了:

我有 4 支球队和大量(超过 4 名)球员。每个玩家根据自己的喜好对球队进行排名,例如:

  1. B 组
  2. D 组
  3. A队
  4. C组

最后,我希望每支球队的球员人数都是偶数,但要根据他们的选择来衡量。

这是一个匈牙利算法,男性多于工作。谁能帮我找到这个算法?找了好久。

【问题讨论】:

  • 这看起来更像是Hospitals/Residents Problem(或大学招生问题)的变体,可能在“医院”方面没有任何排名。

标签: math language-agnostic


【解决方案1】:

您可以将其表示为一个 1-0 整数规划问题。

设 x_N 是描述团队分配的向量:如果 x_Y(i) = 1,则人员 i 在团队 Y,如果他们不在团队 Y,则 x_Y(i) = 0。|x_Y| = N,其中 N 是玩家人数。

另外,设 p_Y 是玩家对 Y 队的偏好权重,因此如果玩家 i 真的想加入 Y 队,则 p_Y(i) = 4,如果他们不想加入,则 p_Y(i) = 1在 Y 队。

(您可以将加权偏好 1 和 4 替换为任何内容,它们只是一个示例)。

解决您的问题的算法必须执行以下操作:

最大化:x_A*p_A + x_B*p_B + x_C*p_C + x_D*p_D

服从:x_A + x_B + x_C + x_D = 1(N个1的向量)

AND x_Y(i) in {0, 1} 用于 {A, B, C, D} 中的所有 Y,{1, ..., N} 中的 i

您要最大化的实际上是分配矩阵和偏好矩阵的矩阵乘积的轨迹,这是一种半定整数规划算法。我很确定这是 NP 难的。

解决此问题的一种启发式方法是将相同数量的玩家随机分配到团队中。然后,如果他们使目标函数增加,您可以在团队之间进行一系列“交易”。更好的是,您可以在多项式时间内找出在任何给定任务中哪个交易是最好的交易。这不会给你一个最佳的分配,但我认为它会让你非常接近。

顺便说一下,这种方法是hill climbing 的一种变体。基本上,这些其他heuristic methods 中的任何一个在这个问题的上下文中都会有类似的类似物。

【讨论】:

  • 我倾向于在上坡的途中启动算法。与其一开始随机分配球员,不如将每个球员分配到他们最喜欢的空位球队。然后从那里运行爬山算法。
【解决方案2】:

符号:

玩家数组p[1], ..., p[n]

团队数组T[1], T[2], T[3], T[4]

意愿矩阵w[i,j];维度=nx4w[i,j]=pi 愿意加入团队Tj。这里的假设是w[i,1] + w[i,2] + w[i,3] + w[i,4] = 1 代表所有i

成员矩阵x[i,j],维度 = nx4x[i,j]=10 取决于 pi 是否属于 Tj

满意度数组s[1], ..., s[n]; s[i] := w[i,1] * x[i,1] + ... + w[i,4] * x[i,4].

满意s := (s[1] + ... + s[n]) / n.

操作:

假设如下:

  1. x[k,q] = 1p[k]属于T[q]
  2. x[k,r] = 0 (p[k] 不属于T[r]
  3. x[h,r] = 1p[h]属于T[r]
  4. x[h,q] = 0p[h]不属于T[q]

swap([k,q][h,r]) 操作在团队T[q]T[r] 之间交换球员p[k]p[h]。这是:

  1. x[k,q] := 0, x[k,r] := 1.
  2. x[h,r] := 0, x[h,q] := 1.
  3. s[k] := s[k] - w[k,q] + w[k,r]s[h] = s[h] - w[h,r] + w[h,q]
  4. s := (s * n - w[k,q] - w[h,r] + w[h,r] + w[k,q]) / n

现在您可以使用模拟退火来最大限度地提高满意度s。这是算法的草图:

  1. 从任何配置开始(只需在球员出现时将他们分配到球队)

  2. 确定温度

  3. 随机选择两对[k,q][h,r]

  4. 尝试swap 操作。如果对s 的满意度增加,请接受交换。如果不是,则仅以一定的概率接受,否则拒绝交换(详见模拟退火算法)

  5. 多次重复步骤 3 和 4。

  6. 降低温度,回到 3。

备注:

如果玩家在1, ..., 4(或任何其他)范围内有偏好,则将每个玩家的这些数字除以他们的总和,以获得他们每个人的意愿向量满足约束w[i,1] + ... + w[i,4] = 1

随机选择两对[h,q][k,r] 必须满足swap 操作的假设。因此,它基本上包括随机选择两支球队(qr),然后每支球队两名球员。

swap 操作中的第 3 步和第 4 步对于最大限度地减少和和乘积的数量至关重要,因此交换试验很快。

要拒绝swap,只需再次swap 相同的对。

【讨论】:

    猜你喜欢
    • 2019-06-26
    • 2017-03-16
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 2021-11-02
    相关资源
    最近更新 更多