Q-Learning实战——找房间

介绍

样例来自A Painless Q-learning Tutorial (一个 Q-learning 算法的简明教程)

简单来说就是从某个房间开始,找到去目标房间的路径。
在这里插入图片描述

代码实现

import numpy as np
from tqdm import tqdm, trange

room_num = 6
room_paths = [(0, 4), (3, 4), (3, 1), (1, 5), (2, 3), (4, 5)]
target_room = 5

# Q 矩阵,默认值填充0
Q = np.zeros((room_num, room_num))
# R 矩阵,默认值填充-1
reward = np.full((room_num, room_num), -1)
# 有路径的房间,奖励设为0
for room_path in room_paths:
    if room_path[1] == target_room:
        reward[room_path[0]][room_path[1]] = 100 # 房间到达目标房间,奖励设为100
    else:
        reward[room_path[0]][room_path[1]] = 0

    # 双向路径
    if room_path[0] == target_room:
        reward[room_path[1]][room_path[0]] = 100 # 房间到达目标房间,奖励设为100
    else:
        reward[room_path[1]][room_path[0]] = 0

reward[target_room][target_room] = 100 # 目标房间奖励设为100
print("reward:")
print(reward)

max_epoch = 2000
lamma = 0.8
modes = ['one-path', 'one-step']
# one-path 一直走,直到到达目标房间
# one-step 只走一步
mode = modes[1]

for epoch in trange(max_epoch):
    new_Q = Q.copy()
    current_state = np.random.randint(0, room_num)

    def one_step(current_state, Q, reward, lamma):
        # 随机选择一个可行的动作
        p_action = (reward[current_state] >= 0).astype(int) / np.sum(reward[current_state] >= 0)
        current_action = np.random.choice(room_num, p=p_action)
        # 更新 Q 矩阵
        new_Q[current_state][current_action] = reward[current_state][current_action] + lamma * np.max(Q[current_action])
        new_state = current_action
        return new_state, new_Q

    if mode == 'one-step':
        _, new_Q = one_step(current_state, Q, reward, lamma)
    else:
        while current_state != target_room:
            current_state, new_Q = one_step(current_state, Q, reward, lamma)
    Q = new_Q

print("Q:")
print(Q.round())

这里有两种更新策略:

  1. one-path:一直走并每一步更新,直到到达目标房间
  2. one-step:每次只走一步,然后更新,然后再随机初始状态

运行结果

参考结果

在这里插入图片描述
来自A Painless Q-learning Tutorial (一个 Q-learning 算法的简明教程)

one-path

Q:
[[  0.   0.   0.   0.  80.   0.]
 [  0.   0.   0.  64.   0. 100.]
 [  0.   0.   0.  64.   0.   0.]
 [  0.  80.  51.   0.  80.   0.]
 [ 64.   0.   0.  64.   0. 100.]
 [  0.   0.   0.   0.   0.   0.]]

这里跟参考结果不一样是因为没有考虑自环且到达目标房间后就直接结束此次寻路,因此目标房间没有更新Q的相关值。

one-step

Q:
[[  0.   0.   0.   0. 400.   0.]
 [  0.   0.   0. 320.   0. 500.]
 [  0.   0.   0. 320.   0.   0.]
 [  0. 400. 256.   0. 400.   0.]
 [320.   0.   0. 320.   0. 500.]
 [  0. 400.   0.   0. 400. 500.]]

这次的结果跟参考的一样,因为这里只考虑走一步,不管起始房间和结束房间是哪里都无所谓,因此最终结果跟参考一致。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

exel带单位求和,统计元素个数

如果exel表格中,如果数据有单位,无法直接用 自动求和 直接求和。如下图所示,求和结果为0,显然不是我们想要的。 用下面的公式求和,单位不是“个”的时候记得替换单位。统计范围不是“C1:C7”也记得换一下啊&#xff01…

19_谷歌GoogLeNet(InceptionV1)深度学习图像分类算法

