查看本案例完整的数据、代码和报告请登录数据酷客(cookdata.cn)案例板块。
快速获取案例方式:数据酷客公众号内发送“强化学习”。
蒙特卡洛方法(Monte Carlo method)是20世纪40年代中期提出的一种以概率统计为指导的重要数值计算方法。其名字来源于摩洛哥的赌城蒙特卡洛,象征着概率。蒙特卡洛方法在金融工程学,宏观经济学,计算物理学等领域应用广泛。
本案例将介绍基于蒙特卡洛的强化学习的基本思想,并求解智能体玩21点游戏的策略。
![e5bbd9803e2b4f1f5d14fcab466b154a.png](https://i-blog.csdnimg.cn/blog_migrate/e4e0bd8fd85d4131978c679fc4a30fcc.jpeg)
1.蒙特卡洛方法的基本思想
一般蒙特卡洛方法可以分成两类:
一种类型是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种带有随机性的过程。例如在核物理研究中,分析中子在反应堆中的传输过程。中子与原子核作用受到量子力学规律的制约,人们只能知道它们相互作用发生的概率,却无法准确获得中子与原子核作用时的位置以及裂变产生的新中子的行进速率和方向。科学家依据其概率进行随机抽样得到裂变位置、速度和方向,这样模拟大量中子的行为后,经过统计就能获得中子传输的范围,作为反应堆设计的依据。
另一种类型是所求解的问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或者随机变量的期望值。通过随机抽样的方法,以随机事件出现的频率估计其概率,或者以抽样的数字特征估算随机变量的数字特征,并将其作为问题的解,这种方法多用于求解复杂的多维积分问题。
首先我们实现一个经典的例子,用蒙特卡洛方法求的值。
假设在一个单位正方形内放置半径为1的1/4个圆:
- 在正方形内生成一些随机点,可以观察到一些点位于圆内,而另一些点位于圆外
- 根据方程计算位于圆内的点的个数
- 通过将圆内点个数与正方形内点个数之比乘以4来计算的值
如果增大随机点个数(样本个数),可以更好的近似的值。
import matplotlib.pyplot as plt
import random
%matplotlib inline
# 输入随机点的数量
nbPoints=int(input("请输入随机点的数量:"))
# 初始化圆内点数
dansCercle=0
# 初始化圆内圆外点的储存
x_axis_1,x_axis_2,y_axis_1,y_axis_2=[],[],[],[]
for i in range(nbPoints):
# 生成随机点
x = random.random()
y = random.random()
# 判断随机点是否在圆内,计算欧氏距离
if (x**2+y**2)**0.5<1:
dansCercle+=1
x_axis_1.append(x)
y_axis_1.append(y)
else:
x_axis_2.append(x)
y_axis_2.append(y)
# 计算π的模拟近似值
print("π的模拟近似值是:", dansCercle/nbPoints*4)
# 绘图
fig = plt.figure(1, figsize=(8, 6))
plt.scatter(x_axis_1,y_axis_1,s=20,c="blue")
plt.scatter(x_axis_2,y_axis_2,s=20,c="red")
plt.title("蒙特卡洛方法模拟")
plt.show()
请输入随机点的数量:10000
π的模拟近似值是: 3.1368