找回密码
 立即注册
查看: 118|回复: 0

优化模型之蒙特卡洛算法

[复制链接]
发表于 2023-2-6 18:41 | 显示全部楼层 |阅读模式
前面发布了有关三大模型的一些算法,有人私信我出一下蒙特卡洛的理论和代码,这一篇就重点写一下吧!有关三大模型的一些算法可见:
一、蒙特卡洛算法

蒙特卡洛算法是一种随机算法,有一定的概率能够得到不那么正确的答案,但是在大多数情况下,只要给到的模拟点足够多,答案依然能够趋向于局部收敛,即依然能够得到一个不错的答案。它依赖于随机抽样来获得数值结果,使用随机性来解决原则上可能是确定性的问题,在数学和物理上运用广泛。本质上还是蛮好写代码的,直接随机大量模拟数据即可。
二、蒙特卡洛一般步骤

蒙特卡洛方法往往各不相同,但是一般而言,具有一下几个步骤:

  • 定义可能的输入的域(即可能取值的集合)
  • 从域上的概率分布随机生成输入
  • 对输入执行确定性计算
  • 聚合结果
三、使用蒙特卡洛算法计算 \pi

例如,我们使用一个单位正方形来计算 \pi ,如下图所示,此时圆形扇区的面积就为 \frac{\pi}{4} 。


于是 \pi 的值就可以勇敢蒙特卡洛来近似,其步骤为:

  • 定义一个正方形域,即单位正方形,即长和宽均小于等于1;
  • 在正方形上均匀散布一定数量的点;
  • 计算正方形内与原点距离小于1的点的数量;
  • 上述数量与总样本数量的比值就是 \frac{\pi}{4} 的估计值,乘以4就是 \pi 的估计值。
代码可以表示为:
import math   # 导入计算模块
import random # 导入随机模块

m = 100000    # 定义模拟点的总数量
n = 0         # 初始化在扇形内的点的数量

for i in range(m):
    x = random.random() # 随机生成0-1内的数
    y = random.random() # 随机生成0-1内的数
    # 计算与圆点距离<1的点的数量,即在扇形内的点的数量
    if math.sqrt(x**2 + y**2) < 1:
        n += 1
pi = n / m * 4  # 计算pi值
print("pi =", pi)

# 输出结果为:pi = 3.1404我们也可以迭代几个总样本数量,从而得到性能与时间最合适的m值,其代码为:
import math   # 导入计算模块
import random # 导入随机模块
import time   # 导入时间模块
import matplotlib.pyplot as plt # 导入画图模块

m = [10,100,1000,5000,10000,50000,100000,500000,1000000] # 定义模拟点的总数量的列表
ps = []   # 对于上述的每一个m值,都有对应计算的一个pi值
ts = []   # 对于上述的每一个m值,都有对应计算的一个时间值

# 先遍历每一个m值,然后再对m中的每个元素遍历
for i in range(len(m)):
    n = 0                    # 初始化在扇形内的点的数量
    start_time = time.time() # 计算开始时间
    for j in range(m):
        x = random.random() # 随机生成0-1内的数
        y = random.random() # 随机生成0-1内的数
        # 计算与圆点距离<1的点的数量,即在扇形内的点的数量
        if math.sqrt(x**2 + y**2) < 1:
            n += 1
    pi = n / m * 4  # 计算pi值
    end_time = time.time() # 计算结束时间
    ps.append(pi)
    ts.append(end_time - start_time)
# 画图展示
plt.plot(m, ps, label='pi value')
plt.plot(m, ts, label='time value')
plt.legend()得到的结果为:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-6-27 21:58 , Processed in 0.105384 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表