第10篇:强化学习Q-learning求解迷宫问题 代码实现

news2024/11/24 21:08:58

你好,我是郭震(zhenguo)

今天重新发布强化学习第10篇:强化学习Q-learning求解迷宫问题 代码实现

我想对此篇做一些更加详细的解释。

1 创建地图

创建迷宫地图,包括墙网格,走到墙网格就是负奖励。

注意:空白可行走网格奖励值设置为负数,比如-1, 是为减少路径中所经点数;如果设置为大于0的奖励值,路线中会出现冗余点。

import numpy as np

# 创建迷宫地图
exit_coord = (3, 3)
row_n, col_n = 4, 4

maze = np.zeros((row_n, col_n)) - 1

# 走出迷宫奖励10个积分
maze[exit_coord] = 10

# 走到墙网格,扣除10个积分
maze[(0, 3)] = -10
maze[(1, 0)] = -10
maze[(1, 2)] = -10
maze[(2, 2)] = -10
maze[(3, 0)] = -10
e1f60068b0ddecbb49ca3c4224d108fa.png

2 定义动作

定义动作集合

# 定义动作集合
action_n = 4
actions = [0, 1, 2, 3]  # 上、下、左、右

3 算法参数

定义参数

# 定义参数
alpha = 0.1  # 学习率
gamma = 0.9  # 折扣因子
epsilon = 0.1  # ε-greedy策略的ε值

4 初始化Q表

初始化Q表,三维数组。

# 初始化Q表
Q = np.zeros((row_n, col_n, action_n))

5 算法迭代

进行Q-learning算法迭代更新,包括步骤:

  • 选择动作

  • 执行动作,更新状态

  • 更新Q值

算法实现中一些细节处理包括:

  1. 智能体走到边界时,排除一些action

  2. 每次episode后,根据路线所经点的reward求和,判断是否找到更优路线。

# 进行Q-learning算法迭代更新
begin_cord = (0, 0)
max_reward_route = float("-inf")
for episode in range(200):
    # 初始化起始位置
    state = begin_cord
    route = [state]
    while state != exit_coord:  # 终止条件:到达终点位置
        tmp = actions.copy()
        # 排除一些可能
        if state[0] == 0:  # 不能向上
            tmp.remove(0)
        if state[1] == 0:  # 不能向左
            tmp.remove(2)
        if state[0] == row_n - 1:  # 不能向下
            tmp.remove(1)
        if state[1] == col_n - 1:  # 不能向右
            tmp.remove(3)

        # 选择动作
        if np.random.uniform() < epsilon:
            action = np.random.choice(tmp)  # ε-greedy策略,以一定概率随机选择动作
        else:
            action = np.argmax(Q[state[0], state[1], tmp])  # 选择Q值最大的动作
            action = tmp[action]

        # 执行动作,更新状态
        next_state = state
        if action == 0:  # 上
            next_state = (state[0] - 1, state[1])
        elif action == 1:  # 下
            next_state = (state[0] + 1, state[1])
        elif action == 2:  # 左
            next_state = (state[0], state[1] - 1)
        elif action == 3:  # 右
            next_state = (state[0], state[1] + 1)

        # 获取即时奖励
        reward = maze[next_state]

        # 更新Q值
        Q[state][action] = (1 - alpha) * Q[state][action] + alpha * (reward + gamma * np.max(Q[next_state]))

        # 更新状态
        state = next_state
        route.append(state)

    route_reward = sum(maze[state] for state in route)
    if max_reward_route < route_reward:
        max_reward_route = route_reward
        best_route = route.copy()
        print(f"episode: {episode}, 新发现最优路线:{best_route}")

    route.clear()
    cur_reward_route = 0

迭代完成,得到最佳路线,就如上图所示环境,最佳路线如下所示。大概在第50-80迭代步便可搜索到:

[(0, 0), (0, 1), (1, 1), (2, 1), (3, 1), (3, 2), (3, 3)]
4300dc2795140bb557f4710225e06409.png

Q表如下所示,可以看到红框所示为下面粉丝网格的Q值,第三个元素就是向左的奖励值,看到是最低的,因为是墙体。

44e861099d03480eee56dd0cfd758b94.png 851cfd4332f85c4c36551d499b80f3d2.png

