简单讨论一下暴雪能不能写代码来给你匹配劣势对局操控胜率
3月10日
点火63 回复176
最近看到很多人说暴雪根本做不到写代码给你按照卡组匹配对应卡组来进行控制胜率,还有很多人说暴雪能做到但是逻辑实在是错漏百出。于是我就说一个很简单但也很成熟的方案吧。这个只是来证明一下暴雪有能力写这种机制只是不想干而已,因为mmr够用了。
说实话你甚至都可以把我下面这段话扔给GPT o1或者deepseek r1让他去帮你写出来这个算法,只要你愿意自己去驴子网之类的地方扒点对局去近似玩家对战数据,你也可以做一个这样的算法玩玩。
首先把所有玩家卡组库里面的卡组要么抽样要么全部扔给kmean,DBSCAN之类的聚类算法去做一个卡组大类分类,比如把不同变种的圣契骑聚为一个类。这个算法已经很成熟了而且跑起来很快。不过把卡组中的每张卡处理成高维向量这一步可能需要训练一个嵌入层embedding来做处理,不过也相对简单因为每张卡就是天然的词元token。然后就是很简单的把卡组向量等于包含的每张卡的向量之和应该就没什么问题可以开始聚类了。
然后根据玩家的实际对局来给聚类聚出来的类别进行优劣胜率分析,大概会生成一张2d胜率表。优劣胜率分析的原始数据就是玩家的对局,比如a玩家用圣契骑类卡组打宇暗类卡组的胜率是70%,那么我们也会把这个胜率记成一个或数个样本放入生气气对宇暗大类胜率分析中等等,因此简单可以用平均数,复杂点可以模拟一个抽样分布比如正态什么的然后回推整个卡组大类之间分布,不过一般平均数弄一个2d表就够用了。
然后系统就可以很简单的根据这张表给你分配对局了,看看你的卡组,看看匹配池里的人玩的卡组哪些打你胜率高,直接在mmr的基础上微调就行,mmr控制你匹配到的人的上下限,在这个范围内按照胜率表排序一下或者干脆给每类卡组存一个最小堆,来确定到底匹给你什么卡组,反正无论怎么搞基本也就O(nlogn)也不是很高。不过还有别的匹配时长之类的指标,可能就算想针对但是一时半会没有玩针对卡组的人,所以没办法给你匹个不针对的。反正次数多了,你的胜率一定会回归系统想让你的胜率,毕竟炉石又没办法ban卡组,这个方法只会在卡组新出来没几天的时候比较失灵。
更甚者可以基于此类聚类算法去做更进一步的单卡对卡组致胜率的统计,然后进一步通过控制抽卡来决定胜率。
不过我还得说一句,卡组对卡组胜率暴雪是可以搞的,不过这种东西虽然非常简单可行,但是一般来讲不会有多少必要就是了,一般mmr已经足够搞人胜率到一个合理范围了,没必要再给自己加活。
额外Q&A:
1. 同一张卡在不同卡组里的作用可能是不同的,要怎么消歧呢?
目前的方案是一个简单有效成本低的方案。至于同一张卡在不同卡组的目的这件事情,首先训练embedding的时候只要维度选高一点,评判函数选贴合一点基本上是可以让输出向量自动从某种角度上代表这张卡的所有功能的集合的。如果我们想真正一定程度上解决这个问题,真正做到考虑到单卡在卡组中的作用变化,那么就需要在embedding的基础上继续加一个transformer的QK层,也就是所谓的attention来处理单卡的向量(含义)在不同卡组(语境)中的偏移了,只不过这一步一般来讲除非你要做单卡对于环境情境的作用分析,来去进一步的做类似卡组自动挖掘工具之类的东西,要不一般是完全没必要的。主要还是同一张卡在不同卡组中含义巨大变化的情况太过少见,一般综合考虑其所有含义就够用来做卡组胜率控制了。
2. 为什么目前用AI来打炉石的尝试似乎并不成功?
应该还是样本量不足的缘故,目前比较成功的都是各种heuristic search类的,这种一般是靠人去建立heuristic来进行情景以及最优解分析的,大多数人所谓的ai其实是llm,相对来讲并不会有很多数据来训练关于炉石的规则,就更别提关于每个卡牌的特殊打法了。不过我相信专门去从炉石生成一个数据集,然后训练一个llm的话,还是可以做到的,只是成本很大而已
说实话你甚至都可以把我下面这段话扔给GPT o1或者deepseek r1让他去帮你写出来这个算法,只要你愿意自己去驴子网之类的地方扒点对局去近似玩家对战数据,你也可以做一个这样的算法玩玩。
首先把所有玩家卡组库里面的卡组要么抽样要么全部扔给kmean,DBSCAN之类的聚类算法去做一个卡组大类分类,比如把不同变种的圣契骑聚为一个类。这个算法已经很成熟了而且跑起来很快。不过把卡组中的每张卡处理成高维向量这一步可能需要训练一个嵌入层embedding来做处理,不过也相对简单因为每张卡就是天然的词元token。然后就是很简单的把卡组向量等于包含的每张卡的向量之和应该就没什么问题可以开始聚类了。
然后根据玩家的实际对局来给聚类聚出来的类别进行优劣胜率分析,大概会生成一张2d胜率表。优劣胜率分析的原始数据就是玩家的对局,比如a玩家用圣契骑类卡组打宇暗类卡组的胜率是70%,那么我们也会把这个胜率记成一个或数个样本放入生气气对宇暗大类胜率分析中等等,因此简单可以用平均数,复杂点可以模拟一个抽样分布比如正态什么的然后回推整个卡组大类之间分布,不过一般平均数弄一个2d表就够用了。
然后系统就可以很简单的根据这张表给你分配对局了,看看你的卡组,看看匹配池里的人玩的卡组哪些打你胜率高,直接在mmr的基础上微调就行,mmr控制你匹配到的人的上下限,在这个范围内按照胜率表排序一下或者干脆给每类卡组存一个最小堆,来确定到底匹给你什么卡组,反正无论怎么搞基本也就O(nlogn)也不是很高。不过还有别的匹配时长之类的指标,可能就算想针对但是一时半会没有玩针对卡组的人,所以没办法给你匹个不针对的。反正次数多了,你的胜率一定会回归系统想让你的胜率,毕竟炉石又没办法ban卡组,这个方法只会在卡组新出来没几天的时候比较失灵。
更甚者可以基于此类聚类算法去做更进一步的单卡对卡组致胜率的统计,然后进一步通过控制抽卡来决定胜率。
不过我还得说一句,卡组对卡组胜率暴雪是可以搞的,不过这种东西虽然非常简单可行,但是一般来讲不会有多少必要就是了,一般mmr已经足够搞人胜率到一个合理范围了,没必要再给自己加活。
额外Q&A:
1. 同一张卡在不同卡组里的作用可能是不同的,要怎么消歧呢?
目前的方案是一个简单有效成本低的方案。至于同一张卡在不同卡组的目的这件事情,首先训练embedding的时候只要维度选高一点,评判函数选贴合一点基本上是可以让输出向量自动从某种角度上代表这张卡的所有功能的集合的。如果我们想真正一定程度上解决这个问题,真正做到考虑到单卡在卡组中的作用变化,那么就需要在embedding的基础上继续加一个transformer的QK层,也就是所谓的attention来处理单卡的向量(含义)在不同卡组(语境)中的偏移了,只不过这一步一般来讲除非你要做单卡对于环境情境的作用分析,来去进一步的做类似卡组自动挖掘工具之类的东西,要不一般是完全没必要的。主要还是同一张卡在不同卡组中含义巨大变化的情况太过少见,一般综合考虑其所有含义就够用来做卡组胜率控制了。
2. 为什么目前用AI来打炉石的尝试似乎并不成功?
应该还是样本量不足的缘故,目前比较成功的都是各种heuristic search类的,这种一般是靠人去建立heuristic来进行情景以及最优解分析的,大多数人所谓的ai其实是llm,相对来讲并不会有很多数据来训练关于炉石的规则,就更别提关于每个卡牌的特殊打法了。不过我相信专门去从炉石生成一个数据集,然后训练一个llm的话,还是可以做到的,只是成本很大而已
登录后发表评论
全部评论 176条
按时间排序

还没有评论