强化学习实践二:迭代法评估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中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行