团队平衡器在《战车世界:闪击战》中的运作方式



WoT Blitz是一款移动坦克射击游戏,玩家可以在7对7格式中进行战斗。
媒人或平衡者是一种机制,根据希望进入战斗的玩家阵容来形成团队的组成。

战车具有以下对接会重要的参数:

  • 等级 根据液位的不同,坦克的不同特性也会发生变化(例如,速度,装甲穿透力)。 在第1级-最弱的战车,在第10级-最强的战车。
  • 型式 WoT Blitz有4种类型的坦克:轻型,中型,重型和坦克歼击车(反坦克自行火炮)

媒人的最简单实现是将玩家随机分组。 但是在这种情况下,处于低位的玩家将没有任何机会造成至少一些伤害,这将变得毫无意义。

要求条件


平衡器的要求列表是根据游戏社区的反馈而形成的,并定期更新到今天。

在撰写有关常规战斗的文章时,该列表包含以下各项:

平衡器要求清单
  • 坦克的最大和最小水位之差不应超过一,排除外(也就是说,如果在战斗中遇到10秒,则不应有5秒或7秒,只有9秒和10秒);
  • 团队人数应为7x7,但在线人数较少(在这种情况下,您可以进行较小的战斗,例如5x5或3x3);
  • 球队应该根据现有技术进行镜像平衡(如果一个球队中有3个第十级别的战车和4个第九级别的战车,那么其他战队也应该有3个十和四个九)。
  • 在两个团队中,排的现有技术都应该相同;
  • 每种类型的车队不得超过3个战车(例如,不超过3个子弹,不超过3个PT)。 该规则从5级及更高级别开始;
  • 两队之间相同类型的坦克数量之差不应超过一队(例如,如果一队拥有1 PT,则第二队最多可以有2 PT);
  • 战队必须在相同战车的数量上保持平衡,每个战车的差异不得超过一个战车(如果一个战队中有1个IS-7,那么另一战队中则不得超过2个IS-7);
  • 玩家只能进入自己选择的战斗模式(如果玩家仅打开了“即将来临的战斗”,则不应进入“优势”);
  • 如果玩家购买了新坦克,则在新坦克的前N场战斗中,其他坦克的水平不会超过玩家新坦克的水平(也就是说,如果玩家拥有5级的坦克,则战斗中不应遇到6级的坦克);
  • 玩家必须获得已经装好的那些卡。 游戏安装后,我们已经加载了一些内容;
  • 如果玩家打开了“单一控件类型”选项,则他只能与具有相同控件类型的玩家一起玩(如果他在平板电脑/手机上玩,则不应与鼠标接触,反之亦然)。


开发一个媒人,特别是考虑到如此多的限制,是一项非常有趣的任务。 解决方案的方法可能很多。

平衡器形成一对球员


最初,在移动水箱中使用了平衡器,他从他的哥哥那里继承了这一平衡器-台式水箱。 总的来说,他工作得很好,但是他有几个问题:首先,他没有明确保证满足要​​求。 其次,增加新的要求非常困难。


战斗开始

因此,编写了另一个平衡器,该平衡器根据以下算法工作:

  • 我们根据设备的级别和类型将玩家分为几类;
  • 从产生的玩家中我们组成一对。
  • 我们将不同的对子散布在不同的团队中:进行每对,将第一个玩家扔进第一队,第二个扔进第二个;
  • 在收到的球队中,我们进行最后的重新平衡:为了满足大多数要求,我们将一个球队的一些球员替换为另一球队的球员。

最终的平衡器的工作速度比以前的版本快5到10倍,并且最初组建了满足当时所有要求的团队。 通过编写其他重新平衡通行证来添加新规则。

一开始,一切都很好。 但是随着时间的推移,添加的规则越多,编写重新平衡的难度就越大。 新的重新平衡不应因其工作而中断先前的工作。 显然,这是通往无处可去的道路。


媒人中的虫子-9对9的团队齐聚一堂

模拟退火平衡器


