蒙特卡洛算法

  • 格式:doc
  • 大小:91.50 KB
  • 文档页数:4

蒙特卡洛算法

组员 李小兵 周立 冯俊 李继华 艾海提 李日浩

算法简介

蒙特·卡洛方法,也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。蒙特·卡洛方法的名字来源于摩纳哥的一个城市蒙地卡罗,该城市以赌博业闻名,而蒙特·卡罗方法正是以概率为基础的方法。

与它对应的是确定性算法。

蒙特·卡罗方法在金融工程学,宏观经济学,计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算)等领域应用广泛。

背景知识

1946年,美国拉斯阿莫斯国家实验室的三位科学家John von

Neumann,Stan Ulam 和 Nick Metropolis共同发明,被称为蒙特卡洛方法。它的具体定义是:在广场上画一个边长一米的正方形,在正方形内部随意用粉笔画一个不规则的形状,现在要计算这个不规则图形的面积,怎么计算列?蒙特卡洛(Monte Carlo)方法告诉我们,均匀的向该正方形内撒N(N 是一个很大的自然数)个黄豆,随后数数有多少个黄豆在这个不规则几何形状内部,比如说有M个,那么,这个奇怪形状的面积便近似于M/N,N越大,算出来的值便越精确。在这里我们要假定豆子都在一个平面上,相互之间没有重叠。蒙特卡洛方法可用于近似计算圆周率:让计算机每次随机生成两个0到1之间的数,看这两个实数是否在单位圆内。生成一系列随机点,统计单位圆内的点数与总点数,(圆面积和正方形面积之比为PI:1,PI为圆周率),当随机点取得越多(但即使取10的9次方个随机点时,其结果也仅在前4位与圆周率吻合)时,其结果越接近于圆周率。

算法描述

以概率和统计理论方法为基础的一种计算方法。将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似解。比如,给定x=a,和x=b,你要求某一曲线f和这两竖线,及x轴围成的面积,你可以起定y轴一横线 y=c 其中c>=f(x)max,很简单的,你可以求出 y=c,x=a,x=b,及 x轴围成的矩形面积,然后利用随机产生大量在这个矩形范围之内的点,统计出现在曲线上部点数和出现在曲线下部点的数目,记为:doteUpCount,nodeDownCount,然后所要求的面积可以近似为

doteDownCounts所占比例*矩形面积。

问题描述

在数值积分法中,利用求单位圆的1/4的面积来求得Pi/4,从而得到Pi。单位圆的1/4面积是一个扇形,它是边长为1单位正方形的一部分。只要能求出扇形面积S1在正方形面积S中占的比例K=S1/S就立即能得到S1,从而得到Pi的值。怎样求出扇形面积在正方形面积中占的比例K呢?一个办法是在正方形中随机投入很多点,使所投的点落在正方形中每一个位置的机会相等看其中有多少个点落在扇形内。将落在扇形内的点数m与所投点的总数n的比m/n作为k的近似值。Pi=4m/n。P落在扇形内的充要条件是x^2+y^2<=1。

利用蒙特卡洛算法近似求圆周率PI

VC++6.0

ZZH

#include

#include

#include

#define COUNT 500000 //循环取样次数

using namespace std;

bool InCircle(double x,double y)//是否在1/4圆范围之内

{

if((x*x+y*y)<=1)return true;

return false;

}

void main()

{

double x,y;

int num=0;

int i;

srand((unsigned)time(NULL));

for(i=0;i

{

x=rand()*1.0/RAND_MAX;

y=rand()*1.0/RAND_MAX;

if(InCircle(x,y)) num++;

}

cout<<"PI:"<<(num*4.0)/COUNT<

}

结果:测试5次的结果显示:3.13958,3.14041,3.13729,3.13859,3.14186

什么是Mapreduce

MapReduce 是 Google 公司的核心计算模型,它将复杂的运行于大规模集群上的并行计算过程高度的抽象到了两个函数,Map(映射) 和 Reduce(简化), 这是一个令人惊讶的简单却又威力巨大的模型。适合用 MapReduce 来处理的数据集(或任务)有一个基本要求: 待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。

图 1. MapReduce 计算流程

图一说明了用 MapReduce 来处理大数据集的过程, 这个 MapReduce 的计算过程简而言之,就是将大数据集分解为成百上千的小数据集,每个(或若干个)数据集分别由集群中的一个结点(一般就是一台普通的计算机)进行处理并生成中间结果,然后这些中间结果又由大量的结点进行合并, 形成最终结果。

计算模型的核心是 Map 和 Reduce 两个函数,这两个函数由用户负责实现,功能是按一定的映射规则将输入的 对转换成另一个或一批

value> 对输出。 开发者只需要为数据集编写特定的Map/Reduce操作,有时甚至只需25-50行代码就够了,而MapReduce软件微架构会处理并行任务并且向分布在各处的计算机分发任务,同时处理机器错误和数据中的错误条件并进行优化操作,例如把计算过程推移到靠近数据的一方执行来减少I/O带来的带宽消耗,还提供了系统监控并且通过数以千计的计算机保持服务的可拓展性。

Hadoop 实现了 Google 的 MapReduce 编程模型,提供了简单易用的编程接口,也提供了它自己的分布式文件系统 HDFS,与 Google 不同的是,Hadoop 是开源的,任何人都可以使用这个框架来进行并行编程。

Hadoop就不细说了,Hadoop 支持 Linux 及 Windows 操作系统两种,真心难装,本人是Linux上的,请高手装的,建议在Windows下装,体验伪分布式的。Hadoop的安装别的组有高手就说说吧!

伪分布式运行模式

这种模式也是在一台单机上运行,但用不同的 Java 进程模仿分布式运行中的各类结点 ( NameNode, DataNode, JobTracker, TaskTracker, Secondary

NameNode ),请注意分布式运行中的这几个结点的区别:

从分布式存储的角度来说,集群中的结点由一个 NameNode 和若干个 DataNode

组成, 另有一个 Secondary NameNode 作为 NameNode 的备份。从分布式应用的角度来说,集群中的结点由一个 JobTracker 和若干个 TaskTracker 组成,JobTracker 负责任务的调度,TaskTracker 负责并行执行任务。TaskTracker 必须运行在 DataNode 上,这样便于数据的本地计算。JobTracker 和 NameNode 则无须在同一台机器上。

Hadoop上的pi值程序:

转另一个文档。