根据此Q表,我们可预测出从任意位置出发的最佳路线,大家自行尝试。

最后分析训练时步与路线奖励值关系图,看到逐渐收敛。

ea500eab4a10a19550231d675b4a640f.png

以上,Q-learning算法求迷宫问题,代码实现。

感谢你的点赞和转发,让我更新更有动

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用JRS303校验对参数进行提前校验

文章目录 前言JRS303简单使用版本JRS303提供的常用校验注解 JRS303进阶使用版本情景一&#xff1a;对于一个主键id字段我想要新增的时候不校验 但是更新的时候进行校验情景二&#xff1a; 在实际项目中 我们有一些字段只能填入规定的几个值 类似于枚举 那么就需要我们编写自定义…

N-Gram语言模型工具kenlm的详细安装教程

【本配置过程基于Linux系统】 下载源代码&#xff1a; wget -O - https://kheafield.com/code/kenlm.tar.gz |tar xz 编译&#xff1a; makdir kenlm/build cd kenlm/build cmake .. && make -j4 发现报错&#xff1a; 系统中没有cmake&#xff0c;按照错误提示&am…

华为认证 | HCIA-SDN 考试大纲

01 考试概述 02 考试范围 HCIA-SDN V1.0考试覆盖数据通信基础知识&#xff0c;SDN架构&#xff0c;SDN二、三层网络原理&#xff0c;SDN接口协议原理比如OpenFlow协议、Netconf协议、RestFul协议原理&#xff0c;以及在华为交换机与路由器中的实现。 SDN二三层技术&#xff1…

【JVM系列】java类加载机制详解

文章目录 一、类的生命周期二、类的加载过程加载验证准备解析初始化 三、类加载时机四、类加载器分类五、双亲委派原则六、Java字节码文件中的JVM指令 类是在运行期间第一次使用时动态加载的&#xff0c;而不是一次性加载所有类。因为如果一次性加载&#xff0c;那么会占用很多…

chatgpt赋能python:Python怎么生成程序?

Python怎么生成程序&#xff1f; 介绍 Python作为一种高级编程语言&#xff0c;最初是为简化代码编写而设计的。Python是一种相对简单的语言&#xff0c;因此在编写软件时非常有用。随着搜索引擎优化的出现和与之相关的需求&#xff0c;Python成为了生成程序的主要方式之一。…

策略模式(二十五)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了状态模式(二十四), 如果没有看过, 请观看上一章 一. 策略模式 引用 菜鸟教程里面 策略模式介绍: https://www.runoob.com/design-pattern/strategy-pattern.html 在策略模式&#xff08;Strategy Pattern&#xff09;…

【MySQL函数】:让你的数据库操作更高效(二)

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL日期时间、条件判断、系统信息、加密、进制转换和IP地址转换函数的讲解✨ 目录 前言一、日期和时间函数二、条件判断函数三、系统信息函数四、加密函数五、进制转换函数六、IP地址转换函数七、总结 一、日期和时…

chatgpt赋能python:Python怎么直接打出两个括号?

Python怎么直接打出两个括号&#xff1f; 你是否曾经在使用Python编写代码时&#xff0c;需要频繁地输入括号&#xff1f;每次都需要输入Shift键和9/0键来输入左右两个括号&#xff0c;有时还会出现输入错误的情况。那么有没有一种更加快捷的方法来输入括号呢&#xff1f;答案…

【Python 随练】企业奖金计算器

题目&#xff1a; 企业发放的奖金根据利润提成。利润 &#xff1a; 低于或等于 10 万元时&#xff0c;奖金可提 10%&#xff1b;高于 10 万元&#xff0c;低于 20 万元时&#xff0c;低于 10 万元的部分按 10%提成&#xff0c;高于 10万元的部分&#xff0c;可提成7.5%&#…

PCIe卡设计方案:单路12Gsps 3G 带宽模拟信号源PCIe卡

一、板卡概述 单路3G带宽模拟信号源卡由DA子卡和PCIe底板组成&#xff0c;二者通过标准FMC连接器互联&#xff0c;可以实现将PCIe总线数据转换为一路高速的模拟量输出。北京太速科技板可广泛用于雷达、通信、光电领域的噪声信号、毛刺、脉冲信号模拟产生等领域。 二、 …

