带黑洞的随机游走问题

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

  • 随机给定一个魔方状态,随机旋转期望通过多少步才能旋转到目标状态?
  • 醉汉回家问题:一个人在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]))

原文地址:https://www.cnblogs.com/weiyinfu/p/9699459.html

时间: 2024-08-18 16:08:47

带黑洞的随机游走问题的相关文章

随机游走的matlab实现

<span style="font-family:KaiTi_GB2312;font-size:14px;">%随机游走产生图像效果实现,随机游走类似布朗运动,就是随机的向各个方向走</span> <span style="font-family:KaiTi_GB2312;font-size:14px;"><span style="color: rgb(68, 68, 68); line-height: 21px;

随机游走

在python中,可以利用数组操作来模拟随机游走. 下面是一个单一的200步随机游走的例子,从0开始,步长为1和-1,且以相等的概率出现.纯Python方式实现,使用了内建的 random 模块: # 随机游走 import matplotlib.pyplot as plt import random position = 0 walk = [position] steps = 200 for i in range(steps): step = 1 if random.randint(0, 1)

bzoj 3143 随机游走

题意: 给一个简单无向图,一个人从1号节点开始随机游走(即以相同概率走向与它相邻的点),走到n便停止,问每条边期望走的步数. 首先求出每个点期望走到的次数,每条边自然是从它的两个端点走来. 1 /************************************************************** 2 Problem: 3143 3 User: idy002 4 Language: C++ 5 Result: Accepted 6 Time:736 ms 7 Memory:

[PKUWC 2018]随机游走

Description 题库链接 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\) ,求如果从 \(x\) 出发一直随机游走,直到点集 \(S\) 中所有点都至少经过一次的话,期望游走几步. 特别地,点 \(x\)(即起点)视为一开始就被经过了一次. 答案对 \(998244353\) 取模. Solution 不妨设 \(f_{i,S}\) 表示在点 \(i\) 时,要遍历集合

随机游走模型(RandomWalk Mobility)

随机游走模型由首先由爱因斯坦在1926年以数学方式描述.由于自然界中的许多实体会以不可预知的方式移动,因此随机游走模型用来描述这种不稳定的移动.在这种移动模型中,移动节点随机选择一个方向和速度来从当前位置移动到新的位置.新的速度和方向分别从预定义的范围[speedmin,speedmax]和[0,2].移动节点的每次移动会以恒定的时间间隔t或恒定的行进距离d进行,结束后会计算新的方向和速度.如果此模型的移动节点到达模拟边界,则它将从模拟边界"弹回",其角度有入射方向确定,然后沿着这条路

「Luogu4321」随机游走

「Luogu4321」随机游走 题目描述 有一张 \(n\) 个点 \(m\) 条边的无向图,\(Q\) 组询问,每次询问给出一个出发点和一个点集 \(S\) ,求从出发点出发随机游走走遍这个点集的期望步数. \(1 \leq n \leq 18, 1 \leq Q \leq 10^5\) 解题思路 : 听说是 \(\text{pkuwc2018d2t3}\) 加强版?但是原题时限是1s,各种卡不进去感觉一定要写 \(\text{Min-Max}\) 容斥,不过反正我今年听指导建议没报 \(\t

Loj #2542. 「PKUWC2018」随机游走

Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\),求如果从 \(x\) 出发一直随机游走,直到点集 \(S\) 中所有点都至少经过一次的话,期望游走几步. 特别地,点 \(x\)(即起点)视为一开始就被经过了一次. 答案对 $998244353 $ 取模. 输入格式 第一行三个正整数 \(n,Q,x\). 接下来 \(

[PKUWC2018]随机游走

题目大意 给你一颗树和根,每次询问从根出发,随机走到有连边的结点,经过集合S中所有结点的步数期望 \(1 \leq n \leq 18,1 \leq Q \leq 5000\) 解题思路 首先我们要求出所有集合\(S\)经过至少一个\(S\)中的点的步数期望(为最值反演铺垫) 令\(dp_{S,i}\)表示以i为起点,要经过集合S中至少一个点的步数期望 那么\(dp_{S,i}=\frac{1}{dig_i}(dp_{S,fa_i}+1+\sum_{v\in son}{dp_{S,v}+1})\

loj 2542 随机游走 —— 最值反演+树上期望DP+fmt

题目:https://loj.ac/problem/2542 因为走到所有点的期望就是所有点期望的最大值,所以先最值反演一下,问题变成从根走到一个点集任意一点就停止的期望值: 设 \( f[x] \),则 \( f[x] = \frac{f[fa]+1+\sum\limits_{v \in son} (f[v]+1)}{d[x]} \),其中 \( d[x] \) 是 \( x \) 的度数: 因为其实只和 \( fa \) 有关,所以套路是设 \( f[x] = K[x] * f[fa] +