【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

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

相关文章
|
20天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
13天前
|
数据可视化 算法 数据挖掘
Python量化投资实践:基于蒙特卡洛模拟的投资组合风险建模与分析
蒙特卡洛模拟是一种利用重复随机抽样解决确定性问题的计算方法,广泛应用于金融领域的不确定性建模和风险评估。本文介绍如何使用Python和EODHD API获取历史交易数据,通过模拟生成未来价格路径,分析投资风险与收益,包括VaR和CVaR计算,以辅助投资者制定合理决策。
60 15
|
20天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
44 10
|
28天前
|
JSON 开发工具 git
基于Python和pygame的植物大战僵尸游戏设计源码
本项目是基于Python和pygame开发的植物大战僵尸游戏,包含125个文件,如PNG图像、Python源码等,提供丰富的游戏开发学习素材。游戏设计源码可从提供的链接下载。关键词:Python游戏开发、pygame、植物大战僵尸、源码分享。
|
1月前
|
机器学习/深度学习 人工智能 算法
强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用
本文探讨了强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用,通过案例分析展示了其潜力,并讨论了面临的挑战及未来发展趋势。强化学习正为游戏AI带来新的可能性。
93 4
|
1月前
|
算法 Unix 数据库
Python编程入门:从基础到实战
本篇文章将带你进入Python编程的奇妙世界。我们将从最基础的概念开始,逐步深入,最后通过一个实际的项目案例,让你真正体验到Python编程的乐趣和实用性。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你提供有价值的信息和知识。让我们一起探索Python的世界吧!
|
1月前
|
数据处理 Python
探索Python中的异步编程:从基础到实战
在Python的世界中,“速度”不仅是赛车手的追求。本文将带你领略Python异步编程的魅力,从原理到实践,我们不单单是看代码,更通过实例感受它的威力。你将学会如何用更少的服务器资源做更多的事,就像是在厨房里同时烹饪多道菜而不让任何一道烧焦。准备好了吗?让我们开始这场技术烹饪之旅。
|
21天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
8天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
101 80
|
27天前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
134 59