鞅的停时定理

鞅的停时定理

这里只考虑离散的鞅

如果随机过程 \(X=\{X_0,X_1,X_2,\dots,X_n\}\) 满足 \(E(|X_n|)<\infty\)\(E(X_{n+1}|X_0,X_1,X_2,\dots,X_n)=E(X_n)\),则 \(X\) 为鞅

如果随机过程 \(Y=\{Y_1,Y_2,\dots,Y_n\}\)\(X\) 的鞅,则 \(Y_n\) 仅与 \(X_{0\sim n}\) 有关且 \(E(Y_{n+1}|X_0,X_1,X_2,\dots,x_n)=E(Y_n)\)

另一种表述方式是 \(E(Y_{n+1}-Y_n|X_0,X_1,\dots,X_n)=0\)

通俗解释就是随机变量的期望不是正无穷,且不会受到前面已知的观测值的影响,保持不变

它最初是在赌博问题中被提出的,在公平赌博问题中,如果游戏进行无限轮,不存在一种策略能使一方获利

停时

但现实中不会有无限轮的游戏,我们总会在某个时刻达到目标时选择停下,而停下时的期望由于有条件限制,因此不一定和原来相同

若随机变量 \(T\) 满足 \(P(T<\infty)=1\),且 \(T\) 的值只会受到 \(X_0,X_1,\dots,X_T\) 的影响,则 \(T\) 为停时

停时首先得停下,因此不能是 \(\infty\),且肯定不能根据以后的结果来决定现在是否停止,因为后面的结果仍未知

鞅的停时定理

\(Y=\{Y_1,Y_2,\dots,Y_n\}\) 是 $X={X_0,X_1,X_2,\dots,X_n} $ 的鞅,\(T\) 是停时,如果满足三个条件之一:

  • \(Y_i\) 一致有界,\(|Y_i|<K\)
  • \(T\) 有界,\(P(T<K)=1\)
  • \(E(T)<\infty\),且存在 \(K<\infty\)\(E(Y_{i+1}-Y_i|X_0,X_1,\dots,X_i)<M\)

\(E(Y_T)=E(Y_0)\)

证明不会,OI 中大多数题都满足第二个条件,一般可以用

不过停时定理是充分条件而不必要,有可能三个情况都不满足但 \(E(Y_T)=E(Y_0)\)

势能函数

一般应用时,我们求的是 \(E(T)\)

构造势能函数 \(\Phi(X_i)\),使得 \(E(\Phi(X_{n+1})-\Phi(X_{n})|X_0,X_1,\dots, X_n)=-1\),通俗解释就是每变化一步期望少 \(1\)

\(Y_i=\Phi(X_i)+i\),则 \(E(Y_{n+1}-Y_{n}|X_0,X_1,\dots,X_n)=E(\Phi(X_{n+1})+n+1)-E(\Phi(X_n)+n)=0\)

所以 \(Y\)\(X\) 的鞅,若停时定理满足,则 \(E(Y_T)=E(Y_0)\)

\(E(Y_T)=E(\Phi(X_T)+T)=E(\Phi(X_T))+E(T)=E(Y_0)=E(\Phi(X_0))\)

\(E(T)=E(\Phi(X_0))-E(\Phi(X_T))\)

如果这个势能函数满足上述条件且终止状态 \(\Phi(X_T)\) 的取值与其它的不同,通常是最大/最小值

则由于我们能定义 \(\Phi(X_0)\) 为常数,且终止状态确定,\(E(T)=\Phi(X_0)-\Phi(X_T)\)

目标是找到这样的势能函数,通常需要推大量式子,要注意边界情况,结合实际意义判断

例题

CF1025G Company Acquisitions

有多个菊花图,设局面 \(A_i\)\(m\) 个菊花的大小分别是 \(a_1,a_2,\dots,a_m\),设 \(\Phi(A_i)=\sum_{j=1}^m f(a_j)\)\(f(x)\) 是我们要自定义的函数

\[E(\Phi(A_{n+1})|A_0,A_1,\dots,A_{n})=\sum_{i=1}^m \frac 1 m((a_i-1)f(1)+\sum_{j\neq i}\frac{1}{m-1}f(a_j+1)+\frac{m-2}{m-1}f(a_j)) \\ = \sum_{i=1}^m \frac 1 m((a_i-1)f(1)+f(a_i+1)+(m-2)f(a_i)) \]

枚举当前要被拆的是 \(i\),把 \(i\) 的根放到 \(j\) 子树内,然后把每个连通块的贡献拆开计算

\[E(\Phi(A_{n+1})-\Phi(A_n)|A_0,A_1,\dots,A_n)=-1 \\ E(\Phi(A_{n+1}))=E(\Phi(A_n))-1 \\ \sum_{i=1}^m \frac 1 m((a_i-1)f(1)+f(a_i+1)+(m-2)f(a_i))=\sum_{i=1}^m(f(a_i)-\frac 1 m) \]

