使用python运行网格世界环境下 TD算法

一、概述

本代码实现了在网格世界环境中使用 TD (0)(Temporal Difference (0))算法进行策略评估,并对评估结果进行可视化展示。通过模拟智能体在网格世界中的移动,不断更新状态值函数,最终得到每个状态的价值估计。

二、依赖库

  • numpy:用于进行数值计算,如数组操作、随机数生成等。
  • matplotlib.pyplot:用于绘制图形,将状态值函数的评估结果进行可视化。

三、代码结构与详细说明

1. 导入库

收起

python

import numpy as np
import matplotlib.pyplot as plt

导入 numpy 库并将其别名为 np,导入 matplotlib.pyplot 库并将其别名为 plt,以便后续使用。

2. 定义网格世界环境类 GridWorld

收起

python

# 定义网格世界环境
class GridWorld:def __init__(self, size=10):self.size = sizeself.terminal = (3, 3)  # 终止状态

  • 功能:初始化网格世界环境。
  • 参数
    • size:网格世界的大小,默认为 10x10 的网格,即网格的边长为 10。
    • self.terminal:终止状态的坐标,这里设置为 (3, 3),当智能体到达该状态时,一个回合结束。

收起

python

    def is_terminal(self, state):return state == self.terminal

  • 功能:判断给定的状态是否为终止状态。
  • 参数
    • state:要判断的状态,以坐标元组 (x, y) 的形式表示。
  • 返回值:如果 state 等于 self.terminal,返回 True;否则返回 False

收起

python

    def step(self, state, action):x, y = stateif self.is_terminal(state):return state, 0  # 终止状态不再变化

  • 功能:模拟智能体在当前状态下采取指定动作后的状态转移和奖励获取。
  • 参数
    • state:当前状态,以坐标元组 (x, y) 的形式表示。
    • action:智能体采取的动作,用整数表示,0 表示向上,1 表示向下,2 表示向左,3 表示向右。
  • 处理逻辑:如果当前状态是终止状态,则直接返回当前状态和奖励 0,因为终止状态不会再发生变化。

收起

python

        # 定义动作:0=上, 1=下, 2=左, 3=右dx, dy = [(-1,0), (1,0), (0,-1), (0,1)][action]new_x = max(0, min(self.size - 1, x + dx))new_y = max(0, min(self.size - 1, y + dy))new_state = (new_x, new_y)

  • 处理逻辑
    • 根据动作编号 action 从列表 [(-1,0), (1,0), (0,-1), (0,1)] 中选取对应的偏移量 (dx, dy)
    • 计算新的 x 和 y 坐标,使用 max 和 min 函数确保新坐标在网格世界的边界内(范围是 0 到 self.size - 1)。
    • 将新的坐标组合成新的状态 new_state

收起

python

        reward = -1  # 每步固定奖励return new_state, reward

  • 处理逻辑:每走一步给予固定奖励 -1,然后返回新的状态和奖励。

3. TD (0) 策略评估函数 td0_policy_evaluation

收起

python

# TD(0) 策略评估
def td0_policy_evaluation(env, episodes=5000, alpha=0.1, gamma=1.0):V = np.zeros((env.size, env.size))  # 初始化状态值函数

  • 功能:使用 TD (0) 算法对策略进行评估,得到每个状态的价值估计。
  • 参数
    • env:网格世界环境对象,用于获取环境信息和执行状态转移。
    • episodes:训练的回合数,默认为 5000。
    • alpha:学习率,控制每次更新状态值函数时的步长,默认为 0.1。
    • gamma:折扣因子,用于权衡当前奖励和未来奖励的重要性,默认为 1.0。
  • 处理逻辑:初始化一个大小为 (env.size, env.size) 的二维数组 V,用于存储每个状态的价值估计,初始值都为 0。

收起

python

    for _ in range(episodes):state = (0, 0)  # 初始状态while True:if env.is_terminal(state):break

  • 处理逻辑
    • 进行 episodes 个回合的训练,每个回合从初始状态 (0, 0) 开始。
    • 使用 while 循环不断执行动作,直到智能体到达终止状态。

