1. 程式人生 > >帶黑洞的隨機遊走問題

帶黑洞的隨機遊走問題

方程 線性方程組求解 floor initial oop 黑洞 amp answer run

對於無黑洞的隨機遊走問題可以使用線性方程組求解,對於有黑洞的隨機遊走問題就無法使用線性方程組進行求解了。
有黑洞的隨機遊走問題舉例:

  • 隨機給定一個魔方狀態,隨機旋轉期望通過多少步才能旋轉到目標狀態?
  • 醉漢回家問題:一個人在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]))

帶黑洞的隨機遊走問題