在最终版本中,我们选择了根据以下算法工作的平衡器。 所有单击“战斗”按钮的玩家都将进入常规队列。 无休止的循环平衡器执行以下操作:

  • 选择随机战斗参数(随机战斗级别(从1到10),随机模式,随机地图);
  • 在队列中找到所有符合以上所选条件的玩家(在合适水平的战车上战斗,打开所选模式,加载所选地图);
  • 试图组成满足以上所有要求的团队(以下描述);
  • 如果有可能组建一支队伍,则将这些球员赶出等候线,战斗就开始了。

为了从合适的参与者列表中组成团队,使用了退火模拟方法。 在此处阅读有关该方法本身的更多信息。


通过模拟退火搜索全局最大值

在应用到组建团队的上下文中,算法如下:

  • 它从两个空团队开始。
  • 在每次迭代时,它会随机更改命令状态。 为此,请执行以下操作之一:

    • 从合适的球员列表中向第一或第二支球队添加一个随机球员(我们也选择一个随机球队);
    • 从随机团队中移出随机玩家;
    • 用一,二队中现有的一名替换一名合适的球员中的一名;
    • 将第一支队伍的一名随机玩家更改为第二支队伍的一名随机玩家。

  • 获取结果状态的估计值。 为此,调用评估函数。 该功能遍历需求列表,对于每个项目的违反都会增加罚款。 违反分数越强,处罚越高。 例如,对2x2球队的罚款将高于对6x6球队的罚款;
  • 根据估计函数的值和当前温度的变化,我们确定过渡到新状态的可能性。
  • 我们继续该过程,直到温度达到设定的最小值或评估函数的值达到零(在这种情况下,满足所有要求并且可以开始战斗)。

这种方法的主要优点是:添加新的需求,足以修改评估功能。 无需编写代码来描述如何确切地获得我们想要的东西。 只需添加一条规则,以查看组建的团队并说明其是否平衡。

添加此类规则的一个很好的例子是评级战。 在媒人的评分战中,同时出现了几个新规则:
  • 团队必须在评分方面保持平衡(团队之间的玩家总评分之差不应超过给定值);
  • 玩家之间的评分差异应最小(青铜联赛的玩家不应与钻石的玩家进行战斗)。


钻石联赛球员个人资料示例

第一条规则是通过修改评估函数来实现的:增加了超过额定值的最大允许差额的罚款。 第二条规则是通过更改将合适的玩家从队列中拉出的功能来实现的。

这种方法的缺点是速度慢。 与以前的版本相比,即使进行了许多优化,当前版本的运行速度也要慢大约10倍。 顺便说一下,关于优化。 游戏的大多数服务器(网络和物理服务器除外)都是用Python编写的。 平衡器用C ++重写,并并行化到许多线程。 在Python中,加号代码中包含了形成命令的请求。 此外,每个流独立地开始退火方法。 一旦某个线程找到了解决方案,其余线程就会停止搜索过程,并将找到的解决方案返回给Python。


RU服务器上的等待时间和队列大小(正常战斗中为5秒,评级战斗中为10秒)

随着在线增长的增长,平衡器的负载也随之增加。 今年秋天,当RU服务器上的在线服务器达到12万台(在“疯狂游戏”事件期间)时,平衡器便无法应对。 作为临时措施,我们禁用了一些规则,这使我们可以减少负载。 为避免将来出现此类问题,我们将媒人分发了。

评分系统



钻石联赛最佳球员,2019年4月21日

在许多MMO游戏中,除了随机打架外,还存在评级/排名/等。 这种模式的主要思想是:对手不是随机搜索的,而是技巧合适的。 如果您是一名技能高手,那么您将与相同的技能高手一起玩,反之亦然,如果您不知道如何玩,那么您将面临同样的新手。

在赛季开始之初,玩家将进行一系列的标准比赛,其结果决定了他的起始位置。 然后,取决于游戏的进一步成功,玩家的排名上升或下降。 首先,创建Blitz中的评分系统以实现适当的平衡。 它提高了玩家的技能,并且实际上与玩的游戏次数无关。

要进行等级之战,必须立即解决两个问题。 首先,有必要选择一个评分系统(应该按照什么原则对玩家进行评分)。 其次,有必要对平衡器进行改进,使其在考虑到评级限制的情况下收集战斗信息。

