醉汉随机行走/随机漫步问题(Random Walk Randomized Algorithm Python)
世界上有些问题看似是随机的(stochastic),没有规律可循,但很可能是人类还未发现和掌握这类事件的规律,所以说它们是随机发生的。
随机漫步(Random Walk)是一种解决随机问题的方法,它与人类生活息息相关,例如醉汉行走的轨迹、布朗运动(Brownian Motion)、股票的涨跌等都可以用它来模拟。随机漫步已经应用到数学,物理,生物学,医学,经济等领域。
假设某地有一个醉汉,每一秒钟会朝“东”,“南”,“西”,“北”中的一个方向走一步,那么这个醉汉在走了500步之后会在什么地方?1000步呢?是不是随着时间的增长,醉汉离原点越来越远呢?这个问题看似很随机,无法解决,但是如果用电脑程序来模拟,那么就可以很容易地把醉汉行走的轨迹,醉汉离原点的距离展现出来。
解决思路:
设计四个class,分别是:Location(表示醉汉所在的位置),Direction(表示醉汉行走的方向,如果要增加或修改方向,在这个class中修改即可),Field(表示一个醉汉所在的平面区域,如果要增加醉汉的数量,在这个class中修改即可),Drunk(表示醉汉本身)
代码如下:
import math, random, pylab class Location:
def __init__(self,x,y): #定义醉汉的位置,即平面上的一点,用x和y坐标表示
self.x=x
self.y=y
def move(self,xc,yc): #输入x和y坐标的变动值,返回变动后的坐标
return Location(self.x+xc,self.y+yc)
def getLocation(self):
return self.x,self.y
def getDistance(self,other): #输入另一个点的坐标,根据x轴和y轴变动的距离,算出原点和另一个点之间的直线距离
ox,oy=other.getLocation()
xDist=ox-self.x
yDist=oy-self.y
return math.sqrt(xDist**2+yDist**2) class Direction:
possibleDirection=("S","W","E","N") #可能的四种方向
def __init__(self,direc): #定义方向,如果此方向不在可能的四种方向里面,那么报错
if direc in self.possibleDirection:
self.direc=direc
else:
raise ValueError("in direction:__init__")
def move(self,dist): #输入移动距离,根据不同的方向返回平面距离
if self.direc=="S": return (0,-dist)
if self.direc=="W": return (-dist,0)
if self.direc=="E": return (dist,0)
if self.direc=="N": return (0,dist)
else: raise ValueError("in direction: move") class Field:
def __init__(self,drunk,loc): #定义醉汉和其所在的平面
self.drunk=drunk
self.loc=loc
def move(self,direc,dist): #输入方向和移动距离,获得x和y坐标的变动值,在原点上移动该值,获得变动后的坐标
oldLoc=self.loc
xc,yc=direc.move(dist)
self.loc=oldLoc.move(xc,yc)
def getLocation(self):
return self.loc
def getDrunk(self):
return self.drunk class Drunk:
def __init__(self,name):
self.name=name
def move(self,field,step=1):
if field.getDrunk()!=self:
raise ValueError("No such drunk is found on the field")
for i in range(step):
direc=Direction(random.choice(Direction.possibleDirection))
field.move(direc,1) def performTrial(step,f):
startLoc=f.getLocation()
distances=[0]
for t in range(1,step+1):
f.getDrunk().move(f)
newLoc=f.getLocation()
distance=newLoc.getDistance(startLoc)
distances.append(distance)
return distances drunk=Drunk("Baichi")
for i in range(3):
f=Field(drunk,Location(0,0))
distances=performTrial(500,f)
pylab.plot(distances)
pylab.title("Baichi Walk")
pylab.xlabel("Time")
pylab.ylabel("Distance")
pylab.show()
运行结果如下:

