强化学习实践二:迭代法评估4*4方格世界下的随机策略

2024-06-02 20:58

本文主要是介绍强化学习实践二:迭代法评估4*4方格世界下的随机策略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇用代码演示《强化学习》第三讲中的示例——方格世界,即用动态规划算法通过迭代计算来评估4*4方格世界中的一个随机策略。具体问题是这样:

已知(如上图):

  • 状态空间 S:S_{1} - S_{14}为非终止状态;S_{0}S_{15}终止状态,图中灰色方格所示两个位置;
  • 行为空间 A:{n, e, s, w} 对于任何非终止状态可以有向北、东、南、西移动四个行为;
  • 转移概率 P:任何试图离开方格世界的动作其位置将不会发生改变,其余条件下将100%地转移到动作指向的位置;
  • 即时奖励 R:任何在非终止状态间的转移得到的即时奖励均为-1,进入终止状态即时奖励为0;
  • 衰减系数 γ:1;
  • 当前策略π:个体采用随机行动策略,在任何一个非终止状态下有均等的几率往任意可能的方向移动,即π(n|•) = π(e|•) = π(s|•) = π(w|•) = 1/4。

问题:评估在这个方格世界里给定的策略。

该问题等同于:求解该方格世界在给定策略下的(状态)价值函数,也就是求解在给定策略下,该方格世界里每一个状态的价值。

 

我们使用Python编写代码解决该问题。

  • 声明状态
states = [i for i in range(16)]
  • 声明状态价值,并初始化各状态价值为0
values = [0  for _ in range(16)]
  • 声明行为空间
actions = ["n", "e", "s", "w"]
  • 结合方格世界的布局特点,简易声明行为对状态的改变(-4表示向前移4格,相当于向上移1格)
ds_actions = {"n": -4, "e": 1, "s": 4, "w": -1} 
  • 声明衰减系数为1
gamma = 1.00
  • 根据当前状态和行为确定下一状态
def nextState(s, a):next_state = sif (s%4 == 0 and a == "w") or (s<4 and a == "n") or \((s+1)%4 == 0 and a == "e") or (s > 11 and a == "s"):passelse:ds = ds_actions[a]next_state = s + dsreturn next_state
  • 得到某一状态的即时奖励
def rewardOf(s):return 0 if s in [0,15] else -1
  • 判断某一状态是否为终止状态
def isTerminateState(s):return s in [0,15]
  • 获取某一状态的所有可能的后继状态
def getSuccessors(s):successors = []if isTerminateState(s):return successorsfor a in actions:next_state = nextState(s, a)# if s != next_state:successors.append(next_state)return successors
  • 根据后继状态的价值更新某一状态的价值
def updateValue(s):sucessors = getSuccessors(s)newValue = 0  # values[s]num = 4       # len(successors)reward = rewardOf(s)for next_state in sucessors:newValue += 1.00/num * (reward + gamma * values[next_state])return newValue
  • 进行一次迭代
def performOneIteration():newValues = [0 for _ in range(16)]for s in states:newValues[s] = updateValue(s)global valuesvalues = newValuesprintValue(values)
  • 辅助函数输出状态价值
def printValue(v):for i in range(16):print('{0:>6.2f}'.format(v[i]),end = " ")if (i+1)%4 == 0:print("")print()
  • 主函数
def main():max_iterate_times = 160cur_iterate_times = 0while cur_iterate_times <= max_iterate_times:print("Iterate No.{0}".format(cur_iterate_times))performOneIteration()cur_iterate_times += 1printValue(values)

 

由于事先知道该算法将在150次左右收敛,我们将最大迭代次数设为了160,最后得到的价值函数如下:

The value function converges to:0.00  -14.00 -20.00 -22.00 
-14.00 -18.00 -20.00 -20.00 
-20.00 -20.00 -18.00 -14.00 
-22.00 -20.00 -14.00   0.00 
At Iterate No.153

从以上代码我们可以看出,我们设置了一个获取某一状态所有后续可能状态的集合这么一个方法,这就是体现动态规划算法思想的地方。如果无法获取一个状态的所有可能后续状态,那么就不能使用动态规划算法来求解。此外,我们使用的是异步更新价值的方法,即某一时刻状态的价值由前一时刻状态价值来计算。

完整的Python代码参考,这里还有一个使用javascript编写的Demo,该Demo还可以展示策略迭代和价值迭代过程。地址如下:动态规划 价值与策略迭代。此Demo借鉴了ReinforceJS的示例。

 

本文转自:https://zhuanlan.zhihu.com/p/28084990

 

 

 

这篇关于强化学习实践二:迭代法评估4*4方格世界下的随机策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成