今天在查找马尔科夫链的过程中,在网上看到一个有意思的问题,于是用python将其做了实现和改进,题目如下:

如下图所示的迷宫共有9个格子,相邻格子有门相通,9号格子就是迷宫出口. 整个迷宫将会在5分钟后坍塌.
1号格子有一只老鼠,这只老鼠以每分钟一格的速度在迷宫里乱窜(它通过各扇门的机会均等)。求此老鼠在迷宫坍塌之前逃生的概率。如果这只老鼠速度提高一倍,则老鼠在迷宫坍塌之前逃生的概率能增加多少?


题目中可以看空间1为入口,空间9为出口,思路上既可以用迭代的方法,也可以用矩阵形式来编写 。

先是基于马尔科夫链的矩阵形式。马尔科夫链的本质是一个时间、状态离散的马尔可夫过程,本质特征就是,模型当前的状态,依赖也仅依赖于前面的那一个状态。
设S为状态分布矩阵,P为状态转移矩阵,那么老鼠的每一次移动,这个过程即是乘上P的过程,当前的状态分布矩阵,即是P与S的矩阵乘积。(此处S需以列向量的形式呈现)具体不在赘述,如果编程采用矩阵运算的形式,那么对于题中这样一个长度为9的状态分布矩阵,就需要用到9*9的状态转移矩阵来计算,如果迷宫变大了,矩阵将会变得非常大。

那么从迭代的思路来看呢:
在初始状态的情况下,老鼠所在的位置,空间状态概率被记为1,其余位置的概率为零。
现在老鼠只有两个选择,要么去2,要么去4,在机会均等的情况下,那么下一个状态(也就是老鼠动一步的情况下),老鼠到达2和4的概率都是0.5,而老鼠留在1的概率为0,所以2、4的当前状态的概率都变成了0.5,而1的当前状态的概率,变成了0。
现在要进行下一次移动,又会面临新的选择,老鼠每一次的移动,就以此类推。

我们抛开确定的状态,从整体任选一个状态。如果老鼠的当前位置处于四个角上,即周围存在两个可以去的空间,那么移动机会均等的情况下,去往每一个空间的可能性为1/2。如果老鼠当前位于边上,周围就有三个可以去的空间,那么这个概率就变成了1/3,以此类推,内部的话就会有四个空间,概率是1/4。

然后我们再考虑,从上一个状态到达当前状态的概率是多少呢?那就要看,当前位置,老鼠可能是从哪里来的。如果老鼠来源的那个空间,周围有三个可以去的空间,那么现在空间的概率,就是老鼠来源空间概率的1/3,当然,当前空间不仅仅只会有这一个老鼠来源,会有很多个,那么当前空间的概率,就是这些来源的累积。

除此以外,要考虑几个点:老鼠走到出口后,是不会再动的,这就意味着,出口相邻的点,是不会接受来自出口的老鼠的,也就是从出口出来的老鼠,概率应当统统记为0。既然老鼠在出口去不了其他地方,是在出口是不会动的,那么老鼠在出口的概率,就每次更新状态时候应当保留。(出口,是一个只进不出的点)

此外,这个程序可以自行设定迷宫长与宽,设定老鼠当前位置和出口位置,设置步数。

可以的改进:可以扩展到三维或是多维;设定某个移动方向的倾向(也就是概率,目前是概率均等)

import numpy as npdef connect(point,size,rat_exit):flag = 0m,n = sizex,y = pointif [x,y] == rat_exit:return 0for [xx,yy] in [[x-1,y],[x+1,y],[x,y-1],[x,y+1]]:if 0<=xx<m and 0<=yy<n:flag += 1if flag == 1:return 1elif flag == 2:return 0.5elif flag == 3:return 1/3elif flag ==4:return 0.25
#main
size = input('棋盘的长与宽:')
size = list(int(x) for x in size.split(','))
m,n = size
rat = input('入口所在坐标:')
rat = list(int(x) for x in rat.split(','))
a,b = rat
rat_exit = input('出口所在坐标:')
rat_exit = list(int(x) for x in rat_exit.split(','))
aa,bb = rat_exit
# l = int(input('逃离步长:'))
t = int(input('逃离步数:'))
A = np.zeros([m,n])
A[a,b] = 1
print('初始状态为:')
print(A)
for i in range(t):AA = A.copy()for x in range(m):for y in range(n):if [x,y] != rat_exit:AA[x,y] = 0for [xx,yy] in [[x-1,y],[x+1,y],[x,y-1],[x,y+1]]:if 0<=xx<m and 0<=yy<n:AA[x,y] += A[xx,yy]*connect([xx,yy],size,rat_exit)A = AAprint('第{}次行动后的状态为:'.format(str(i+1)))print(A)print('\n')
P = A[aa,bb]
print('老鼠到达出口的概率为:'+ str(P))