由于 \(f(x)\) 是我们自己决定的,因此直接让

\[\frac 1 m((a_i-1)f(1)+f(a_i+1)+(m-2)f(a_i))=f(a_i)-\frac 1 m \\ (x-1)f(1)+f(x+1)-2f(x)=-1 \]

化简发现 \(m\) 恰好消掉了,\(f(x+1)=2f(x)-1-(x-1)f(1)\)

\(f(1)\) 很讨厌,但我们可以自己定义,令 \(f(1)=0\),则 \(f(x+1)=2f(x)-1\),解得 \(f(x)=1-2^{x-1}\)

\(f(x)\) 单调递减,终止状态为 \(\Phi(A_T)=f(n)\),发现它肯定为最小值,因此符合要求,初始状态题目已经给出

不过有些时候势能函数不一定要这么拆开定义,也有可能推式子时 \(m\) 无法消掉,需要代入合适的初始值

int main()
{
    read(n);
    for(int i = 1; i <= n; ++i) 
    {
        read(a[i]);
        a[i] > 0 ? ++num[a[i]] : ++num[i]; 
    }
    for(int i = 2; i <= n; ++i) f[i] = (f[i - 1] + f[i - 1] + mod - 1) % mod;
    for(int i = 1; i <= n; ++i) ans = (ans + f[num[i]]) % mod;
    cout << (ans - f[n] + mod) % mod;
    return 0;
}

CF1349D Slime and Biscuits

和上一题挺类似的,还是设局面 \(A_i\) 中每个人的饼干数是 \(a_1,a_2,\dots,a_n\),饼干总数是 \(s\)\(\Phi(A_i)=\sum_{j=1}^n f(a_j)\),要求出 \(f(x)\)

\[E(\Phi(A_{n+1})|A_0,A_1,\dots,A_n)=\sum_{i=1}^n \frac {a_i} s(f(a_i-1)+\sum_{j\neq i}\frac 1 {n-1}f(a_j+1)+\frac{n-2}{n-1}f(a_j)) \\ = \sum_{i=1}^n \frac{a_i}s f(a_i-1)+\frac{s-a_i}{s(n-1)}f(a_i+1)+\frac{(n-2)(s-a_i)}{s(n-1)}f(a_i) \]

\[E(\Phi(A_{n+1}))=E(\Phi(A_n))-1 \\ \sum_{i=1}^n \frac{a_i}s f(a_i-1)+\frac{s-a_i}{s(n-1)}f(a_i+1)+\frac{(n-2)(s-a_i)}{s(n-1)}f(a_i)=\sum_{i=1}^n (f(a_i)-\frac{a_i}s) \]

这里的 \(-1\) 拆成 \(\sum \frac{a_i}s\)\(\sum \frac 1 n\) 都行,目的是使等式两边形式类似,都在求和号内,令

\[\frac{a_i}s f(a_i-1)+\frac{s-a_i}{s(n-1)}f(a_i+1)+\frac{(n-2)(s-a_i)}{s(n-1)}f(a_i)=f(a_i)-\frac{a_i}s \\ \frac x sf(x-1)+\frac{s-x}{s(n-1)}f(x+1)+\frac{(n-2)(s-x)}{s(n-1)}f(x)+\frac x s = f(x) \\ f(x+1)=(\frac{s(n-1)}{s-x}-(n-2))f(x)-\frac{x(n-1)}{s-x}f(x-1)-\frac{x(n-1)}{s-x} \]

式子长的很丑,将 \(x=1\) 代入得到 \(f(1)=f(0)\),于是令 \(f(1)=f(0)=0\),递推即可,注意当 \(x=s\) 时无定义

写出 \(f(x)\) 的差分发现 \(f(x)\) 递减,终态 \(\Phi(A_T)=f(n)\),需证明 \(f(a+b)<f(a)+f(b)\),等价于证 \(f(a+1)<f(a)+f(1)\),而 \(f(1)=0\)\(f(x)\) 递减,所以终态的势能函数是最小的,唯一

int main()
{
    read(n);
    for(int i = 1; i <= n; ++i) read(a[i]), sum += a[i];
    for(ll i = 1; i < sum; ++i)
    {
        ll tmp = (n - 1) * qmi(sum - i, mod - 2) % mod;
        f[i + 1] = add(add(tmp * sum % mod, mod - n + 2) * f[i] % mod, mod - tmp * i % mod * f[i - 1] % mod, mod - tmp * i % mod);
    }
    for(int i = 1; i <= n; ++i) ans = add(ans, f[a[i]]);
    cout << add(ans, mod - f[sum]);
    return 0;
}
posted @ 2024-05-27 22:27  KellyWLJ  阅读(458)  评论(0)    收藏  举报