基本原理、核心思想

蒙特卡洛方法(蒙特卡洛模拟)的核心思想是用计算机生成随机数来得到近似的最优解,其基本原理就是概率论中的大数定律,即当样本容量足够大时,事件的发生频率即为其概率。
蒙特卡洛准确的来说只是⼀ 种思想,或者是是⼀种⽅法。如果我们所求解的问题与概率模型有⼀定的关联,那么我们就可以使⽤计算机多次模拟事件发生,以获得问题的近似解。因此根据不同的问题,对应的约束条件以及算法模型不同,蒙特卡洛模拟的方法的代码没有通用的架构(根据题目条件写代码)。

应用场景一:利用蒙特卡洛方法求圆周率pi

特点:问题与概率模型显著关联(可以明确推导出问题的概率公式)

原理

场景模型建立:画一个边长为2R的正方形以及边长为R的内接圆,随机地向正方形区域内撒点,那么:
(落在圆内点的个数)/(落在正方形内点的个数)=(圆的面积)/(正方形的面积)=π/4
image.png

代码

  1. %模拟次数
  2. n=10000;
  3. %unifrnd(a,b,m,n)可以输出在[a,b]之间均匀分布的随机数组成的mn列的矩阵。
  4. %分别生成点的x坐标和y坐标数组
  5. points_x = unifrnd(-1,1,1,n);
  6. points_y = unifrnd(-1,1,1,n);
  7. %在圆内的点的数量
  8. in_cycle=0;
  9. %确定xy坐标轴范围,设置横坐标范围为[-1, 1] 纵坐标范围为[-1, 1]
  10. axis([-1,1,-1,1]);
  11. for k=1:n
  12. %通过距离原点距离来判断,随机生成的第k个点是否在圆内
  13. if points_x(k)^2+points_y(k)^2<=1
  14. in_cycle=in_cycle+1;
  15. %在圆内的点画红点,否则画蓝点
  16. plot(points_x(k),points_y(k),'r.');
  17. hold on;%不关闭图形,继续画图
  18. else
  19. plot(points_x(k),points_y(k),'b.');
  20. hold on;
  21. end
  22. end
  23. disp(['蒙特卡罗方法得到pi为:', num2str(4*(in_cycle/n))]);

实验结果

模拟结果图:
untitled.bmp
image.png
我们可以发现:多次实验的结果均接近π的值,即蒙特卡洛方法模拟出来的值是近似值,而不是最优值

论文应用一:模型近似结果的检验:

场景应用二:三门问题

场景描述:

你参加一档电视节目,节目组提供了ABC三扇门, 主持人告诉你,其中一扇门后边有辆汽车,其它两扇门后是空的。
假如你选择了B门,这时,主持⼈打开了C门,让你看到C门后什么都没有,然后问你要不要改选A门?
论文应用二:

场景应用三:非线性的有约束的规划问题