我有一个玩家技能等级,年龄和性别的数据集,并希望创建均匀匹配的团队。
我想在Haskell中尝试这个,但编码语言的选择是这个问题最不重要的方面。
答案 0 :(得分:20)
这是bin packing problem或multi-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 :(得分:12)
考虑到每支球队的球员数量和性别比例(您可以轻松计算)。剩下的问题叫做n-partition problem,遗憾的是NP完全,因此很难准确解决。如果您的问题规模对于暴力解决方案来说太大,您将不得不使用近似或启发式算法(进化算法)。一个非常简单的近似是按年龄排序并以交替方式分配。
答案 2 :(得分:3)
您可以调整技能等级,性别和年龄点值,以更改每个值的分布。
答案 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)
两支球队几乎无足轻重的方法:
不是很灵活,只适用于一个列排名,所以它不会尝试获得类似的性别或年龄档案。但如果输入分布相当平稳,它确实会使公平匹配的团队成为可能。另外,当有一个奇数时,它并不总是以A队有剩余球员。
答案 5 :(得分:1)
点子:
答案 6 :(得分:1)
那么,
我的答案不是关于球队/球员的得分策略,因为所有发布的都很好,但我会尝试暴力或随机搜索< / em>方法。 我不认为创建遗传算法是值得的。
问候。