RL - 强化学习 蒙特卡洛 (Monte-Carlo) 方法计算状态价值

2023-10-09 19:40

本文主要是介绍RL - 强化学习 蒙特卡洛 (Monte-Carlo) 方法计算状态价值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://blog.csdn.net/caroline_wendy/article/details/131102145

MC

在强化学习中,状态价值 (State Value) 是指在特定状态下,智能体能够从该状态开始执行一系列动作,并且按照某个策略进行决策,所能获得的期望累积回报。状态价值函数用于衡量状态的好坏程度,指导智能体在不同状态下,选择最优的行动。

蒙特卡洛方法是一种基于随机采样和统计的强化学习方法,用于估计值函数或优化策略,得名于摩纳哥的蒙特卡洛赌场,因为这种方法使用了大量的随机模拟。在蒙特卡洛方法中,智能体通过与环境的交互来学习,其基本思想是通过多次采样来估计状态或动作的值函数,并根据估计的值函数进行策略改进。蒙特卡洛方法不需要对环境模型进行假设,只需通过与环境的交互来获得样本。

使用蒙特卡洛方法计算状态价值的具体过程,如下:

  1. 使用策略 π \pi π 采样若干条序列。
  2. 对每一条序列中,每一时间步 t t t 的状态 s s s ,更新计数器 N ( s ) ← N ( s ) + 1 N(s) \leftarrow N(s)+1 N(s)N(s)+1,更新总回报 M ( s ) ← M ( s ) + G t M(s) \leftarrow M(s)+G_{t} M(s)M(s)+Gt
  3. 每一个状态的价值被估计为回报的平均值, V ( s ) = M ( s ) N ( s ) V(s)=\frac{M(s)}{N(s)} V(s)=N(s)M(s)

也可以使用增量更新,即
G ← r + γ ∗ G V ( s ) ← V ( s ) + 1 N ( s ) ( G − V ( s ) ) G \leftarrow r + \gamma*G \\ V(s) \leftarrow V(s) +\frac{1}{N(s)}(G-V(s)) Gr+γGV(s)V(s)+N(s)1(GV(s))
序列的单个步骤是(s,a,r,s_next),即从状态s中,(随机)选择a(s,a)的奖励是r,(随机)跳转至s_next

蒙特卡洛方法的采样源码:

# 把输入的两个字符串通过“-”连接,便于使用上述定义的P、R变量
def join(str1, str2):return str1 + '-' + str2def sample(MDP, Pi, timestep_max, number):"""采样函数:param MDP: MDP的元组:param Pi: 策略:param timestep_max: 最长时间步:param number: 采样的序列数:return: 全部采样"""S, A, P, R, gamma = MDPepisodes = []for _ in range(number):episode = []timestep = 0s = S[np.random.randint(4)]  # 随机选择一个除s5以外的状态s作为起点# 当前状态为终止状态或者时间步太长时,一次采样结束while s != "s5" and timestep <= timestep_max:timestep += 1rand, temp = np.random.rand(), 0# 在状态s下根据策略选择动作for a_opt in A:temp += Pi.get(join(s, a_opt), 0)   # 概率逐渐累加至1if temp > rand:  # 最终一定会选择某个动作 a_opta = a_optr = R.get(join(s, a), 0)breakrand, temp = np.random.rand(), 0# 根据状态转移概率得到下一个状态s_nextfor s_opt in S:temp += P.get(join(join(s, a), s_opt), 0)if temp > rand:  # 概率逐渐累加至1s_next = s_opt  # 最终一定会跳转至下个状态s_optbreakepisode.append((s, a, r, s_next))  # 把(s,a,r,s_next)元组放入序列中s = s_next  # s_next变成当前状态,开始接下来的循环episodes.append(episode)return episodes

计算状态价值的源码:

# 对所有采样序列计算所有状态的价值,不断更新V[s]
def MC(episodes, V, N, gamma):for episode in episodes:G = 0for i in range(len(episode) - 1, -1, -1):  #一个序列从后往前计算(s, a, r, s_next) = episode[i]G = r + gamma * GN[s] = N[s] + 1V[s] = V[s] + (G - V[s]) / N[s]

测试输出:

