蒙特卡洛方法与蒙特卡洛搜索树(一)

简介: 最近在做 AIOps 相关的项目时,用到了蒙特卡洛搜索树(MCTS)算法,对蒙特卡洛相关的内容有些兴趣,在此整理些相关的资料。

蒙特卡洛方法

蒙特卡洛方法(Monte Carlo method),也称统计模拟方法,是 1940 年代中期提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。

20 世纪 40 年代,在科学家冯·诺伊曼、斯塔尼斯拉夫·乌拉姆和尼古拉斯·梅特罗波利斯于洛斯阿拉莫斯国家实验室为核武器计划工作时,发明了蒙特卡洛方法。因为乌拉姆的叔叔经常在摩纳哥的蒙特卡洛赌场输钱得名,而蒙特卡洛方法正是以概率为基础的方法。

与它对应的是确定性算法

基本概念

通常蒙特卡罗方法可以粗略地分成两类:

  • 一类是所求解的问题本身具有内在的随机性,借助电脑的运算能力可以直接模拟这种随机的过程。例如在核物理研究中,分析中子在反应堆中的传输过程。中子与原子核作用受到量子力学规律的制约,人们只能知道它们相互作用发生的概率,却无法准确获得中子与原子核作用时的位置以及裂变产生的新中子的行进速率和方向。科学家依据其概率进行随机抽样得到裂变位置、速度和方向,这样模拟大量中子的行为后,经过统计就能获得中子传输的范围,作为反应堆设计的依据。
  • 另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或者随机变量的期望值。通过随机抽样的方法,以随机事件出现的频率估计其概率,或者以抽样的数字特征估算随机变量的数字特征,并将其作为问题的解。这种方法多用于求解复杂的多维积分问题。

应用

下面主要介绍第二种类型的例子:
1. 蒙特卡洛计算π
image.png

  在上图中,1/4 圆面积与正方形面积之比为π:4. 让程序随机生成两个[0,1]之间的实数 x, y,看以 (x,y) 组成的点是否落在圆内。重复 N 次,统计圆内的点个数和总的点个数,其比值应接近于圆面积于正方形面积之比,即 π:4

2. 还是蒙特卡洛计算π

  布丰投针问题(Buffon's needle problem),是布丰于 18 世纪提出的一个数学问题:   设我们有一个以平行且等距木纹铺成的地板(如下图),现在随意抛一支长度比木纹之间距离小的针,求针和其中一条木纹相交的概率。
image.png
  现假设:木板间距离为 d, 针长度为 s, 已知 s<d.   
  应用蒙特卡洛方法,我们在地面投掷 n 次,观测出针与地面相交的次数 m, 如果实验的次数足够多,则我们可以以 p=m/n 代表针与地板木纹相交的概率。
  标题不是求 π 么,到现在为止好像跟 π 没有什么关系呀,别急,我们考虑下怎么跟随机分布扯上关系。
  因为要求相交的概率,如果知道了针的位置,是不是就能知道有没有相交呢。基于此,我们用变量 (X,Y) 表示针的位置,那 X,Y 分别代表什么呢,如果是在坐标系中,我们可以用向量表示位置,因为向量能确定方向和大小,同样地,我们需要一个变量代表大小,一个变量代表方向。

  如图,我们可以用 X 代表针中点到最近木纹的距离,用 Y代表针与木纹的夹角,如此,就能确定针的位置了。

  由于投掷针是完全随机的,因此:
  - X 服从 [0, d/2] 上的均匀分布;
  - 同理,Y 服从 [0, π/2] 上的均匀分布。
  有了表示针位置的变量,那么如何判断相交呢?如上图,如果针端点与木纹刚好相交时,夹角为 α, 此时,距离X= (s/2) ∗ sinα. 如果不相交时,则对应的距离 X> (s/2) ∗ sinα, 如果是上图左侧示例,则
X< (s/2) ∗ sinα.
  另外,由于 X,Y 相互独立,则有概率密度函数:
  image.png
  由此可计算针与直线相交的概率:
  image.png
  因此,
  2s/dπ = m/n

Surprise!

相关文章
|
存储 C++ 容器
c++vector容器-赋直操作讲解
c++vector容器-赋直操作讲解
1282 0
|
API C# Windows
Winform控件优化之无边框窗体及其拖动、调整大小和实现最大最小化关闭功能的自定义标题栏效果
Winform中实现无边框窗体只需要设置FormBorderStyle = FormBorderStyle.None,但是无边框下我们需要保留移动窗体、拖拽调整大小、自定义美观好看的标题栏等...
5127 0
Winform控件优化之无边框窗体及其拖动、调整大小和实现最大最小化关闭功能的自定义标题栏效果
|
10月前
|
人工智能 自然语言处理 算法
随机的暴力美学蒙特卡洛方法 | python小知识
蒙特卡洛方法是一种基于随机采样的计算算法,广泛应用于物理学、金融、工程等领域。它通过重复随机采样来解决复杂问题,尤其适用于难以用解析方法求解的情况。该方法起源于二战期间的曼哈顿计划,由斯坦尼斯拉夫·乌拉姆等人提出。核心思想是通过大量随机样本来近似真实结果,如估算π值的经典示例。蒙特卡洛树搜索(MCTS)是其高级应用,常用于游戏AI和决策优化。Python中可通过简单代码实现蒙特卡洛方法,展示其在文本生成等领域的潜力。随着计算能力提升,蒙特卡洛方法的应用范围不断扩大,成为处理不确定性和复杂系统的重要工具。
562 21
|
11月前
|
机器学习/深度学习 人工智能 开发工具
Clone-voice:开源的声音克隆工具,支持文本转语音或改变声音风格,支持16种语言
Clone-voice是一款开源的声音克隆工具,支持16种语言,能够将文本转换为语音或将一种声音风格转换为另一种。该工具基于深度学习技术,界面友好,操作简单,适用于多种应用场景,如视频制作、语言学习和广告配音等。
2035 9
Clone-voice:开源的声音克隆工具,支持文本转语音或改变声音风格,支持16种语言
|
Java API Spring
feign-reactive
feign-reactive
426 0
|
Kubernetes Docker Perl
在K8S中,如果是因为开发写的镜像问题导致pod起不来该怎么排查?
在K8S中,如果是因为开发写的镜像问题导致pod起不来该怎么排查?
|
Go API 开发者
Golang深入浅出之-文件与目录操作:os与path/filepath包
【4月更文挑战第26天】Go语言标准库`os`和`path/filepath`提供文件读写、目录操作等功能。本文涵盖`os.Open`, `os.Create`, `os.Mkdir`, `filepath.Join`等API的使用,强调了文件关闭、路径处理、并发写入和权限问题的处理,并给出实战代码示例,帮助开发者高效、安全地操作文件与目录。注意使用`defer`关闭文件,`filepath`处理路径分隔符,以及通过同步机制解决并发写入冲突。
879 2
|
存储 区块链 Python
怎么把Python脚本打包成可执行程序?
最近根据用户提的需求用python做了一个小工具,但是在给客户使用的时候不能直接发送python文件,毕竟让客户去安装python环境,那就离了大谱了。所以这时候就需要把多个py文件带着运行环境打包成EXE可执行文件。
怎么把Python脚本打包成可执行程序?
|
SQL 关系型数据库 MySQL
flink cdc 同步问题之如何提高用户速度
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。