帶黑洞的隨機遊走問題
阿新 • • 發佈:2018-09-25
方程 線性方程組求解 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]))
帶黑洞的隨機遊走問題