设置:多人团队游戏。
问题:每位玩家都有1到5星评级,这是根据他们的玩家统计数据计算的。我希望找到一种能够以最公平的方式为这些球员分配球队的算法。
有两支球队,每队最多有5名球员。
假设有6名玩家加入服务器。服务器最好像这样分配团队:
VS
..而不是这个
VS
在第一个例子中,每个团队总共有11个星星,而在第二个例子中,一个团队总共有14个星星,而另一个团队有8个星星。
抱歉,我不能再简洁了。
答案 0 :(得分:2)
难道你不能平均所有球员的得分,然后为平均得分最接近所有球员平均得分的每支球队挑选三个?
您可以为每支球队选择正确的球员,将最高的两名球员分配给不同的球队,然后平均其余四名球员的排列,并选择最接近球队平衡的球员。
我确信会有更多基于逻辑的解决方案来获得每个团队的最后两名成员。
答案 1 :(得分:2)
首先,将所有星星加起来并将总和除以2.按照他们拥有的星数计算你的玩家列表。接下来,将最好的玩家添加到第一组,第二组添加到第二组,第三组添加到第一组,依此类推。这将产生良好的效果,但它们可能远非完美。例如,如果你有5,1,1,1星球员。这将导致5,1 VS 1,1。
现在你可以计算出球队之间的差异,并从两支队伍中挑选一些球员进行交换。你可以通过从强大的团队中挑选最强的玩家并从另一个团队中挑选一个较弱的玩家来做到这一点,这样交换它们就可以产生完美的团队。如果这是不可能的,那就从强大的团队中挑选一个比强度最小的明星球员并尝试执行相同的操作,依此类推。
但是如果你为每支球队分配不同的球员数量,你应该小心,因为每个球员都是他自己的球员,能够同时行动。添加“一名球员更多明星加成”可能会有所帮助。但是在不知道你的游戏的情况下,我无法告诉你更多关于它的事情。
答案 2 :(得分:1)
最基本的解决方案是首先将所有玩家等级加起来,除以2,然后尝试通过添加玩家来达到该数字。它与收集精确的变化相同,因为它可能是很好的算法。
这不包括一些特殊情况。例如,如果有玩家1,1,1,1,2,2,将所有玩家和所有玩家组合在一起并不是最公平的分布。
但是当事情公平是一个更难的问题,优秀球员之间的团队合作。同时,考虑到球员排名可能远非完美,我不确定过度优化这种算法会有效。
答案 3 :(得分:1)
这些明星应该被视为提示,而不是实际技能水平。我会在一支球队中配对最好和最差,在另一支球队中配对第二好,第二差,并分配其余部分,以便每支球队的总和最接近总和的一半。
答案 4 :(得分:1)
检查一下:http://www.stanford.edu/class/cme305/References/approx.pdf 或者您可以尝试100种随机方式对玩家进行分组并保持最佳解决方案。 如果您有不到20名玩家,您甚至可以检查每种可能的配置(2 ^ 20)。
答案 5 :(得分:0)
我实际上是在为这个问题编写一个算法。我想出的解决方案是这样的。
让我们以得分的玩家为例:{1, 6, 2, 1, 6, 7, 4, 2}
对这些玩家进行排序会得到:{1, 1, 2, 2, 4, 6, 6, 7}
现在为了接近最终结果,我们将每个替补球员分到第 1 队,其余球员在第 2 队。所以我们有这些:
Team 1:{1, 2, 4, 6} -> 玩家总数 = 13
Team 2:{1, 2, 6, 7} -> 玩家总数 = 16
所以第 1 队和第 2 队的得分差为 3。我们希望将他们的得分差降到最低。所以现在我们可以检查交换两个玩家的分数是否使分数总和之间的差异更小。
所以我们可以从第一个球员开始这个过程,因为他们的分数相同,这不会改善球队之间的差异。第二个球员也是如此。但是,当我们找到两支球队的第三名球员时,如果我们交换这些球员,那么现在第 1 队的总和变为 15,第 2 队的总和变为 14。那么差异将是 1,这比我们之前的差异要好的 3. 所以现在团队会像这样:
团队 1:{1, 2, 6, 6} -> sum = 15
团队 2:{1, 2, 4, 7} -> sum = 14
然后我们比较两支球队的第 4 名球员。交换这些球员会使总和之间的差异更好吗?
如果我们交换这些球员,第 1 队的总和将变为 16,第 2 队的总和将变为 13。这是 3 的差异。这种交换将导致总和的差异大于当前差异.所以我们不做这个交换。
就时间复杂度而言,这是一个 O(nlogn) 算法,因为我们正在对 O(nLogn) 进行排序,并且我们正在对团队进行线性搜索。
这是一个 NP-Hard 问题,因此该算法即使不是最好的团队也能很好地近似。