1.1 简介 GoogLeNet(有时也称为GoogleNet或Inception Net)是一种深度学习架构,由Google的研究团队在2014年提出,主要设计者为Christian Szegedy等人。这个模型是在当年的ImageNet大规模视觉识别挑战赛(ILSVRC&#xf…

实用性提升百分之一百!!!【ONLYOFFICE 8.1版本】全方位深度性能测评

目录 【ONLYOFFICE 8.1 版本】全方位深度性能测评 一、界面与用户体验 二、文字处理功能 表格处理功能 演示文稿功能 协作与共享功能 性能与稳定性 总结 【ONLYOFFICE 8.1 版本】全方位深度性能测评 在当今数字化办公的时代,办公软件的选择对于提高工作效率和…

【HTML入门】第四课 - 换行、分割横线和html的注释

这一小节,我们继续说HTML的入门知识,包括换行、横线分割以及注释(html的注释)。 目录 1 换行 2 分割横线 3 html注释 1 换行 html中分为块元素和行内元素。这一小节呢,先不说这些元素们,我们先说一下换…

安装Gradle

官网文档 https://gradle.org/ 腾讯下载镜像:https://mirrors.cloud.tencent.com/gradle/ 文档:https://docs.gradle.org/current/userguide/userguide.html 命令行文档:https://docs.gradle.org/current/userguide/command_line_interface.…

Python提取视频文案

Python提取视频文案 1、背景描述2、视频转音频3、音频转文字 1、背景描述 在多媒体应用中,视频是一个信息量巨大的载体。然而,有时我们需要从视频中提取语音并转换为文本,以用于文本分析和机器学习训练 其中主要涉及到两个过程:视…

String类(STL开始)

相信大家都知道STL在C中的重要性,作为其模板库中的一部分,包含了常见的数据结构和算法,是C的标准库 而我们今天要讲的String类(String底层是一个字符顺序数组的顺序表对象,可以归类为容器),其实…

MySQL安装时initializing database失败

问题页面: 解决方法: 1.勾选红框中的选项: 2.将下图红框中全部改为英文: 然后一路next就可以了。

洛谷 P3613 学习用map代替大大大数组的好题

题目链接:P3613 【深基15.例2】寄包柜 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目截图: 题意分析: 非常简单的存入和取出操作 唯一的 “难点” 在于 数组开不到 a[100007][100007],会暴内存 非常巧妙的引入 map 来解决…

广州银行多份招股书数据货不对板:内控风险难平,IPO曲折前行

作者|芋圆 来源|贝多财经 6月29日,广州银行第五次更新了招股说明书。 作为制造业大省的头部城商行,广州银行的发展一直备受关注。拆解可知,广州银行2023年在盈利能力、内控、资本充足性、资产质量等方面的表现,凸显了该行接下来…

Linux三剑客(grep、awk和sed)操作及与管道结合使用

1. 总览 grep、sed和awk被称为Linux三剑客,是因为它们在文本处理和数据操作方面极其强大且常用。 Linux三剑客在文件处理中的作用: grep(数据查找定位):文本搜索工具,在文件中搜索符合正则表达式的文本内容…

小阿轩yx-Haproxy搭建Web群集

小阿轩yx-Haproxy搭建Web群集 Haproxy 简介 提供高可用性 能做出标准的负载均衡 支持虚拟主机 具备健康检查能力 能用于各式各样的代理 轻量级代理环境 解决方案优势 免费 快速 可靠 特性 特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或…

明明已经安装了python中的某个库,但是还是报错ModuleNotFoundError: No module named ‘sklearn‘

问题: 明明已经安装了python中的某个库,但是还是报错ModuleNotFoundError: No module named sklearn 解决方法: 卸载重新安装一下即可 pip uninstall scikit-learn pip install scikit-learn 成功解决!!&#xff…

高创新 | CEEMDAN-VMD-GRU-Attention双重分解+门控循环单元+注意力机制多元时间序列预测

目录 效果一览基本介绍模型设计程序设计参考资料 效果一览 基本介绍 高创新 | CEEMDAN-VMD-GRU-Attention双重分解门控循环单元注意力机制多元时间序列预测 本文提出一种基于CEEMDAN 的二次分解方法,通过样本熵重构CEEMDAN 分解后的序列,复杂序列通过VMD…

【Threejs进阶教程-着色器篇】1. Shader入门(ShadertoyShader和ThreejsShader入门)

ThreejsShader入门 关于本Shader教程认识ShaderShader和Threejs的关系WebGLShaderThreejsShaderShadertoyShader其他Shader 再次劝退数学不好的人从ShaderToy开始Shader的代码是强类型glsl的类型,变量,内置函数,关键字关于uv基于UV的颜色处理…

PCL 点云FPFH特征描述子

点云FPFH特征描述子 一、概述1.1 FPFH概念1.2 基本原理1.3 PFH和FPFH的区别二、代码实现三、结果示例一、概述 1.1 FPFH概念 快速点特征直方图(FPFH)描述子:计算 PFH 特征的效率其实是十分低的,这样的算法复杂度无法实现实时或接近实时的应用。因此,这篇文章将介绍 PFH 的简…

【java web 01】3小时快速学习前端知识(收藏备用)

3小时快速学习前端知识【全栈专用】 一、教程简介1.1 Java 开发为何学Web技术1.2 课程设计1.3 课前准备 二、HTML2.1 Html简介2.1.1 HTML、CSS、JS分别有什么作用2.1.2 什么是HTML2.1.3 什么是标记语言 2.2 Hello,Html2.2.1 HTML基础结构2.2.2 专业词汇2.2.3 语法细…

面试经典150题

合并两个有序数组 两个按非递减顺序排列的整数数组nums1和nums,另有两个整数m和n,分别表示nums1和nums2中的元素数组。 请合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。 直接合并后排序 class Solution { public:void merge(…

解码Python字符串:‘r‘、‘b‘、‘u‘和‘f‘前缀的全面指南

📖 正文 1 字符串前加’r’ 表示原始字符串,消除转义 print(abc\nde) # abc # deprint(rabc\nde) # abc\nde在下面这个列子中,如果不在路径字符串前面加r那么,路径中的空格就会出现问题 print(rD:\01 programming\09python\py…