带黑洞的随机游走问题

Posted weiyinfu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带黑洞的随机游走问题相关的知识,希望对你有一定的参考价值。

对于无黑洞的随机游走问题可以使用线性方程组求解,对于有黑洞的随机游走问题就无法使用线性方程组进行求解了。
有黑洞的随机游走问题举例:

  • 随机给定一个魔方状态,随机旋转期望通过多少步才能旋转到目标状态?
  • 醉汉回家问题:一个人在x点处喝醉了,在N维空间中游走,它回到出发点的概率是多少?求p(N)

zhihu
一个整型数字x=6000,每次增长101的概率为49.32%,每次减少100元的概率为50.68%,问最终x&tt;7000的概率是多少?

显然,这个问题相当于一个随机游走问题,一共有100~7000共6900个结点,每个结点x有49.32%的概率走向x+101,有50.68%的概率走向x-100,当x<100或者x>=7000时游戏停止。

import numpy as np
import tensorflow as tf

lose = 0.4932
win = 1 - lose
win_value = 101
lose_value = 100
init_value = 6000
# 闭区间
ceil_value = 7000
floor_value = 100
A = np.zeros((7102, 7102))
for i in range(A.shape[0]):
    if ceil_value >= i >= floor_value:
        A[i - lose_value, i] = lose
        A[i + win_value, i] = win
    if not ceil_value >= i >= floor_value:
        A[i, i] = 1

A = tf.constant(A, dtype=np.float32)
p = np.zeros((A.shape[0], 1), dtype=np.float32)
p[init_value, 0] = 1
p = tf.Variable(p)
assign = tf.assign(p, tf.matmul(A, p))
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(100):
        sess.run(assign)
        print(i)
    p_value = sess.run(p)
    print(np.sum(p_value[ceil_value:]), np.sum(p_value[floor_value:ceil_value]), np.sum(p_value[:floor_value]))

亏本这么少,是因为初始状态给的6000离7000非常近,本钱足够多,几乎不会亏本。
这种问题就像是一个带黑洞的随机游走问题,这个问题有两个黑洞,一个是足够大止盈黑洞一个是足够小止损黑洞,而中间部分几乎是慢慢往两边耗散的,最终中间部分应该是趋近于0。就像光线在一个管子里面来回反射,最后终将会从管子两边射出去,管子里面变得漆黑一片。由此推出:继续循环的概率这个数字可以看做此迭代结果的准确率指标。
在上面迭代过程中,只是简单的迭代,实际上可以使用快速幂进行加速。

import numpy as np
import tensorflow as tf

lose = 0.4932
win = 1 - lose
win_value = 101
lose_value = 100
init_value = 6000
# 闭区间
ceil_value = 7000
floor_value = 100
A = np.zeros((7102, 7102))
for i in range(A.shape[0]):
    if ceil_value >= i >= floor_value:
        A[i - lose_value, i] = lose
        A[i + win_value, i] = win
    if not ceil_value >= i >= floor_value:
        A[i, i] = 1
A = tf.Variable(A, dtype=np.float32)
assign = tf.assign(A, tf.matmul(A, A))
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(1000):
        sess.run(assign)
        print(i)
    a = sess.run(A)
    p = a[:, init_value].reshape(-1)
    print("overflow", np.sum(p[ceil_value:]), "loop", np.sum(p[floor_value:ceil_value]), "downflow", np.sum(p[:floor_value]))

以上是关于带黑洞的随机游走问题的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中的网格中模拟二维随机游走并使用 ggplot 绘图

图上随机游走

对随机游走问题期望距离的估计

理解随机游走

Loj #2542. 「PKUWC2018」随机游走

U22256随机游走