假设我正在尝试为我的游戏创建某种匹配算法。该游戏类似于联盟或DOTA,其中5名玩家与5名玩家进行对抗。进一步假设玩家池是巨大的(数百万玩家一次搜索一个游戏),并且比赛制造者的工作是尽可能多地将玩家放入5v5游戏的许多实例中。在这一点上,我们根本不担心MMR,ELO或任何玩家/党派评级发挥作用。我们只想将玩家放入5v5s。
我目前的蛮力算法在缩放方面绝对是残酷的。它首先尝试在数百万玩家中找到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
依旧......
该算法的运行时间为O((nCr)^ 2)。因为它试图找到所有可能的派对组合,只需配对50名玩家需要4.4891439e + 12次操作,这是疯了。
什么是更好的算法,没有经历所有可能的派对并暴力解决这个问题?
答案 0 :(得分:3)
从你的例子中,我认为你并不关心通过评级来收集玩家,但是你做关心平衡最终的团队。这是一个可以为您提供可行解决方案的算法。首先抓住队列中的前9名球员;将此称为pool
。
avg = mean(pool)
team_target = 5*avg
team_target
(在其他几个帖子中解决)。成为那支队伍。team1_rating = sum(team1)
pool
中移除这五名玩家。将剩下的池球员放到team2上。team2_rating = sum(team2)
player_target
= team1_rating - team2_rating pool
。player_target
。team2
并发布匹配** team1 vs team2 *。<强>优点强>
这是一个简单的线性算法,可以处理输入请求流。由于团队规模是固定的,因此队列的长度为 O(N)。唯一耗费时间的部分是找到最接近平均评分的团队,检查9C5 = 126种可能性,每场比赛的开销非常便宜。
空间开销微不足道:高水位标记同时处理了19名球员。
<强>问题强>
如果分布不平滑,您可以进行不平衡匹配。例如,有一个明星球员的队列,例如(100,5,5,5,5,6,6,6,6 | 5,5,5,5,5,6,6,6,6,6) )将为你提供120和30的团队评分,为最好的&#34;配对。如果这对您来说是一个功能性问题,请随意调整,或者保留一组异常值来处理,直到您获得10个高和/或10个低值。