评分系统的主要要求是能够准确确定玩家的水平。 为了评估一个或另一个评级系统的工作效率,创建了一个模拟器,在该模拟器的输入中提交了战斗历史和所选评级系统,在输出端,获得了系统的准确性。

准确性计算如下:

  • 所有球员都被赋予了起始等级;
  • 根据每个战斗的结果,将根据所选系统重新计算参与该战斗的玩家的等级;
  • 在每次战斗之前,系统都会尝试预测哪支球队会获胜。
  • 结果,计算出系统给出正确预测的战斗百分比。


最受欢迎的评分计算系统: winrateEloGlickoTrueSkill 。 Winrate是通常的胜利百分比。 Elo是一种评分系统,最初是为两个人(象棋等)的游戏创建的。 在该系统中,根据对手的等级,给玩家一个/赢得/失去一定数量的积分。 Glicko通常与Elo类似,但也要考虑玩家不活动了多长时间。 TrueSkill是Microsoft专有的分级系统,其中每个玩家都有两个参数:分级和系统对此分级的置信度。

在开发第一个版本的评分战时,我们考虑了winrate和Elo(适用于团队游戏的几种选择)以及简单的计分系统(在评分系统中,玩家始终获得固定数量的评分分以获得胜利,被带走以击败)。



Elo系统显示了最好的结果,其中Ra是玩家评分,Rb是对战球队的总评分与该玩家团队的总评分之间的差额,但玩家本人除外。

发布后我们遇到的主要困难是:

  • 玩家之间的排名差异太大;
  • 球员得分(进入联盟)的可预测速度差。

第一个问题由于以下事实而无法完全解决:技能球员太少,他们必须等待很长一段时间才能开始战斗,而且经常看到团队中的球员实力下降。 为了减轻影响,我们仅在黄金时段(即在服务器上玩的人数最多的时候)提供分级战。

我们通过引入一个减慢因子解决了第二个问题(也就是说,玩家离平均评分越远,他升或降到其以下就越困难)。

我们还尝试了各种方法来提高评分系统的质量。 在第一个版本中,为了更改等级,我们仅使用有关胜利/失败的信息。 但是我们有团队合作的游戏,并非总是某个特定球员的好行为会导致整个团队的胜利。 也就是说,即使该球员打得很好并且球队输了,该球员的得分也要与其他所有球员相同。 为了防止这种情况,我们开始尝试考虑玩家在战斗中的个人行为。

为此,我们尝试使用机器学习:我们收集了各种因素,并尝试训练模型以根据玩家在战斗中的行动来预测球队的胜利/失败,然后使用该模型来确定等级奖励系数(即,如果球队输了,但玩家的行为是相似的有关获胜玩家的行为,请给此类玩家额外的奖励)。


获胜球队中表现出色的球员获得+40评分。 +10不好

我们能够建立一个好的模型,其结果要比当前模型好得多,但是存在一个困难(这常常会破坏机器学习问题中的一切)。 该模型很好,但有时会出现人们容易看到的错误。 周期性地存在这样的情况,即从人的角度来看,玩家表现出良好的成绩,而从模型的角度来看,其获得的奖金却很少,反之亦然。

结果,我们放弃了ML模型,并采用了更简单的手动公式。 该公式仅考虑战斗经验,不考虑胜利,x2和其他奖励。 尽管它比ML模型的结果略低,但结果却非常不错。

结论


  • 基于退火模拟方法的平衡器使我们能够从解决方案的描述(如何组建团队)转移到需求的描述(不应违反哪些条件);
  • 在团队等级战中,考虑到玩家在战斗中的个人动作,改进的Elo系统表现得很好。
  • 不一定总是应用复杂的机器学习方法(特别是当人对结果的解释和理解很重要时)。

我们将继续开发和改进平衡器。 我们几乎打败了阶级失衡的负面印象。 我们的球员要注意的主要问题是技巧,动荡和afk球员的失衡。 这是一个严峻的挑战,我们将继续在这些领域开发平衡器。

如果您对WoT Blitz中的平衡器有任何疑问/建议,请在评论中(或在我们的论坛上 )退订。

Source: https://habr.com/ru/post/zh-CN458866/


All Articles