收起

python

            # 随机策略:均匀选择动作(上下左右各25%概率)action = np.random.randint(0, 4)next_state, reward = env.step(state, action)

  • 处理逻辑
    • 使用 np.random.randint(0, 4) 随机选择一个动作,每个动作的选择概率为 25%。
    • 调用环境的 step 方法,执行选择的动作,得到下一个状态 next_state 和奖励 reward

收起

python

            # TD(0) 更新公式td_target = reward + gamma * V[next_state]td_error = td_target - V[state]V[state] += alpha * td_error

  • 处理逻辑
    • 根据 TD (0) 算法的更新公式,计算目标值 td_target,即当前奖励加上折扣后的下一个状态的价值估计。
    • 计算 TD 误差 td_error,即目标值与当前状态的价值估计之差。
    • 使用学习率 alpha 乘以 TD 误差,更新当前状态的价值估计。

收起

python

            state = next_state  # 转移到下一状态

  • 处理逻辑:将当前状态更新为下一个状态,继续下一次循环。

收起

python

    return V

  • 返回值:返回经过 episodes 个回合训练后得到的状态值函数 V

4. 运行算法

收起

python

# 运行算法
env = GridWorld()
V = td0_policy_evaluation(env, episodes=1000)

  • 处理逻辑
    • 创建一个 GridWorld 类的实例 env,初始化网格世界环境。
    • 调用 td0_policy_evaluation 函数,对环境进行 1000 个回合的策略评估,得到状态值函数 V

5. 可视化结果函数 plot_value_function

收起

python

# 可视化结果
def plot_value_function(V):fig, ax = plt.subplots()im = ax.imshow(V, cmap='coolwarm')

  • 功能:将状态值函数 V 进行可视化展示。
  • 处理逻辑
    • 创建一个图形对象 fig 和一个坐标轴对象 ax
    • 使用 ax.imshow 函数将状态值函数 V 以图像的形式显示出来,使用 coolwarm 颜色映射。

收起

python

    for i in range(V.shape[0]):for j in range(V.shape[1]):text = ax.text(j, i, f"{V[i, j]:.1f}",ha="center", va="center", color="black")

  • 处理逻辑:遍历状态值函数 V 的每个元素,在对应的图像位置上添加文本标签,显示该状态的价值估计,保留一位小数。

收起

python

    ax.set_title("TD(0) Estimated State Value Function")plt.axis('off')plt.colorbar(im)plt.show()

  • 处理逻辑
    • 设置图形的标题为 “TD (0) Estimated State Value Function”。
    • 关闭坐标轴显示。
    • 添加颜色条,用于显示颜色与数值的对应关系。
    • 显示绘制好的图形。

6. 调用可视化函数

收起

python

plot_value_function(V)

调用 plot_value_function 函数,将经过 TD (0) 算法评估得到的状态值函数 V 进行可视化展示。

四、注意事项

  • 可以根据需要调整 GridWorld 类的 size 参数和 terminal 属性,改变网格世界的大小和终止状态的位置。
  • 可以调整 td0_policy_evaluation 函数的 episodesalpha 和 gamma 参数,优化策略评估的效果。
  • 代码中的随机策略是简单的均匀随机选择动作,可根据实际需求修改为更复杂的策略。

完整代码