程序的性能优化实践总结——JAVA

文章目录 1、 衡量程序性能的指标2、Java 程序性能优化切入点3、获取程序的性能数据1、nmon:获取系统性能数据2、jvisualvm:获取JVM性能数据3、jmc:获取Java应用详细性能数据4、arthas:获取单个请求的调用链耗时5、wrk获取Web接口的性能数据 4、应用程序优化1、缓冲区2、缓存3、…

mlr3系列机器学习教程1–mlr3介绍.

mlr3包是既往mlr包的升级&#xff0c;mlr3包为大量的机器学习技术提供了一个通用的技术接口。mlr3不单单是一个包&#xff0c;而是一个生态系列&#xff0c;包括一系列机器学习的R包。 我们下导入mlr3包&#xff0c;使用R自带的汽车数据来做个简单的演示 library(mlr3) libra…

Nodejs一、初识

零、文章目录 Nodejs一、初识 1、初识 Node.js &#xff08;1&#xff09;回顾与思考 浏览器中的 JavaScript 的组成部分 为什么 JavaScript 可以在浏览器中被执行 为什么 JavaScript 可以操作 DOM 和 BOM 浏览器中的 JavaScript 运行环境 JavaScript 能否做后端开发&#…

HTMLCSS Day07 CSS Flex布局

文章目录 1.flex布局2.flex布局属性容器属性元素属性 3.flex弹性盒模型3.1.主轴3.2.沿主轴的排列处理3.3.flex-flow属性3.4.justify-content属性3.5.align-items属性3.6.align-content3.7 项目属性3.8.order3.9.flex-grow3.10.flex-shrink3.11.flex-basis3.12.flex3.13.align-s…

干翻Mybatis源码系列之第十篇:Mybatis拦截器基本开发、基本使用和基本细节分析

给自己的每日一句 不从恶人的计谋&#xff0c;不站罪人的道路&#xff0c;不坐亵慢人的座位&#xff0c;惟喜爱耶和华的律法&#xff0c;昼夜思想&#xff0c;这人便为有福&#xff01;他要像一棵树栽在溪水旁&#xff0c;按时候结果子&#xff0c;叶子也不枯干。凡他所做的尽…

使用终极 GUI 框架 NiceGUI 提升你的 Python 应用程序

介绍 随着机器学习和深度学习网站应用程序的快速增长&#xff0c;开发人员一直在寻找新的 Web 框架&#xff0c;以便更轻松地构建这些网站应用程序。 数据科学应用程序的普及程度已经上升&#xff0c;因此新的框架也在增加。开发人员创建了许多新的框架&#xff0c;这些框架被证…

【压缩技巧】如何把文件压缩成RAR?如何解压?

在生活及工作中&#xff0c;我们经常需要压缩文件使其更方便存储或传送。 压缩文件的格式有很多种&#xff0c;RAR是其中一种常见的格式&#xff0c;也是WinRAR软件独有的压缩格式。所以想要把文件压缩成RAR&#xff0c;就可以通过WinRAR来操作。 压缩方法如下&#xff1a; 1…

数组的原型方法-es6

数组的原型方法-es6Array.form()Array.of() find() 和 findIndex()copyWithin()fill()entries(),keys()和values()includes()flat()和flatMap()扩展运算符at()reduce()和reduceRight()some()判断数组中是否存在满足条件的项 18、Array.form() Array.from方法用于将两类对象转…

linuxOPS系统服务_linux高级命令

find命令 find 路径 [选项 选项的值] … 选项作用-name根据文件的名称进行-type按文件类型进行搜索&#xff0c;f代表普通文件&#xff0c;d代表文件夹 find命令查找文件 示例1 查找一个文件 案例1 ,在linux整个系统中查找 test.txt文件 find / -name test.txt -type f案例…

《Opencv3编程入门》学习笔记—第六章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第六章 图像处理 一、线性滤波&#xff1a;方框滤波、均值滤波、高斯滤波 &#xff08;一&#xff09;平滑处理 平滑处理也称模糊处理&#xff0c;是一种简单且使用频率…