优化模型之蒙特卡洛算法
前面发布了有关三大模型的一些算法,有人私信我出一下蒙特卡洛的理论和代码,这一篇就重点写一下吧!有关三大模型的一些算法可见:一、蒙特卡洛算法
蒙特卡洛算法是一种随机算法,有一定的概率能够得到不那么正确的答案,但是在大多数情况下,只要给到的模拟点足够多,答案依然能够趋向于局部收敛,即依然能够得到一个不错的答案。它依赖于随机抽样来获得数值结果,使用随机性来解决原则上可能是确定性的问题,在数学和物理上运用广泛。本质上还是蛮好写代码的,直接随机大量模拟数据即可。
二、蒙特卡洛一般步骤
蒙特卡洛方法往往各不相同,但是一般而言,具有一下几个步骤:
[*]定义可能的输入的域(即可能取值的集合)
[*]从域上的概率分布随机生成输入
[*]对输入执行确定性计算
[*]聚合结果
三、使用蒙特卡洛算法计算 \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(&#34;pi =&#34;, pi)
# 输出结果为:pi = 3.1404我们也可以迭代几个总样本数量,从而得到性能与时间最合适的m值,其代码为:
import math # 导入计算模块
import random # 导入随机模块
import time # 导入时间模块
import matplotlib.pyplot as plt # 导入画图模块
m = # 定义模拟点的总数量的列表
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=&#39;pi value&#39;)
plt.plot(m, ts, label=&#39;time value&#39;)
plt.legend()得到的结果为:
页:
[1]