【Python强化学习】蒙特卡洛法讲解及在冰湖问题中实战(图文解释 附源码)

简介: 【Python强化学习】蒙特卡洛法讲解及在冰湖问题中实战(图文解释 附源码)

需要源码请点赞关注收藏后评论区留言私信~~~

随机性策略

首先生成一个随机初始化的随机性策略

def create_random_policy(env):
    pi = np.ones([env.observation_space.n, env.action_space.n]) # 用数组来存储策略
    p = 1 / env.action_space.n 
    return pi * p
pi = create_random_policy(env)
print( pi )

然后按随机性策略进行尝试

def episode_random(env, pi, render = False):
    env.reset()
    if render:    
        env.render()
    episode = []
    done = False
    while not done:
        s = env.env.s # 读取环境状态
        timestep = []
        timestep.append(s)        
        action = np.random.choice(env.action_space.n, p=pi[s])        
        # 执行动作并记录
        next_s, r, done, info = env.step(action)
        timestep.append(action)
        timestep.append(r)
        episode.append(timestep)        
        if render: 
            env.render()
    return episode
tau = episode_random(env, pi, False)
print( tau )

蒙特卡洛法基本思想

在没有环境模型时,在策略评估阶段,用随机近似方法来求值函数的近似值:

动作值函数: Q_π(s,a)=E_π[G_t|S_t=s┤,A_t=a]

求函数f(x)关于 x的分布p(x)的期望E[f(x)]=∫▒p(x)f(x)□dx,可以先依概率p(x)采样x_i,然后根据大数定律用样本均值来近似:

流程图如下

一次尝试的轨迹如下:

更新动作值函数:对所有s和a对应的动作值函数重新求均值

主体的轨迹中可能会出现相同的状态值和动作值对(s,a),也就是说,主体在探索时,可能会回到以前的状态并做出与上次相同的动作。如上述示例轨迹中的第1步和第2步。

对重复状态和动作值对(s,a)的处理,有两种方法,分别称为每次访问统计和初次访问统计。

每次访问统计是对每个出现的(s,a)都进行采样用于后续统计。 初次访问统计是只对第一次出现的(s,a)进行采样。

步骤(3)是对每一(s,a),统计它的所有采样的累积折扣回报的均值,即得到动作值函数Q(s,a)的近似估计值。

在统计累积折扣回报的均值时,如果按照保存所有G值再平均的常规方法会占用大量的存储空间,此时,可采用所谓的递增计算均值的方法。

对(s,a)新增的累积折扣回报G,动作值函数Q(s,a)的递增计算式为:

式中,N(s,a)表示已经统计的次数。

使用同策略蒙特卡洛法求解冰湖问题结果如下

部分代码如下

def mc_on_policy(env, epsilon=0.01, n_episodes=100):    
    pi = create_random_policy(env)  # 产生随机策略,数组形式    
    Q_value = np.zeros([env.observation_space.n, env.action_space.n]) 
    N_s_a = np.zeros([env.observation_space.n, env.action_space.n])  
    for k in range(n_episodes):         
        G = 0 # 累积回报
        tau = episode_random(env, pi, False) # 采样得到轨迹τ 
        for i in reversed( range( 0, len(tau) ) ):   
            s_t, a_t, r_t = tau[i] 
            G += r_t 
            if not (s_t, a_t) in [(x[0], x[1]) for x in tau[0:i]]: # 初次访问统计
                N_s_a[s_t, a_t] += 1
                Q_value[s_t, a_t] = Q_value[s_t, a_t] + ( G - Q_value[s_t, a_t] ) / N_s_a[s_t, a_t]        
        for value[s] == np.max(Q_value[s]))
            tag_max_Q = random.choice(indices[0])
            pi[s][tag_max_Q] += 1 - epsilon # 最优动作的增加概率            
    return pi

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
19天前
|
机器学习/深度学习 算法 调度
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
|
9天前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
109 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
10天前
|
设计模式 人工智能 API
AI智能体开发实战:17种核心架构模式详解与Python代码实现
本文系统解析17种智能体架构设计模式,涵盖多智能体协作、思维树、反思优化与工具调用等核心范式,结合LangChain与LangGraph实现代码工作流,并通过真实案例验证效果,助力构建高效AI系统。
132 7
|
12天前
|
数据采集 存储 前端开发
5分钟学会用Python爬取知乎热榜:从零开始的实战指南
免费提供Python与PyCharm安装包,助你零成本开启编程之旅!链接:https://pan.quark.cn/s/48a86be2fdc0
286 0
|
12天前
|
JSON 缓存 开发者
淘宝商品详情接口(item_get)企业级全解析:参数配置、签名机制与 Python 代码实战
本文详解淘宝开放平台taobao.item_get接口对接全流程,涵盖参数配置、MD5签名生成、Python企业级代码实现及高频问题排查,提供可落地的实战方案,助你高效稳定获取商品数据。
|
13天前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
131 0
|
存储 缓存 NoSQL
实战|教你用Python玩转Redis
之前辰哥已经给大家教了Python如何去连接Mysql(实战|教你用Python玩转Mysql),并进行相应操作(插、查、改、删)。除了Mysql外,Python最常搭配的数据库还有Redis。 那么今天辰哥就来给大家讲解一下Python如何使用Redis,并进行相关的实战操作。
591 0
|
21天前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
191 102
|
21天前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
194 104
|
21天前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
185 103

热门文章

最新文章

推荐镜像

更多