【问题标题】:Algorithm - Attempting to balance out team skill levels, while having a equal amount of players算法 - 尝试平衡团队技能水平,同时拥有相同数量的玩家
【发布时间】:2013-02-19 05:28:22
【问题描述】:

我有 3 支球队,他们有 2 名球员、3 名球员和 7 名球员。 有 18 名球员坐在场边等待分配。

每个玩家都有自己的技能等级,这意味着 1 级不会击败 10 级。

我想将球队平衡为每队 10 名球员。我想尽量让所有 3 支球队的技术水平相同。但我不想移除团队中已有的玩家。

但我不确定我将如何实现这一点。 我也不确定是否有一个简单的答案,或者计算成本是否很高。

技能等级是我已有的数字。 所有球队都有相同数量的球员。这意味着技能水平是唯一变化的数字。

一个例子是。 第 1 队有 3 名球员,总技能水平为 4。 第 2 队有 6 名球员,总技能水平为 8。 第 3 队有 8 名队员,总技能等级为 9。

我有 13 名球员需要被分配,所以每支球队有 10 名球员。 我想尝试匹配总技能水平。

【问题讨论】:

  • 在我看来,这更像是一个数学/算法问题,而不是特定于 Java 的问题。
  • 听起来像是垃圾箱包装/背包问题。
  • 这是一个数学线性方程。指定目标函数并求解!
  • 编辑它以纠正我的错误。主要是误导标签
  • 你说的那些技能等级大概是一些人为的数字,除了比较单人玩家之外没有别的意义。他们可能在团队比赛中几乎一文不值。任何带有这些数字的数学运算就更没有意义了。

标签: algorithm math balance


【解决方案1】:

这对我来说就像您试图将一组(多个)数字(“技能水平”)划分为大小相等的块(“团队”),以便平均值(“总技能水平”)为尽可能接近相等。

为了解决这个问题,我将首先计算平均技能水平,即技能水平的总和除以玩家人数,将此号码称为s。如果总共有m 队,每个队有k 球员,总共有m*k 名球员,那么每个球队的目标技能水平是k*s

由于您的团队已经部分填满,因此基于您的示例您遇到的问题

我有 3 支球队,他们有 2 名球员、3 名球员和 7 名球员。有 18 名球员坐在场边等待分配。

如下:

  • A队,当前技能水平a,需要8名球员,这样p1 + ... + p8 + a = 10*s
  • B 队,当前技能水平b,需要 7 名球员,这样q1 + ... + q7 + b = 10*s
  • C 队,当前技能水平c,需要 3 名球员,例如 r1 + r2 + r3 + c = 10*s

对于蛮力解决方案,首先找到 C 队的球员,然后使用剩余的球员为 A 队和 B 队求解。

要获得更聪明的解决方案,您需要意识到这确实是一个subset sum problem,并使用一种众所周知的算法来解决这个问题。我推荐链接文章中描述的动态编程解决方案。

【讨论】:

    【解决方案2】:

    这里不可能给出一个可靠的答案,因为真正重要的是排名方案有多准确,以及它是否满足一些逻辑属性。

    加性:如果排名是完美的,那么它可能在某种意义上是加性的。我的想法来自桥牌,但任何可以让玩家排名并可以组队的任务都适用。因此,如果 10 级和 1 级玩家组队时,对于由 5 级和 6 级玩家组成的组合来说,这将是一个很好的匹配。 (根据我的阅读,从对数意义上来说,桥梁排名可能更准确。)

    协同作用:在一个团队中,某些人是否比其他人更好地合作?同样,这是一个排名问题,因为您与一个人的排名可能比与其他人的排名更好。这里经常有协同作用。以避免桥牌为例,我想到的是高尔夫。把两个人放在一个高尔夫球场上,如果一个人是经常说话的人,而另一个人需要沉默来集中注意力,那么从逻辑上讲,他们在一起打得不好。

    【讨论】:

      【解决方案3】:

      一种实用的方法可以为您提供一个很好的答案,就是将排名最高的球员分配给排名最低的球队,直到所有球员都分配完毕,您可以通过将球队球员的排名相加来计算球队的排名。

      【讨论】:

        猜你喜欢
        • 2021-06-02
        • 1970-01-01
        • 2021-04-15
        • 2016-12-17
        • 2020-02-02
        • 2016-04-22
        • 2016-07-28
        • 2014-11-21
        • 2019-07-23
        相关资源
        最近更新 更多