查看本案例完整的数据、代码和报告请登录数据酷客(cookdata.cn)案例板块。
蒙特卡洛方法(Monte Carlo method)是20世纪40年代中期提出的一种以概率统计为指导的重要数值计算方法。其名字来源于摩洛哥的赌城蒙特卡洛,象征着概率。蒙特卡洛方法在金融工程学,宏观经济学,计算物理学等领域应用广泛。
本案例将介绍基于蒙特卡洛的强化学习的基本思想,并求解智能体玩21点游戏的策略。
1.蒙特卡洛方法的基本思想
一般蒙特卡洛方法可以分成两类:
一种类型是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种带有随机性的过程。例如在核物理研究中,分析中子在反应堆中的传输过程。中子与原子核作用受到量子力学规律的制约,人们只能知道它们相互作用发生的概率,却无法准确获得中子与原子核作用时的位置以及裂变产生的新中子的行进速率和方向。科学家依据其概率进行随机抽样得到裂变位置、速度和方向,这样模拟大量中子的行为后,经过统计就能获得中子传输的范围,作为反应堆设计的依据。
另一种类型是所求解的问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或者随机变量的期望值。通过随机抽样的方法,以随机事件出现的频率估计其概率,或者以抽样的数字特征估算随机变量的数字特征,并将其作为问题的解,这种方法多用于求解复杂的多维积分问题。
代码语言:javascript复制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()
2. 状态-动作价值函数
2.1 状态-动作价值函数的引入
值迭代法(value iteration)和策略迭代法(policy iteration)是在环境模型已知的情况下求解最佳策略,这类方法可以统称为model-based方法,即环境模型已知或为环境建模。但在很多情况下,环境的模型是未知的,我们不清楚状态之间如何转移,甚至不清楚全部的状态空间长什么样子,这种情况下,无法利用Bellman方程求解价值函数,也无法由价值函数得到最佳策略:
我们引入状态-动作价值函数Q(s,a),令:
则
通过直接求解Q(s,a),便可以得到最佳策略。下面我们给出Q(s,a)的具体定义:
策略π下状态-动作价值函数
处于状态