运行结果示例:

一个老鼠走迷宫问题的python解法相关推荐

  1. C++实现一个老鼠走迷宫游戏

    由于C++面向对象的编程方式,注重于数据的处理,所以一个类的设计显得尤为重要. 这里我就设计了一个迷宫类,其属性有迷宫大小,空格(可行路径)的数目,入口坐标,出口坐标,主角老鼠的坐标,以及bool变量 ...

  2. 【经典算法】老鼠走迷宫问题

    老鼠走迷宫问题及其多个变种 一.说明 老鼠走迷宫问题的递归实现,是对递归思想的一种应用. 二.问题描述 给定一个二维数组,数组中2表示墙壁,0表示通路,由此数组可展示为一个迷宫图.给定入口位置和出口位 ...

  3. 老鼠走迷宫php算法,C语言经典算法 - 老鼠走迷官(一)

    C语言经典算法 - 老鼠走迷官(一) 说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法老鼠的走法有上.左.下 ...

  4. java递归老鼠走迷宫_递归算法求老鼠走迷宫(C语言)

    /*说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁, 使用1来表示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法老鼠的走法有上.左.下.右四个方向,在每前进一格之后就选 ...

  5. java老鼠走迷宫算法_老鼠走迷宫java算法

    说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法老鼠的走法有上.左.下.右四个方向,在每前进一格之后就选一个 ...

  6. c语言老鼠走迷宫课程设计,C语言算法之老鼠走迷宫

    1.Algorithm Gossip: 老鼠走迷官(一)说明:老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法: ...

  7. C语言老鼠走迷宫(单路径)算法详细讲解

    最近在学习C语言的一些经典算法,其中遇到了一点困难,导致卡进度了.琢磨了很久,在绘制流程图时,突然灵感大开理解了,老鼠走迷宫算法的奇妙.所以写了这个,一来是方便以后右和我类似的同学自学时,遇到这个问题 ...

  8. C语言 老鼠走迷宫详解6,算法: Mazing-老鼠走迷宫

    说明 老鼠走迷宫是递回求解的基本题型.我们在二维阵列中使用 2 表示迷宫墙壁,使用 1 来表示老鼠的行走路径,尝试以程式求由入口至出口的路径. 解法 老鼠可走上,下,左,右四个方向.入口一般在左上,出 ...

  9. c语言老鼠迷宫程序,C语言经典算法——老鼠走迷宫(二)

    说明 ​由于迷宫的设计,老鼠走迷宫的入口至出口路径可能不只一条,如何求出所有的路径呢? ​解法 ​求所有路径看起来复杂但其实更简单,只要在老鼠走至出口时显示经过的路径,然后退回上一格重新选择下一个位置 ...

最新文章

  1. Docker1.12让容器使用和宿主机同一个网段
  2. [转][.NET 基于角色安全性验证] 之三:ASP.NET Forms 身份验证
  3. 为多孔介质的当量直径_新型纳米多孔碳材料在催化剂载体方面的应用
  4. 国内比较好用的5款测试管理工具
  5. 开课吧:Web前端开发三大框架的特点
  6. Church's Coupon Performance Test Script
  7. 解决win7下allegro中光标由小十字改为满屏十字后出现残影的问题
  8. 规划计算机网络的成本估算,传统的项目管理软件包括进度计划、成本控制、资源调度和( )等功能模块。...
  9. python学习----登陆
  10. 【科普】什么是TPU?
  11. 安卓一键清理内存_雨点清理app下载-雨点清理手机版v1.0
  12. Mic Android 8.1 方案
  13. 实例——Python爬虫requests网络图片的爬取和存储
  14. macOS系统运行jmeter时去除恼人的shell黑框
  15. 使用百度翻译api制作自己的字典
  16. 弹性力学(工程力学)
  17. mt4怎么修改服务器代码,如何修改指标参数?
  18. 【竞赛篇-杭创】杭州市大学生创业大赛参赛经验
  19. org.fasterxml.classmate ResolvedParameterizedMember找不到
  20. 简化开发: mybatis-plus 代码自动生成 以及 常见问题

热门文章

  1. fatal: destination path '.' already exists and is not an empty directory. 错误及解决办法
  2. 人脸识别之人脸对齐(一)--定义及作用
  3. 万得数据写入Excel
  4. 驾校机器人教练售价_驾校机器人教练温柔鼓励!网友:好怕它被我气死
  5. Linux环境下安装部署redis
  6. poi PPT 在线预览
  7. Java 集合中汉字按自然顺序排序
  8. 做开发遇到35岁瓶颈被裁员,体验了一把“自由职业”,最后入行了软件测试...
  9. JTextArea用法
  10. SessionFactory:使用与配置