本文为博主编写文章,未经博主允许转载,转载请注明出处:https://blog.csdn.net/weixin_42604241/article/details/97382158

蒙特卡罗算法(方法)定义

蒙特卡罗方法又称统计模拟法、随机抽样技术,是一种概率算法(随机模拟方法),以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名。

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

 蒙特卡罗算法:采样越多,越近似最优解;拉斯维加斯算法:采样越多,越有机会找到最优解。

举个例子,假如筐里有100个苹果,让我每次闭眼拿1个,挑出最大的。于是我随机拿1个,再随机拿1个跟它比,留下大的,再随机拿1个……我每拿一次,留下的苹果都至少不比上次的小。拿的次数越多,挑出的苹果就越大,但我除非拿100次,否则无法肯定挑出了最大的。这个挑苹果的算法,就属于蒙特卡罗算法——尽量找好的,但不保证是最好的。
而拉斯维加斯算法,则是另一种情况。假如有一把锁,给我100把钥匙,只有1把是对的。于是我每次随机拿1把钥匙去试,打不开就再换1把。我试的次数越多,打开(最优解)的机会就越大,但在打开之前,那些错的钥匙都是没有用的。这个试钥匙的算法,就是拉斯维加斯算法——尽量找最好的,但不保证能找到。
所以你看,这两个词并不深奥,它只是概括了随机算法的特性,算法本身可能复杂,也可能简单。这两个词本身是两座著名赌城,因为赌博中体现了许多随机算法,所以借过来命名。这两类随机算法之间的选择,往往受到问题的局限。如果问题要求在有限采样内,必须给出一个解,但不要求是最优解,那就要用蒙特卡罗算法。反之,如果问题要求必须给出最优解,但对采样没有限制,那就要用拉斯维加斯算法。

如下图,例如我们想要计算二维空间的阴影图形的面积,就可以使用蒙特卡罗算法。
我们在x属于[0,2],y属于[0,4]之间,任取1000个随机点,结果如下:

我们计算落在图中阴影图形中的点(其y<=x^2)的个数与1000做比,这个值就近似认为是图形与[0,2]和[0,4]围成矩形的面积的比,矩形的面积为8是已知,可以用刚才算的比值乘以8就得到图中图形的近似解。
蒙特卡罗算法思想就是上述例子使用的想法,上述问题可以直接通过积分求得,但一些现实问题,比如我们玩过的用圈套娃娃游戏,为什么套种我们想要的娃娃这么难呢?这个问题就不能直接用积分求解,因为里面有圈的半径和娃娃的半径,此时我们可以通过蒙特卡罗算法进行模拟。

蒙特卡罗算法案例Matlab求解:

【例】用蒙特卡洛模拟法求圆周率PI(希腊字母 π:实际上约等于3.141592654)
如图,红色线条为平面上圆心在原点的单位圆,圆的面积为PI,黑色线条构成边长为2的正方形 。

设相互独立的随机变量x,y均服从[-1,1]上的均匀分布,则(x,y)服从{-1≤x≤1, -1≤y≤1}上的二元均匀分布(即图中正方形区域上的二元均匀分布),记作:事件A = {x^2 + y^2 ≤ 1},则事件A发生的概率等于单位圆面积除以边长为2的正方形的面积,即P(A) = PI/4。
可得圆周率PI = 4P(A)。 而P(A)可以通过蒙特卡洛模拟法求得,在图1中正方形内随机投点(即横坐标X和纵坐标Y都是[-1,1]上均匀分布的随机数),落在单位圆内的点的个数m与点的总数n的比值m/n可以作为A事件的概率P(A)的近似,随着投点总数的增加,m/n会越来越接近于P(A),从而可以得到逐渐接近于PI的模拟值。

MATLAB代码:

%P(A) = PI/4 => 圆周率PI = 4P(A)
%总的实验次数
n = input('请输入实验次数 n:');
%落在圆中点的次数
m = 0;
%循环实验
for i = 1:n  x = 2 * rand-1;  %产生-1至1的随机数if (x^2 + y^2 <= 1) m = m + 1;  end
end
%显示结果
pa=m/n;     %事件A的概率
PI=4*pa;    %计算得到的圆周率
fprintf('事件A的概率pa=%d\n',pa);
fprintf('计算得到的圆周率PI = %d\n',PI); %X = rand 返回一个在区间 (0,1) 内均匀分布的随机数。
%随机数是由随机种子根据一定的计算方法计算出来的数值。
%所以,只要计算方法一定,随机种子一定,那么产生的随机数就不会变。    

运行结果:

可得:
实验次数 n:10000000000
事件A的概率pa=7.853945e-01
计算得到的圆周率PI = 3.141578e+00(约等于3.141592654)

命令行窗口运行结果:

PI_test
请输入实验次数 n:10000
事件A的概率pa=7.855000e-01
计算得到的圆周率PI = 3.142000e+00

PI_test
请输入实验次数 n:100000
事件A的概率pa=7.850300e-01
计算得到的圆周率PI = 3.140120e+00

PI_test
请输入实验次数 n:1000000
事件A的概率pa=7.854980e-01
计算得到的圆周率PI = 3.141992e+00

PI_test
请输入实验次数 n:10000000
事件A的概率pa=7.854455e-01
计算得到的圆周率PI = 3.141782e+00

PI_test
请输入实验次数 n:100000000
事件A的概率pa=7.854134e-01
计算得到的圆周率PI = 3.141654e+00