import numpy as np
import matplotlib.pyplot as plt# 定义网格世界环境
class GridWorld:def __init__(self, size=10):self.size = sizeself.terminal = (3, 3)  # 终止状态def is_terminal(self, state):return state == self.terminaldef step(self, state, action):x, y = stateif self.is_terminal(state):return state, 0  # 终止状态不再变化# 定义动作:0=上, 1=下, 2=左, 3=右dx, dy = [(-1,0), (1,0), (0,-1), (0,1)][action]new_x = max(0, min(self.size - 1, x + dx))new_y = max(0, min(self.size - 1, y + dy))new_state = (new_x, new_y)reward = -1  # 每步固定奖励return new_state, reward# TD(0) 策略评估
def td0_policy_evaluation(env, episodes=5000, alpha=0.1, gamma=1.0):V = np.zeros((env.size, env.size))  # 初始化状态值函数for _ in range(episodes):state = (0, 0)  # 初始状态while True:if env.is_terminal(state):break# 随机策略:均匀选择动作(上下左右各25%概率)action = np.random.randint(0, 4)next_state, reward = env.step(state, action)# TD(0) 更新公式td_target = reward + gamma * V[next_state]td_error = td_target - V[state]V[state] += alpha * td_errorstate = next_state  # 转移到下一状态return V# 运行算法
env = GridWorld()
V = td0_policy_evaluation(env, episodes=1000)# 可视化结果
def plot_value_function(V):fig, ax = plt.subplots()im = ax.imshow(V, cmap='coolwarm')for i in range(V.shape[0]):for j in range(V.shape[1]):text = ax.text(j, i, f"{V[i, j]:.1f}",ha="center", va="center", color="black")ax.set_title("TD(0) Estimated State Value Function")plt.axis('off')plt.colorbar(im)plt.show()plot_value_function(V)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27200.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用 Python 爬虫进行跨境电商数据采集

1 引言2 代理IP的优势3 获取代理IP账号4 爬取实战案例---(某电商网站爬取)4.1 网站分析4.2 编写代码4.3 优化代码 5 总结 1 引言 在数字化时代,数据作为核心资源蕴含重要价值,网络爬虫成为企业洞察市场趋势、学术研究探索未知领域…

Minio搭建并在SpringBoot中使用完成用户头像的上传

Minio使用搭建并上传用户头像到服务器操作,学习笔记 Minio介绍 minio官网 MinIO是一个开源的分布式对象存储服务器,支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发,拥有轻量级、高性能、易部署等特点,并且可以自由…

FPGA AXI-Stream协议详解与仿真实践

AXI-Stream协议详解与仿真实践 1 摘要 AXI-Stream总线是一种高效、简单的数据传输协议,主要用于高吞吐量的数据流传输场景。相比于传统的AXI总线,AXI-Stream总线更加简单和轻量级,它通过无需地址的方式,将数据从一个模块传输到另一个模块,适用于需要高速数据传输的应用场…

浙大 DeepSeek 线上课学习笔记

目录 DeepSeek:回望AI三大主义与加强通识教育 从达特茅斯启航的人工智能三大主义 人工智能三剑客之一:符号主义人工智能的逻辑推理 人工智能三剑客之二:连接主义人工智能的数据驱动 人工智能三剑客之三:行为主义人工智能的百…

【Python机器学习】1.2. 线性回归理论:一元线性回归、最小化平方误差和公式(SSE)、梯度下降法

