Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 数百万玩家的玩家池中5V5的最佳匹配算法_Algorithm_Matchmaking - Fatal编程技术网

Algorithm 数百万玩家的玩家池中5V5的最佳匹配算法

Algorithm 数百万玩家的玩家池中5V5的最佳匹配算法,algorithm,matchmaking,Algorithm,Matchmaking,假设我正在尝试为我的游戏创建某种匹配算法。该游戏类似于联盟或DOTA,即5名玩家对5名玩家。进一步假设玩家池是一次搜索一个游戏的数百万玩家,而媒人的工作是将尽可能多的玩家放入5v5游戏的多个实例中。在这一点上,我们一点也不担心MMR、ELO或任何球员/政党的评级。我们只想让玩家进入5V5 我目前的暴力算法在伸缩性方面绝对糟糕。它首先尝试在数百万玩家中查找5个玩家方的所有可能组合,然后尝试查找成对的玩家方,同时如果玩家已经被使用,则从可能的玩家方比赛中删除玩家: 所以,假设我有10个播放器,我想找

假设我正在尝试为我的游戏创建某种匹配算法。该游戏类似于联盟或DOTA,即5名玩家对5名玩家。进一步假设玩家池是一次搜索一个游戏的数百万玩家,而媒人的工作是将尽可能多的玩家放入5v5游戏的多个实例中。在这一点上,我们一点也不担心MMR、ELO或任何球员/政党的评级。我们只想让玩家进入5V5

我目前的暴力算法在伸缩性方面绝对糟糕。它首先尝试在数百万玩家中查找5个玩家方的所有可能组合,然后尝试查找成对的玩家方,同时如果玩家已经被使用,则从可能的玩家方比赛中删除玩家:

所以,假设我有10个播放器,我想找到所有可能的5V5,我首先将它们转换成位,并进行位移位,以找到所有可能的组合

Players: ABCDEFGHIJ
1111100000 => ABCDE
1111010000 => ABCDF 
1111001000 => ABCDG
1111000100 => ABCDH
1111000010 => ABCDI
1111000001 => ABCDJ
1110110000 => ABCEF
等等

然后在所有可能的参与方中,我使用2个for循环开始尝试查找参与方对:

ABCDE vs FGHIJ
ABCDF vs EGHIJ
ABCDG VS EFHIJ
等等

此算法的运行时间为OnCr^2。因为它试图找到所有可能的政党组合,所以仅仅撮合50名玩家就需要4.4891439e+12次操作,这太疯狂了


有什么更好的算法不需要经过所有可能的方并强行解决这个问题呢?

从您的示例中,我推断您并不关心按等级收集玩家,而是关心如何平衡生成的团队。这里有一个算法,应该可以为您提供一个可行的解决方案。首先抓住队列中的前9名玩家;这叫游泳池

计算球员的平均得分,平均得分=meanpool 计算5人团队的目标分数:团队目标=5*avg 找到5名球员的组合,他们的得分与其他几篇帖子中解决的团队目标最接近。让那一队来。 计算团队的总评分:team1_rating=sumteam1 把那五名球员从游泳池中除名。把剩下的台球队员放到第二队。 计算剩余4人团队的评分:team2_rating=sumteam2 减去评级以获得所需的第10名玩家的评级:玩家\目标=团队1 \团队评级-团队2 \团队评级 抓住队列中接下来的10名玩家;这是新的游泳池。 找到等级最接近玩家目标的池中玩家。 将该球员放在第2队,并公布比赛**第1队对第2队*。 池中还有9名球员;返回到步骤1。根据需要迭代。 优势

这是一个简单的线性算法,可以处理输入请求流。由于团队规模是固定的,因此取决于队列的长度。唯一需要花费时间的是找到最接近平均得分的球队,检查9C5=126的可能性,这是每场比赛相当便宜的开销

空间开销很小:高水位线同时处理19名玩家

问题


如果分布不平滑,则可能出现不平衡匹配。例如,如果队列中有一名明星球员,例如100、5、5、5、6、6、6、5、5、5、5、5、6、6、6、6、6,那么最佳配对的团队评分将分别为120和30。如果这是一个功能性问题,请随意调整,也许保留一个异常值池来处理,直到得到10个高和/或10个低。

我想我不理解这个问题,但是,如果你不关心MMR、ELO或任何类型的指标……那么你就不能一次从你的球员库中随机选择5名球员,将第一队与第二队配对,将第三队与第四队配对,等等……你的约束条件非常不清楚。对玩家进行简单的分区似乎很好。我从来没有玩过Legend或DOTA,所以这对我也没有帮助。你需要更清楚地知道你想做什么。我没有说清楚,但我的意思是我想要所有可能的5v5匹配组合。例如,如果有6个玩家,ABCDEF,我们正在创建2v2:那么AB vs CD,BC vs DE,AC vs DE,AE vs DF是4种可能的组合。在这种情况下,评级是什么并不重要。我想要一份6个玩家所有可能的2v2的列表首先你要求一些非暴力的东西,现在你想要列出所有总是暴力的组合。这个问题正在接近一个封闭的状态,因为你真的很难得到你真正想要的。我不明白这不是那么复杂。我只是问如果有4个播放器ABCD,我们正在寻找所有可能的2V2,生成AB与CD、AC与BD、AD与BC组合的最佳算法是什么?这就是我想要的,它与技能等级完全无关。如果暴力是唯一的解决办法,那就这样吧,因为我不知道