什么是蒙特卡洛分析?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是蒙特卡洛分析?相关的知识,希望对你有一定的参考价值。
蒙特卡罗分析法,是一种容差分析方法,以电子电路为例,在给定元器件的值和容差范围时,对电路进行直流特性,交流小信号特性,瞬态特性分析,得出整个电路的性能的统计规律。
换言之,也就是从一个系统的组成部分的变动范围来分析整个系统的性能、动态范围的统计规律的方法。
总之,是一种利用概率统计理论的仿真方法。通过容差分析,可以断定整个系统是否满足设计要求,从而判断某些元器件是否符合要求。
在电路设计中,实际元件的参数值和标称之间总存在着随机误差,了解和掌握各个元件参数值对电路性能的影响程度,是电路设计人员所关心的。因此在电路设计时,需考虑容差问题,并进行容差分析。
所谓容差分析是为设定方案确定电路元器件的容许变化范围,即元件的容差。它可分为两类:一是分析问题,给定元器件、电路及温度的容差,计算电路特性的容差,以验证是否符合设计要求;二是设计问题,给定电路特性指标的范围,求出所用元器件及电源等的容差,验证设计方案等是否适宜。但容差设计问题没有惟一解,所以在电路模拟中要解决这一问题,往往通过容差分析问题进行反求,对电路进行容差分析。
目前,在电子电路的可靠性设计中,蒙特卡罗分析法是进行容差分析的主要方法之一。电子电路中的蒙特卡罗分析法是一种基于概率统计模拟方法,它是在给定电路元器件参数容差的统计分布规律的情况下,用一组组伪随机数求得元器件参数的随机抽样序列,对这些随机抽样的电路进行直流、交流小信号和瞬态分析,并通过多次分析结果估算出电路性能的统计分布规律,如电路性能的中心值、方差,以及电路合格率、成本等。
参考技术A 蒙特·卡罗方法(MonteCarlomethod),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。与它对应的是确定性算法。蒙特·卡罗方法在金融工程学,宏观经济学,计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算)等领域应用广泛。
蒙特卡罗方法于20世纪40年代美国在第二次世界大战中研制原子弹的“曼哈顿计划”计划的成员S.M.乌拉姆和J.冯·诺伊曼首先提出。数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的MonteCarlo—来命名这种方法,为它蒙上了一层神秘色彩。在这之前,蒙特卡罗方法就已经存在。1777年,法国数学家布丰(GeorgesLouisLecleredeBuffon,1707—1788)提出用投针实验的方法求圆周率π。这被认为是蒙特卡罗方法的起源。
蒙特卡罗方法解题过程的三个主要步骤:
(1)构造或描述概率过程。
对于本身就具有随机性质的问题,如粒子输运问题,主要是正确描述和模拟这个概率过程,对于本来不是随机性质的确定性问题,比如计算定积分,就必须事先构造一个人为的概率过程,它的某些参量正好是所要求问题的解。即要将不具有随机性质的问题转化为随机性质的问题。
(2)实现从已知概率分布抽样。
构造了概率模型以后,由于各种概率模型都可以看作是由各种各样的概率分布构成的,因此产生已知概率分布的随机变量(或随机向量),就成为实现蒙特卡罗方法模拟实验的基本手段,这也是蒙特卡罗方法被称为随机抽样的原因。最简单、最基本、最重要的一个概率分布是(0,1)上的均匀分布(或称矩形分布)。随机数就是具有这种均匀分布的随机变量。随机数序列就是具有这种分布的总体的一个简单子样,也就是一个具有这种分布的相互独立的随机变数序列。产生随机数的问题,就是从这个分布的抽样问题。在计算机上,可以用物理方法产生随机数,但价格昂贵,不能重复,使用不便。另一种方法是用数学递推公式产生。这样产生的序列,与真正的随机数序列不同,所以称为伪随机数,或伪随机数序列。不过,经过多种统计检验表明,它与真正的随机数,或随机数序列具有相近的性质,因此可把它作为真正的随机数来使用。由已知分布随机抽样有各种方法,与从(0,1)上均匀分布抽样不同,这些方法都是借助于随机序列来实现的,也就是说,都是以产生随机数为前提的。由此可见,随机数是我们实现蒙特卡罗模拟的基本工具。
(3)建立各种估计量。
一般说来,构造了概率模型并能从中抽样后,即实现模拟实验后,我们就要确定一个随机变量,作为所要求的问题的解,我们称它为无偏估计。建立各种估计量,相当于对模拟实验的结果进行考察和登记,从中得到问题的解。
参考技术B
蒙特卡罗分析法(MonteCarlomethod)(统计模拟法),是一种采用随机抽样(RandomSampling)统计来估算结果的计算方法,可用于估算圆周率,由约翰·冯·诺伊曼提出。由于计算结果的精确度很大程度上取决于抽取样本的数量,一般需要大量的样本数据,因此在没有计算机的时代并没有受到重视。
利用蒙特卡罗分析法可用于估算圆周率,在边长为2的正方形内作一个半径为1的圆,正方形的面积等于2×2=4,圆的面积等于π×1×1=π,由此可得出,正方形的面积与圆形的面积的比值为4:π。现在让我们用电脑或轮盘生成若干组均匀分布于0-2之间的随机数,作为某一点的坐标散布于正方形内,那么落在正方形内的点数N与落在圆形内的点数K的比值接近于正方形的面积与圆的面积的比值,即,N:K≈4:π,因此,π≈4K/N。
用此方法求圆周率,需要大量的均匀分布的随机数才能获得比较准确的数值,这也是蒙特卡罗分析法的不足之处。
蒙特卡洛树搜索在实践中是如何实现的
【中文标题】蒙特卡洛树搜索在实践中是如何实现的【英文标题】:How is Monte Carlo Tree Search implemented in practice 【发布时间】:2018-08-30 00:47:06 【问题描述】:我在一定程度上了解算法的工作原理。我不完全理解的是算法是如何实际在实践中实现的。
我有兴趣了解对于相当复杂的游戏(可能是国际象棋)来说,最佳方法是什么。即递归方法?异步?同时?平行线?分散式?数据结构和/或数据库?
-- 我们期望在单台机器上看到什么类型的限制? (我们可以在多个内核上同时运行...gpu 吗?)
-- 如果每个分支都导致一个全新的游戏被玩,(这可能达到数百万)我们如何保持整个系统的稳定? & 我们如何重用已经玩过的分支?
【问题讨论】:
我了解这可能过于宽泛,但在标记此内容之前提供任何链接/参考资料将不胜感激。 【参考方案1】:在 MCTS 中,递归实现没有什么意义(这在其他树搜索算法中很常见,例如基于 minimax 的算法),因为您总是从当前游戏状态(根节点)直到您选择评估的游戏状态(终端游戏状态,除非您选择使用播放阶段的深度限制和启发式评估函数进行非标准实现)。使用递归方法?异步?同时?平行线?分散式?数据结构和/或数据库
while
循环的更明显的实现就可以了。
如果这是您第一次实现该算法,我建议您先使用单线程实现。不过,这是一种相对容易并行化的算法,对此有多篇论文。您可以简单地并行运行多个模拟(其中模拟 = 选择 + 扩展 + 播放 + 反向传播)。您可以尝试确保在反向传播期间所有内容都得到干净的更新,但您也可以简单地决定根本不使用任何锁/阻塞等,无论如何,所有模拟中已经有足够的随机性,所以如果您从几个模拟中丢失信息由于简单地实现了并行化,这里和那里确实不会造成太大的伤害。
对于数据结构,与minimax
之类的算法不同,您实际上确实需要显式构建一棵树并将其存储在内存中(随着算法的运行逐渐构建)。因此,您需要一个带有Nodes
的通用树数据结构,其中包含一个后继/子Nodes
列表,以及一个指向父Node
的指针(模拟结果的反向传播所必需的)。
我们希望在单台机器上看到什么类型的限制? (我们可以在多个内核上同时运行...gpu 吗?)
可以跨多个内核运行(请参阅上面关于并行化的要点)。我没有看到算法的任何部分特别适合 GPU 实现(没有大型矩阵乘法或类似的东西),因此 GPU 不太可能有趣。
如果每个分支都会导致一个全新的游戏被玩,(这可能会达到数百万)我们如何保持整个系统的稳定? & 我们如何重用已经玩过的分支?
在最常用的实现中,算法在扩展阶段(在选择阶段之后遇到的第一个节点)每次迭代/模拟只创建一个新节点存储在内存中。在同一模拟的播放阶段生成的所有其他游戏状态根本不会让任何节点存储在内存中。这可以控制内存使用情况,这意味着您的树只会相对缓慢地增长(以每个模拟 1 个节点的速度)。这确实意味着您对先前模拟的分支的重用会稍微减少,因为您不会将看到的所有内容都存储在内存中。您可以选择为扩展阶段实施不同的策略(例如,为播放阶段生成的所有游戏状态创建新节点)。但是,如果您这样做,则必须仔细监控内存使用情况。
【讨论】:
感谢您的回答!非常冗长。最后一件事,我是否正确假设整个系统在每个节点上执行一个新游戏,然后可以生成其他新的和完整的游戏(尽管内存中没有存储任何内容)——总而言之,只是为了满足第一场比赛 @rambossa 每个节点只对应一个游戏状态,而不是一个完整的游戏(假设你有一个确定性游戏,比如国际象棋)。向树中添加节点时,可以选择在节点中也存储相应的游戏状态,也可以选择不存储。如果您存储它们,通过相同节点的后续选择阶段会更快,因为它们不再需要(重新)计算这些游戏状态。但是,早期的模拟可能会更慢,因为您必须在应用移动之前复制游戏状态(以避免同时修改存储在父节点中的游戏状态对象)以上是关于什么是蒙特卡洛分析?的主要内容,如果未能解决你的问题,请参考以下文章