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

时间:2018-03-21 23:38:25

标签: algorithm matchmaking

假设我正在尝试为我的游戏创建某种匹配算法。该游戏类似于联盟或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次操作,这是疯了。

什么是更好的算法,没有经历所有可能的派对并暴力解决这个问题?

1 个答案:

答案 0 :(得分:3)

从你的例子中,我认为你并不关心通过评级来收集玩家,但是你关心平衡最终的团队。这是一个可以为您提供可行解决方案的算法。首先抓住队列中的前9名球员;将此称为pool

  1. 计算玩家的平均评分avg = mean(pool)
  2. 计算5人团队的目标得分:team_target = 5*avg
  3. 找到5个玩家的组合,其评级的总和最接近team_target(在其他几个帖子中解决)。成为那支队伍。
  4. 计算团队的总评分:team1_rating = sum(team1)
  5. pool中移除这五名玩家。将剩下的池球员放到team2上。
  6. 计算剩余4人团队的评分:team2_rating = sum(team2)
  7. 减去评分以获得所需的第10位玩家的评分:player_target = team1_rating - team2_rating
  8. 抓住队列中的下10名队员;这是新的pool
  9. 找到评分最接近player_target
  10. 的泳池播放器
  11. 将该播放器置于team2并发布匹配** team1 vs team2 *。
  12. 游泳池中有9名球员;回到第1步。根据需要进行迭代。
  13. <强>优点

    这是一个简单的线性算法,可以处理输入请求流。由于团队规模是固定的,因此队列的长度为 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个低值。