PI_test
请输入实验次数 n:1000000000
事件A的概率pa=7.854160e-01
计算得到的圆周率PI = 3.141664e+00

PI_test
请输入实验次数 n:10000000000
事件A的概率pa=7.853945e-01
计算得到的圆周率PI = 3.141578e+00
注:最后一次的总运行时间较长,电脑配置高的话运行时间不会超过30min。

数模算法 — 蒙特卡罗算法及Matlab案例相关推荐

  1. Python数模笔记-模拟退火算法(3)整数规划问题

    1.整数规划问题 整数规划问题在工业.经济.国防.医疗等各行各业应用十分广泛,是指规划中的变量(全部或部分)限制为整数,属于离散优化问题(Discrete Optimization). 线性规划问题的 ...

  2. Python数模笔记-模拟退火算法(2)约束条件的处理

    1.最优化与线性规划 最优化问题的三要素是决策变量.目标函数和约束条件. 线性规划(Linear programming),是研究线性约束条件下线性目标函数的极值问题的优化方法,常用于解决利用现有的资 ...

  3. Python数模笔记-模拟退火算法(4)旅行商问题

    1.旅行商问题(Travelling salesman problem, TSP) 旅行商问题是经典的组合优化问题,要求找到遍历所有城市且每个城市只访问一次的最短旅行路线,即对给定的正权完全图求其总权 ...

  4. Python数模笔记-模拟退火算法(1)多变量函数优化

    1.模拟退火算法 模拟退火算法借鉴了统计物理学的思想,是一种简单.通用的启发式优化算法,并在理论上具有概率性全局优化性能,因而在科研和工程中得到了广泛的应用. 退火是金属从熔融状态缓慢冷却.最终达到能 ...

  5. 随机算法-蒙特卡罗算法

    在论文中多次看到ε-approximation概念,然后百度发现也很少说这个的.只有在其他论文里面有讲到.这里就是记录下目前所了解的比较浅显的理解. 可以比较论文基于k-means的(1+ε)近似算法 ...

  6. 数模中常使用的Matlab绘图与Excel绘图

    最近经常用到绘图,本菜鸡QAQ就把这部分所需要的知识整理了一下(此文用的是matlab2014a),方便以后懒得去查找资料啦~ 绘图颜色与线型 颜色 Matlab的plot函数里所带的基本颜色有8钟, ...

  7. 秒懂算法 | 蒙特卡罗算法

    主元素问题的蒙特卡罗算法分析.设计与Python实战. 蒙特卡罗算法的基本思想:设p是一个实数,且0.5<p<1.若蒙特卡罗算法对于问题的任一实例得到正确解的概率不小于p,则称该算法是p正 ...

  8. 随机算法——蒙特卡罗算法——模式匹配问题

    1 简单介绍 2 随机算法 3 指纹计算 4 计算步骤 假匹配 当Ip(Y)和Ip(X(j))不相等,那么Y和X(j)一定不匹配: 但是逆命题是错误的,即两指纹相同,X与X(j)也不一定匹配,即为假匹 ...

  9. MATLAB算法实战应用案例精讲-【数模应用】装箱问题(应用案例)

    目录 前言 算法原理 计算公式 二维空间uv装箱算法 1.Shelf Algorithms 货架算法

最新文章

  1. 最佳DevOps工具获奖者:CloudBees Jenkins平台
  2. 作为产品经理,你需要了解的基本算法知识和实操
  3. Activiti工作流实战-2
  4. SpringBoot通过yml和xml文件配置日志输出
  5. 干得最多最累,工资还不如新人
  6. Uzi宣布退役:身体条件不允许再继续战斗了!
  7. 基于dijsktra算法的最短路径求解_基于dijkstra算法的AGV路径规划(含C++代码)
  8. idea设置背景颜色护眼色
  9. 界面原型创建工具Axure使用教程
  10. 《走出软件作坊》51:幽幽一缕香
  11. 小程序用户协议页面实现
  12. 2-3、迭代法计算定积分
  13. processOn在线制图工具
  14. 室内设计——办公楼创意室内设计(包含预览图jpg和.psd文件)
  15. 俞敏洪在北京大学2008年开学典礼上的演讲辞
  16. Java判断经纬度点是否在给定区域内
  17. 菲尔博士的三十六交际方式
  18. 新手小白大学生,在宿舍做短视频自媒体,两个星期收益1700多
  19. 2021电工杯B题建模思路代码完整版
  20. 第二章 ArcGIS数据和地理数据库

热门文章

  1. 网上打印店可以急速打印东西吗?
  2. Python Couldn‘t find any class folder
  3. HarmonyOS开发详解(二)——鸿蒙开发体系详解及入门实例演示运行
  4. 当西门子遇上施耐德:S7-12001500与M241的Ethernet通讯
  5. 推荐一个好看的极简主义博客网站程序-liveblog
  6. 实内积空间和欧式空间的定义
  7. 数据库根据经纬度查询离我最近的数据
  8. Redis——好友关注、共同关注、Feed流推送
  9. 在职位招聘数据处理中使用Loess回归曲线以及分箱、回归、聚类方法 检查离群点及光滑数据【数据挖掘机器学习】
  10. R语言ggpubr包的ggscatter函数可视化散点图(scatter plot)、设置add参数为loess为散点图添加局部加权回归曲线、配置conf.int参数为回归线添加置信区