根据玩家排名创建公平/均匀匹配的团队的算法

时间:2009-09-01 16:09:56

标签: algorithm language-agnostic haskell functional-programming

我有一个玩家技能等级,年龄和性别的数据集,并希望创建均匀匹配的团队。

  • 球队将拥有相同数量的球员(目前有8支球队,共有12名球员)。
  • 团队应该具有相同或相似的男女比例。
  • 团队应该有相似的年龄曲线/分布。

我想在Haskell中尝试这个,但编码语言的选择是这个问题最不重要的方面。

7 个答案:

答案 0 :(得分:20)

这是bin packing problemmulti-dimensional knapsack problem。 BjörnB。Brandenburg已经发现了a bin packing heuristics library in Haskell你可能会觉得有用。

你需要像...这样的东西。

data Player = P { skill :: Int, gender :: Bool, age :: Int }

决定一些球队n(我猜这是球员总数的函数)。

找到每个团队所需的总技能:

teamSkill n ps = sum (map skill ps) / n

找出理想的性别比例:

genderRatio ps = sum (map (\x -> if gender x then 1 else 0)) / length ps

找出理想的年龄差异(您需要Math.Statistics包):

ageDist ps = pvar (map age ps)

你必须为这三个约束分配一些权重,以便为给定的团队得分:

score skillW genderW ageW team = skillW * sk + genderW * g + ageW * a
  where (sk, (g, a)) = (teamSkill 1 &&& genderRatio &&& ageDist) team

问题减少到团队之间得分差异的最小化。蛮力方法将花费与Θ(n k-1 )成比例的时间。考虑到你的问题的规模(8个团队,每个团队12个玩家),这相当于在典型的现代PC上大约6到24小时。

修改

一种可能适合您的方法(因为您在实践中不需要精确的解决方案)是模拟退火,或通过随机排列持续改进

  1. 随机挑选团队。
  2. 获取此配置的分数(见上文)。
  3. 在两个或更多球队之间随机交换球员。
  4. 获取新配置的分数。如果它比前一个更好,请保留它并递归到第3步。否则丢弃新配置并再次尝试第3步。
  5. 当某些固定次数的迭代没有得到改善时(试验找到该曲线的拐点),停止。此时您所拥有的配置可能足够接近理想状态。运行此算法几次,以确保您没有达到比理想情况差得多的局部最优值。

答案 1 :(得分:12)

考虑到每支球队的球员数量和性别比例(您可以轻松计算)。剩下的问题叫做n-partition problem,遗憾的是NP完全,因此很难准确解决。如果您的问题规模对于暴力解决方案来说太大,您将不得不使用近似或启发式算法(进化算法)。一个非常简单的近似是按年龄排序并以交替方式分配。

答案 2 :(得分:3)

  1. 将分值指定为技能级别,性别和年龄
  2. 为每个玩家分配每个条件的积分总和
  3. 按玩家计算的分值排序玩家
  4. 将下一位玩家分配给第一支队伍
  5. 将球员分配给第二支球队,直至其总分数超过第一支球队或球队达到最大球员数。
  6. 为每个团队执行5,循环回到第一个团队,直到所有玩家都被分配
  7. 您可以调整技能等级,性别和年龄点值,以更改每个值的分布。

答案 3 :(得分:3)

假设您有六个玩家(对于简单的示例)。我们可以使用相同的算法,在单淘汰赛中将对手配对,并根据您选择的任何标准调整以生成“偶数”球队。

首先让你的球员排名最差。不要太过于字面意思。您需要一个按照您希望分开的标准排序的玩家列表。

为什么?

让我们看一下单场淘汰赛。使用算法生成最佳单次消除匹配的想法是避免在锦标赛中过早召开“顶级球员”会议的问题。如果顶级球员太早见面,其中一名顶级球员将在早期被淘汰,这使得比赛变得不那么有趣了。我们可以使用这种“最佳”配对来生成团队,其中“顶级”玩家在团队中均匀分布。然后展开第二名顶级球员等等。

所以按照你希望他们分开的标准列出你的球员:先是男人,然后是女人......按年龄排序。我们得到(例如):

Player 1: Male - 18
Player 2: Male - 26
Player 3: Male - 45
Player 4: Female - 18
Player 5: Female - 26
Player 6: Female - 45

然后我们将应用单消除算法,该算法使用他们的“等级”(这只是他们的玩家编号)来创建“良好匹配”。

单淘汰赛锦标赛生成器基本上是这样的:取他们的等级(玩家编号)并反转位(二进制)。你提出的这个新号码将成为他们在锦标赛中的“位置”。

Player 1 in binary (001), reversed becomes 100 (4 decimal) = slot 4
Player 2 in binary (010), reversed becomes 010 (2 decimal) = slot 2
Player 3 in binary (011), reversed becomes 110 (6 decimal) = slot 6
Player 4 in binary (100), reversed becomes 001 (1 decimal) = slot 1
Player 5 in binary (101), reversed becomes 101 (5 decimal) = slot 5
Player 6 in binary (110), reversed becomes 011 (3 decimal) = slot 3

在单淘汰锦标赛中,1号位插槽2,3-vs-4,5-vs-6。我们将使用这些“配对”来生成最佳团队。

查看上面的玩家编号,按照他们的“插槽编号”排序,这是我们提供的列表:

Slot 1: Female - 18
Slot 2: Male - 26
Slot 3: Female - 45

Slot 4: Male - 18
Slot 5: Female - 26
Slot 6: Male - 45

当你将老虎机分成小组(两个或更多)时,你会得到1-3号位的队员和4-6位的队员。这是您可以获得的最佳/最佳分组。

这项技术可以与更多玩家,多个标准(只是正确地将它们组合在一起)以及多个团队进行非常好的扩展。

答案 4 :(得分:1)

两支球队几乎无足轻重的方法:

  1. 按技能/等级评估对所有玩家进行排序。
  2. 为A队分配最佳球员。
  3. 为B队分配下一个两个最佳球员
  4. 为团队A分配下一个两个最佳玩家
  5. 转到3
  6. 当你没有参加比赛时结束。
  7. 不是很灵活,只适用于一个列排名,所以它不会尝试获得类似的性别或年龄档案。但如果输入分布相当平稳,它确实会使公平匹配的团队成为可能。另外,当有一个奇数时,它并不总是以A队有剩余球员。

答案 5 :(得分:1)

点子:

  1. 按技能排序球员
  2. 按顺序分配最佳球员(即:球队A:第一球员,球队B:第二球员,......)
  3. 按顺序分配最差玩家
  4. 循环2
  5. 评估可能的更正并执行它们(即:如果A队的总技能为19,技能为5的球员,B队的技能为21,技能为4的球员,则互换)
  6. 评估性别分布的可能更正并执行它们
  7. 评估可能的年龄分布修正并执行它们

答案 6 :(得分:1)

那么,

我的答案不是关于球队/​​球员的得分策略,因为所有发布的都很好,但我会尝试暴力随机搜索< / em>方法。 我不认为创建遗传算法是值得的。

问候。