如何找到兼具对战均衡性与玩家级时效性的共同对手?
寻找同时满足均衡性与时效性的对手
我需要找到同时满足以下两个条件的对手:
- 两玩家对战该对手的次数最均衡(此处「最常见」定义为次数均衡,而非总对战次数多,比如玩家1、2分别对战玩家3达99次和1次,更倾向选A、B均对战49次的玩家4)
- 两玩家对战该对手的时间均为最近
玩家A与B的对战原始数据
| 玩家 | 对手 | 距今天数 |
|---|---|---|
| A | C | 1 |
| A | C | 2 |
| A | D | 10 |
| A | F | 100 |
| A | F | 101 |
| A | F | 102 |
| A | G | 1 |
| B | C | 1 |
| B | C | 2 |
| B | D | 10 |
| B | F | 100 |
| B | F | 101 |
| B | F | 102 |
| B | G | 1 |
| B | G | 2 |
| B | G | 3 |
| B | G | 4 |
| B | G | 5 |
| B | G | 6 |
| B | G | 7 |
| B | G | 8 |
均衡度衡量函数
为衡量对战次数的均衡性,编写了如下函数:
import numpy as np from collections import Counter def balanceness(array: np.ndarray): classes = [(c, cnt) for c, cnt in Counter(array).items()] m = len(classes) n = len(array) H = -sum([(cnt / n) * np.log((cnt / n)) for c, cnt in classes]) return H / np.log(m)
该函数符合预期,示例:
>>> balanceness(array=np.array([0, 0, 0, 1, 1, 1])) 1.0
各对手均衡度计算结果
| 对手 | 均衡度 | 对战次数 |
|---|---|---|
| C | 1 | 4 |
| D | 1 | 2 |
| F | 1 | 6 |
| G | 0.5032583347756457 | 9 |
从结果看,对手F的均衡性最佳,但A与B对战F的时间相对久远。
时效性权重函数尝试
为加入时效性因子,编写了权重函数:
def weight(days_ago: int, epilson: float=0.005) -> float: return np.exp(-1 * days_ago * epilson)
求和各对手的加权对战次数后得到结果:
| 对手 | 均衡度 | 对战次数 | 加权对战次数 |
|---|---|---|---|
| C | 1 | 4 | 3.9701246258837 |
| D | 1 | 2 | 1.90245884900143 |
| F | 1 | 6 | 3.62106362790388 |
| G | 0.5032583347756457 | 9 | 8.81753570603108 |
此时对手C成为「近期均衡对手」,但该方法忽略了玩家层面的时效性——可能出现玩家1近期多次对战玩家3,而玩家2对战玩家3的时间却十分久远的情况。
最终需求
现需找到同时满足以下两个条件的对手:
- 两玩家对战次数最均衡
- 两玩家对战该对手的时间均为最近
内容的提问来源于stack exchange,提问作者HJA24
相关产品推荐
相关产品推荐

