一个节点的质量不能只看它的延迟,还要考虑它的稳定性。
就算一个节点的延迟再低,只要不稳定,看视频总是会卡顿。
容忍度
好在 URL Test 引入了容忍度(tolerance)。
即如果另一个节点的延迟与当前选择的节点延迟的差值大于容忍度,则选择另一个节点。
似乎容忍度就能解决稳定性的问题了,如果所有节点的稳定性都很好,容忍度就要低一些,反之则高一些。
但问题是:容忍度应该具体取多少?
新方法
实际上,我们不需要知道容忍度是多少,甚至不需要容忍度。
在数学中,标准差是用来衡量数据离散程度的工具,而它同样也能衡量一个节点的稳定性。
再通过和其75% 位数进行加权平均运算,不仅解决了容忍度太「硬」的策略,还能让用户自己对稳定性和速度做取舍。
数学公式
为简化公式,对于实数数列 的标准差表示为 ,方差表示为 ,75% 位数表示为 。
节点延迟 (一行代表一个节点,一列代表一次测速)、权重 与极小值 :
计算每个节点的延迟的标准差 和75% 位数 并归一化:
计算每个节点的分数 :
最后得到的分数越低,说明节点质量越高。
结尾
对于该算法的程序我放在了GitHub里。
如果有什么不严谨的地方欢迎指出
参考资料
- https://wiki.metacubex.one/en/config/proxy-groups/url-test/?h=tolerance#tolerance
- https://zh.wikipedia.org/wiki/%E6%A8%99%E6%BA%96%E5%B7%AE
- https://zh.wikipedia.org/wiki/%E6%96%B9%E5%B7%AE
- https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E4%BD%8D%E6%95%B0
- https://arxiv.org/abs/1607.06450
- https://zh.wikipedia.org/wiki/%E5%8A%A0%E6%AC%8A%E5%B9%B3%E5%9D%87%E6%95%B8