Blog

一座大型历史建筑,拥有华丽的建筑细节,带有一个圆顶塔楼,位于宁静的河边。建筑周围环绕着树木,展现出欧洲巴洛克或新古典主义的设计风格。【数学】如何选择合适的节点

一个节点的质量不能只看它的延迟,还要考虑它的稳定性

就算一个节点的延迟再低,只要不稳定,看视频总是会卡顿。

容忍度

好在 URL Test 引入了容忍度(tolerance)。

即如果另一个节点的延迟与当前选择的节点延迟的差值大于容忍度,则选择另一个节点。

似乎容忍度就能解决稳定性的问题了,如果所有节点的稳定性都很好,容忍度就要低一些,反之则高一些。

但问题是:容忍度应该具体取多少?

新方法

实际上,我们不需要知道容忍度是多少,甚至不需要容忍度。

在数学中,标准差是用来衡量数据离散程度的工具,而它同样也能衡量一个节点的稳定性

再通过和其75% 位数进行加权平均运算,不仅解决了容忍度太「硬」的策略,还能让用户自己对稳定性和速度做取舍。

数学公式

为简化公式,对于实数数列 x=(x1,x2,,xi)x = (x_{1}, x_{2}, \dots, x_{i})标准差表示为 S(x)S(x)方差表示为 V(x)V(x)75% 位数表示为 Q(x)Q(x)

节点延迟 DD(一行代表一个节点,一列代表一次测速)、权重 kk极小值 ϵ\epsilon

D=[d1,1d1,2d1,jd2,1d2,2d2,jdi,1di,2di,j]D=\begin{bmatrix} d_{1,1} & d_{1,2} & \dots & d_{1,j}\\ d_{2,1} & d_{2,2} & \dots & d_{2,j}\\ \vdots & \vdots & \ddots & \vdots\\ d_{i,1} & d_{i,2} & \dots & d_{i,j} \end{bmatrix} k[0,1]k \in [0, 1] ϵ=1×102\epsilon = 1 \times 10^{-2}

计算每个节点的延迟的标准差 σi\sigma_{i}75% 位数 μi\mu_{i} 并归一化:

σi=S(Di)σminV(σ)+ϵ\sigma_{i} = \frac{S(D_{i})-\sigma_{min}}{\sqrt{V(\sigma) + \epsilon}} μi=Q(Di)μminV(μ)+ϵ\mu_{i} = \frac{Q(D_{i})-\mu_{min}}{\sqrt{V(\mu) + \epsilon}}

计算每个节点的分数 sis_{i}

si=kμi+(1k)σis_{i} = k\mu_{i} + (1-k)\sigma_{i}

最后得到的分数越低,说明节点质量越高。

结尾

对于该算法的程序我放在了GitHub里。

如果有什么不严谨的地方欢迎指出

参考资料

  1. https://wiki.metacubex.one/en/config/proxy-groups/url-test/?h=tolerance#tolerance
  2. https://zh.wikipedia.org/wiki/%E6%A8%99%E6%BA%96%E5%B7%AE
  3. https://zh.wikipedia.org/wiki/%E6%96%B9%E5%B7%AE
  4. https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E4%BD%8D%E6%95%B0
  5. https://arxiv.org/abs/1607.06450
  6. https://zh.wikipedia.org/wiki/%E5%8A%A0%E6%AC%8A%E5%B9%B3%E5%9D%87%E6%95%B8

About

Avatar

Mark Ivory

一个草稿本而已

Series