博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
带黑洞的随机游走问题
阅读量:7206 次
发布时间:2019-06-29

本文共 2387 字,大约阅读时间需要 7 分钟。

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

有黑洞的随机游走问题举例:

  • 随机给定一个魔方状态,随机旋转期望通过多少步才能旋转到目标状态?
    这个问题相当于有一个黑洞、有限状态的随机游走问题。只要把魔方还原了,那么游戏就结束了。
  • 醉汉回家问题:一个人在x点处喝醉了,在N维无限空间中游走,它回到出发点的概率是多少?求p(N)
    这个问题相当于有一个黑洞、无限空间的随机游走问题。
  • 史莱姆自爆问题:每个时刻史莱姆有1/3概率分裂,有1/3概率保持不变,有1/3概率死亡,问史莱姆期望有多少只?
    这个问题相当于一个黑洞、无限空间随机游走问题。

随机游走问题分类:

(有限空间+无限空间)×(有黑洞+无黑洞)

  • 有限空间无黑洞随机游走:求解线性方程组
  • 有限空间有黑洞随机游走:矩阵的N次幂
  • 无限空间无黑洞随机游走
  • 无限空间有黑洞随机游走:可能可以通过求解非线性方程解决

一个整型数字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 npimport tensorflow as tflose = 0.4932win = 1 - losewin_value = 101lose_value = 100init_value = 6000# 闭区间ceil_value = 7000floor_value = 100A = 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] = 1A = tf.constant(A, dtype=np.float32)p = np.zeros((A.shape[0], 1), dtype=np.float32)p[init_value, 0] = 1p = 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 npimport tensorflow as tflose = 0.4932win = 1 - losewin_value = 101lose_value = 100init_value = 6000# 闭区间ceil_value = 7000floor_value = 100A = 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] = 1A = 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]))

转载地址:http://exoum.baihongyu.com/

你可能感兴趣的文章
自由职业者:5步拿下新项目
查看>>
Delphi应用程序的调试(三)监视变量
查看>>
图片轮播效果
查看>>
页面生命周期步骤
查看>>
Android Timer编写方式深解
查看>>
微软、谷歌、百度等公司经典面试100题[第1-60题]——自己的实现[转]
查看>>
linux下使用yum安装Apache+php+Mysql+phpMyAdmin
查看>>
2012年总结
查看>>
下载输入python之小说下载器version2.0
查看>>
解决hibernate双向关系造成的一方重复执行SQl,或者死循环的问题
查看>>
用js如何获取file是否存在
查看>>
Extjs DateField onchange
查看>>
KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结
查看>>
Mysql 常用命令
查看>>
linux “命令行自动补全”功能用命令
查看>>
《JAVA与模式》之装修者模式
查看>>
关于JFace中的向导式对话框(WizardDialog类)
查看>>
Oracle数据库order by排序查询分页比不分页还慢问题解决办法
查看>>
学习NGUI前的准备NGUI的相关信息
查看>>
自制时间比对函数处理 比对过去时间与当前时间相差多少年多少月多少周多少分 多少秒...
查看>>