def main():np.random.seed(0)S = ["s1", "s2", "s3", "s4", "s5"]  # 状态集合A = ["保持s1", "前往s1", "前往s2", "前往s3", "前往s4", "前往s5", "概率前往"]  # 动作集合# 状态转移函数P = {"s1-保持s1-s1": 1.0,"s1-前往s2-s2": 1.0,"s2-前往s1-s1": 1.0,"s2-前往s3-s3": 1.0,"s3-前往s4-s4": 1.0,"s3-前往s5-s5": 1.0,"s4-前往s5-s5": 1.0,"s4-概率前往-s2": 0.2,"s4-概率前往-s3": 0.4,"s4-概率前往-s4": 0.4,}# 奖励函数R = {"s1-保持s1": -1,"s1-前往s2": 0,"s2-前往s1": -1,"s2-前往s3": -2,"s3-前往s4": -2,"s3-前往s5": 0,"s4-前往s5": 10,"s4-概率前往": 1,}gamma = 0.5  # 折扣因子MDP = (S, A, P, R, gamma)# 策略1,随机策略Pi_1 = {"s1-保持s1": 0.5,"s1-前往s2": 0.5,"s2-前往s1": 0.5,"s2-前往s3": 0.5,"s3-前往s4": 0.5,"s3-前往s5": 0.5,"s4-前往s5": 0.5,"s4-概率前往": 0.5,}# 采样5次,每个序列最长不超过20步episodes = sample(MDP, Pi_1, 20, 5)print('第一条序列\n', episodes[0])print('第二条序列\n', episodes[1])print('第五条序列\n', episodes[4])timestep_max = 20# 采样1000次,可以自行修改episodes = sample(MDP, Pi_1, timestep_max, 1000)gamma = 0.5V = {"s1": 0, "s2": 0, "s3": 0, "s4": 0, "s5": 0}N = {"s1": 0, "s2": 0, "s3": 0, "s4": 0, "s5": 0}MC(episodes, V, N, gamma)print("使用蒙特卡洛方法计算MDP的状态价值为\n", V)if __name__ == '__main__':main()

输出结果:

# 使用蒙特卡洛方法计算MDP的状态价值{'s1': -1.228923788722258, 's2': -1.6955696284402704, 's3': 0.4823809701532294, 's4': 5.967514743019431, 's5': 0}# 通过MRP计算的状态价值[[-1.22555411] [-1.67666232] [ 0.51890482] [ 6.0756193 ] [ 0.        ]]

状态价值,可以用于计算状态动作价值,具有指导意义。

这篇关于RL - 强化学习 蒙特卡洛 (Monte-Carlo) 方法计算状态价值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/175120

相关文章

Nginx 访问控制的多种方法

《Nginx访问控制的多种方法》本文系统介绍了Nginx实现Web访问控制的多种方法,包括IP黑白名单、路径/方法/参数控制、HTTP基本认证、防盗链机制、客户端证书校验、限速限流、地理位置控制等基... 目录一、IP 白名单与黑名单1. 允许/拒绝指定IP2. 全局黑名单二、基于路径、方法、参数的访问控制

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

nginx跨域访问配置的几种方法实现

《nginx跨域访问配置的几种方法实现》本文详细介绍了Nginx跨域配置方法,包括基本配置、只允许指定域名、携带Cookie的跨域、动态设置允许的Origin、支持不同路径的跨域控制、静态资源跨域以及... 目录一、基本跨域配置二、只允许指定域名跨域三、完整示例四、配置后重载 nginx五、注意事项六、支持

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

MySQL底层文件的查看和修改方法

《MySQL底层文件的查看和修改方法》MySQL底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以Linux环境为例,需... 目录引言一、mysql 底层文件的查看方法1. 先定位核心文件路径(基础前提)2. 文本类文件(可直

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

Prometheus+cpolar如何在手机上也能监控服务器状态?

《Prometheus+cpolar如何在手机上也能监控服务器状态?》本文强调了通过Cpolar这一内网穿透工具,轻松突破Prometheus仅限于局域网访问的限制,实现外网随时随地访问监控数据,教你... 目录前言1.安装prometheus2.安装cpolar实现随时随地开发3.配置公网地址4.保留固定

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