蒙特卡罗方法(Monte Carlo)

蒙特卡罗(Monte Carlo)方法,也称为计算机随机模拟方法,是一种基于"随机数"的计算方法,是一个统称,很多方法可以归类于蒙特卡罗方法

Monte Carlo 不是“蒙特卡罗”发明的,它是地名,是摩纳哥一个小城,以赌闻名,号称“赌博之国”,它是由冯诺依曼,乌拉姆等人发明的

比较

  • 拉斯维加斯 —— 尽量找最好的,但不保证能找到
    假如有一把锁,给我100把钥匙,只有1把是对的。于是我每次随机拿1把钥匙去试,打不开就再换1把。我试的次数越多,打开(最优解)的机会就越大,但在打开之前,那些错的钥匙都是没有用的。所以该算法必须是精确的那一个,相似的不行
  • 蒙特卡罗 —— 尽量找好的,但不保证是最好的
    比方说在美国大选,是选特朗普还是奥巴马,找人问是投给特朗普还是奥巴马,当找10个人的时候,会有很大的浮动,但寻找1000个人,10000个人,会发现概率会稳定在某个数值之间,这时候就得到了我们想要的结果。该算法是随着不断增加样本量,逐渐接近结果的过程

相关方法

  • 蒙特卡罗算法,蒙特卡罗模拟,蒙特卡罗过程
  • 蒙特卡罗搜索树

工作原理

  • 不断抽样
  • 逐渐逼近

(1) 圆周率Π值求解
蒙特卡罗方法(Monte Carlo)

python代码

import random

total = [10, 100, 1000, 10000, 100000, 500000]  # 随着随即点数增大,越接近精确值

for cnt in total:
    in_count = 0
    for i in range(cnt):
        x = random.random()  # 返回随机生成的一个实数,它在[0,1)范围内
        y = random.random()
    
        dis = (x**2 + y**2)**0.5
    
        if dis <= 1:
            in_count += 1
        
    print(cnt, '个随机点,Π是: ', 4 * in_count / cnt)
蒙特卡罗方法(Monte Carlo)

(2) 计算不规则图形面积
比如下面这张黑底图片,想要计算图中白色图形的面积,其中图形都是不规则图形,我们没办法通过边长公式等进行计算,其中一种方法就是可以通过蒙特卡罗方法,向图上随机打点,然后获取像素点所在的颜色,白色面积=白色点数/总点数×图片总面积(当然其实可以用计算机遍历所有像素点也可以求,但这里主要用来说明蒙特卡罗思想的方法)

蒙特卡罗方法(Monte Carlo)
命名为exp_img.png

python代码

import cv2
import random
img = cv2.imread('C:/Users/fly tree/Desktop/exp_img.png')  # 读取图片,这里是绝对路劲
Width, Height = img.shape[:2]
total = [10, 100, 1000, 10000, 100000, 500000]  # 随即点数
# print(dir(img))

for cnt in total:
    in_count = 0
    for i in range(cnt):
        x = random.randint(0, Width-1)
        y = random.randint(0, Height-1)
        if img[x][y][0] == 255 and img[x][y][1] == 255 and img[x][y][2] == 255:
            in_count += 1
    print(cnt,'个随机点,白色面积为: ', Width * Height * in_count // cnt)

参考资料:
【智源学院】30分钟了解蒙特卡罗方法-有意思专题系列(蒙特卡洛方法)(Monte Carlo method)

上一篇:Monte Carlo Integration


下一篇:进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)