可以看出,随着时间的推移,醉汉离原点越来越远。
人们通常想当然地以为醉汉随机朝四种方向行走,来来回回,兜兜转转,估计最后还是走到离原点不远的地方。但其实醉汉每走一步,之前的基点都会随之变化。(走第一步时,100%的几率会离原点更远;走第二步时,75%的几率会离原点更远,只有25%的几率会回到原点。这就是因为走第一步时,基点是原点,而走第二步时,基点变成了走完第一步后所在的点。)
在现实生活中,假如有一天你的股票大跌,这意味着你想要收回成本的可能性就很低了。因为基点已经被拉低。。。(啊啊啊啊。。。不要告诉我这个惨痛的事实啊!!!)
参考:麻省理工学院公开课:计算机科学及编程导论(第17集)
醉汉随机行走/随机漫步问题(Random Walk Randomized Algorithm Python)的更多相关文章
- [ML学习笔记] 决策树与随机森林(Decision Tree&Random Forest)
[ML学习笔记] 决策树与随机森林(Decision Tree&Random Forest) 决策树 决策树算法以树状结构表示数据分类的结果.每个决策点实现一个具有离散输出的测试函数,记为分支 ...
- 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法
1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...
- Python编程:从入门到实践 - matplotlib篇 - Random Walk
随机漫步 # random_walk.py 随机漫步 from random import choice class RandomWalk(): """一个生成随机漫步数 ...
- [论文阅读笔记] Community aware random walk for network embedding
[论文阅读笔记] Community aware random walk for network embedding 本文结构 解决问题 主要贡献 算法原理 参考文献 (1) 解决问题 先前许多算法都 ...
- 性能测试--Jmeter随机生成/随机选取/csv读取关键字
Jmeter随机生成/随机选取/csv读取关键字 一.随机生成关键字 随机生成关键字,需要组件:随机变量配置元件(Random Variable) 该组件的作用是生成字符+随机数字格式的字符串,并保 ...
- 大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out of bag data及代码(2)
大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out of bag data及代码(2) 上一节中我们讲解了随机森林的基本概念,本节的话我们讲解随机森 ...
- 加入商品分类信息,考虑用户所处阶段的 图模型 推荐算法 Rws(random walk with stage)
场景: 一个新妈妈给刚出生的宝宝买用品,随着宝宝的长大,不同的阶段需要不同的物品. 这个场景中涉及到考虑用户所处阶段,给用户推荐物品的问题. 如果使用用户协同过滤,则需要根据购买记录,找到与用户处于同 ...
- HDU 4579 Random Walk (解方程组)
Random Walk Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)Total ...
- HDU 4487 Maximum Random Walk
Maximum Random Walk Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
随机推荐
- linux下的shell脚本(基本)
shell有些命令和格式不用老是容易忘,学而时习之,不亦说乎~ 先说明以下内容来自: http://c.biancheng.net/cpp/shell/ ,C语言中文网,请大家支持原作,点击链接查看. ...
- Python_装饰器复习_30
复习: # 装饰器的进阶 # functools.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数# 周末的作业 # 文件操作 # 字符串处理 # 输入输出 # 流程控制 # 装饰器# 开 ...
- 为什么HashMap初始大小为16,为什么加载因子大小为0.75,这两个值的选取有什么特点?
先看HashMap的定义: public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V> ...
- 硬盘扩容9999T
win+r运行创建命令:subst H: d:\123说明:H指的是想要创建的盘符,d:\123是文件路径 删除命令subst H: d/说明 :H指的是已创建的盘符,/d指的是删除的意思 注意新盘符 ...
- centOS7搭建NFS服务器
借鉴别人这篇博客搭建成功的:http://blog.51cto.com/mrxiong2017/2087001 NFS系统:用来共享文件.图片.视频 准备两个centOS7服务器,一个作NFS ser ...
- mvc后台可以使前台弹出警告框的几种方法
1,引用博主的 第一种方案:在jsp页面使用java代码实现. 后台处理代码:(把要提示的数据放到session中.) String message = ""; message = ...
- git简介及安装(win10)
一句话介绍git Git是Linus Torvalds编写,目前是世界上最先进的分布式版本控制系统. git能干什么? 代码备份.还原,版本管理,分支管理,解决冲突,协同开发... 安装git > ...
- centos7系统管理和运维实战——运维必备的网络管理技能(1)
运维必备的网络管理技能 一.网络管理协议: 1.简单的两个概念: DHCP(动态主机配置协议):如果网络结构要更改,需要从新初始化网络参数,手机用动态主机配置协议可以避免这个问题.客户端可以从D ...
- 在页面中有overflow-y:auto属性的div,当出现滚动条,点击返回顶部按钮,内容回这个div最顶部
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 初识Xml。
/* * 一.Xml? * * 1.是什么? * Extensible markup Language 可拓展标记性语言 * 功能是 储存数据 * 1.配置文件 * 2.在网络中传输数据 * xml和 ...