喜欢的话别忘了点赞、收藏加关注哦(关注即可查看全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 1.2.1. 什么是回归分析(Regressive Analysis)? 一些例子 举一些例子吧: 下图是…

golang介绍,特点,项目结构,基本变量类型与声明介绍(数组,切片,映射),控制流语句介绍(条件,循环,switch case)

目录 golang 介绍 面向并发 面向组合 特点 项目结构 图示 入口文件 main.go 基本变量类型与声明 介绍 声明变量 常量 字符串(string) 字符串格式化 空接口类型 数组 切片 创建对象 追加元素 复制切片 map(映射) 创建对象 使用 多重赋值 控制流语句…

《白帽子讲 Web 安全》之移动 Web 安全

目录 摘要 一、WebView 简介 二、WebView 对外暴露 WebView 对外暴露的接口风险 三、通用型 XSS - Universal XSS 介绍 四、WebView 跨域访问 五、与本地代码交互 js 5.1接口暴露风险: 5.2漏洞利用: 5.3JavaScript 与 Native 代码通信 六、Chr…

算法日常刷题笔记(3)

为保持刷题的习惯 计划一天刷3-5题 然后一周总计汇总一下 这是第三篇笔记 笔记时间为2月24日到3月2日 第一天 设计有序流 设计有序流https://leetcode.cn/problems/design-an-ordered-stream/ 有 n 个 (id, value) 对,其中 id 是 1 到 n 之间的一个整数&#xff…

mysql5.7离线安装及问题解决

这次主要是讲解mysql5.7离线安装教程和一主一从数据库配置 1、去官网下载自己对应的mysql https://downloads.mysql.com/archives/community/2、查看需要安装mysql服务器的linux的类型 uname -a第二步看一下系统有没有安装mysql rpm -qa|grep -i mysql3、上传安装包 用远程…

JAVA实战开源项目:安康旅游网站(Vue+SpringBoot) 附源码

本文项目编号 T 098 ,文末自助获取源码 \color{red}{T098,文末自助获取源码} T098,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

三数之和_算法

1.题目描述 首先我们分析下这道题目:假设给我们一个数组,让数组某三个不同下标的数相加最终得0,那么我就返回这三个数.但是如果返回的多个数组中的元素相同,那么我们还要删掉其中一个保留一个. 注意:这道题的重点是三个数的下标不能相等并且返回的数组中的元素也不能相等,通过…

关于Deepseek本地部署硬件环境检查教程

要在电脑上本地部署DeepSeek,需要关注以下硬件和软件配置: 硬件配置 CPU:至少4核CPU,推荐Intel i5/i7或AMD Ryzen 5/7系列处理器。内存:至少8GB DDR4内存,推荐16GB DDR4内存,对于大型模型建议…

一周一个Unity小游戏2D反弹球游戏 - 移动的弹板(鼠标版)

前言 本文将实现控制弹板移动,通过Unity的New Input System,可以支持鼠标移动弹板跟随移动,触控点击跟随移动,并且当弹板移动到边界时,弹板不会移动超过边界之外。 创建移动相关的InputAction 项目模版创建的时候默认会有一个InputAction类型的文件,名字为InputSystem_Ac…

250302-绿联NAS通过Docker配置SearXNG及适配Open-WebUI的yaml配置

A. 配置Docker中的代理 绿联NAS简单解决docker无法获取镜像-不用软路由 - 哔哩哔哩 B. 下载官网对应的镜像 群晖NAS用docker搭建SearXNG元搜索引擎_哔哩哔哩_bilibili C. 修改默认省略的参数,只配置Base_URL,删除其它默认的空缺项 searxng-docker/REA…

C++-第十九章:异常

目录 第一节:异常有哪些 第二节:异常相关关键字 2-1.抛出异常 2-2.捕获异常 2-3.异常的捕获规则 2-3-1.异常被最近的catch捕获 2-3-2.catch捕获的是异常的拷贝 2-3-3.异常为子类时,可以用父类引用接收 2-4.捕获任意异常 第三节&#xff1…

Redis详解(实战 + 面试)

目录 Redis 是单线程的!为什么 Redis-Key(操作redis的key命令) String 扩展字符串操作命令 数字增长命令 字符串范围range命令 设置过期时间命令 批量设置值 string设置对象,但最好使用hash来存储对象 组合命令getset,先get然后在set Hash hash命令: h…

‘ts-node‘ 不是内部或外部命令,也不是可运行的程序

新建一个test.ts文件 let message: string = Hello World; console.log(message);如果没有任何配置的前提下,会报错’ts-node’ 不是内部或外部命令,也不是可运行的程序。 此时需要安装一下ts-node。 npm install

(十 五)趣学设计模式 之 命令模式!

目录 一、 啥是命令模式?二、 为什么要用命令模式?三、 策略模式的实现方式四、 命令模式的优缺点五、 命令模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…

基于单片机的智能扫地机器人

1 电路设计 1.1 电源电路 本电源采用两块LM7805作为稳压电源,一块为控制电路和传感器电路供电,另一块单独为电机供电。分开供电这样做的好处,有利于减小干扰,提高系统稳定性。 LM7805是常用的三端稳压器件,顾名思义0…

【Redis学习】Redis Docker安装,自定义config文件(包括RDB\AOF setup)以及与Spring Boot项目集成

【本文内容】 第1章:通过Docker安装Redis,并自定义config文件以及mount data目录。第2章:介绍Redis持久化到磁盘,有4种方式:RDB / AOF / NONE / RDB AOF。第3章:使用Server自带的redis-cli工具连接。第4章…