10、基于LunarLander登陆器的Dueling DDQN强化学习(含PYTHON工程)

10、基于LunarLander登陆器的Dueling DDQN强化学习(含PYTHON工程)

LunarLander复现:
07、基于LunarLander登陆器的DQN强化学习案例(含PYTHON工程)

08、基于LunarLander登陆器的DDQN强化学习(含PYTHON工程)

09、基于LunarLander登陆器的Dueling DQN强化学习(含PYTHON工程)

10、基于LunarLander登陆器的Dueling DDQN强化学习(含PYTHON工程)

基于TENSORFLOW2.10

0、实践背景

gym的LunarLander是一个用于强化学习的经典环境。在这个环境中,智能体(agent)需要控制一个航天器在月球表面上着陆。航天器的动作包括向上推进、不进行任何操作、向左推进或向右推进。环境的状态包括航天器的位置、速度、方向、是否接触到地面或月球上空等。

智能体的任务是在一定的时间内通过选择正确的动作使航天器安全着陆,并且尽可能地消耗较少的燃料。如果航天器着陆时速度过快或者与地面碰撞,任务就会失败。智能体需要通过不断地尝试和学习来选择最优的动作序列,以完成这个任务。

下面是训练的结果:
在这里插入图片描述

1、Dueling DDQN的实现原理

Dueling DDQN实际上就是Dueling DQN和DDQN结合,其对应的具体理论参考:

08、基于LunarLander登陆器的DDQN强化学习(含PYTHON工程)

09、基于LunarLander登陆器的Dueling DQN强化学习(含PYTHON工程)

上面文章里面提及,Dueling DQN是在网络结构上进行改进,将原来的动作价值函数Q网络拆为状态函数动作优势函数的和。

而DDQN实在迭代方式上进行改进,在进行贝尔曼方程的迭代求解时,将鸡蛋放在两个篮子里,同时使用Q网络target Q网络对max(Q(s’,a’))进行计算,由此解决了Q函数的高估问题。

因此,两种结合,即可得到Dueling DDQN。

2、Dueling DDQN的实现关键代码

详细的代码各位可以下载后查看,在此只展示最为关键的改动部分,首先是网络的差异:

        if self.model == 'DQN' or self.model == 'Double_DQN':
            self.q_network = DeepQNetwork(num_actions, input_dims, 256, 256)
            self.target_q_network = DeepQNetwork(num_actions, input_dims, 256, 256)
            self.optimizer = Adam(learning_rate=lr)
        if self.model == 'Dueling_DQN' or self.model == 'Dueling_DDQN':
            # self.q_network, self.target_q_network = Dueling_DQN(num_actions, input_dims, 256, 256, 256)
            self.q_network = GenModelDuelingDQN(num_actions, input_dims, 128, 128, 128)
            self.target_q_network = GenModelDuelingDQN(num_actions, input_dims, 128, 128, 128)
            self.optimizer = Adam(learning_rate=lr)
def DeepQNetwork(num_actions, input_dims, fc1, fc2):
    q_net = Sequential([
        Input(shape=input_dims),  # 输入层,形状由state_size定义
        Dense(units=fc1, activation='relu'),  # 全连接层,128个单元,使用ReLU激活函数
        Dense(units=fc2, activation='relu'),  # 全连接层,128个单元,使用ReLU激活函数
        Dense(units=num_actions, activation='linear'),  # 输出层,单元数由num_actions定义,使用线性激活函数
    ])
    return q_net

def GenModelDuelingDQN(num_actions, input_dims, fc1, fc2, fc3):
    # define input
    input_node = tf.keras.Input(shape=input_dims)
    input_layer = input_node
    # define state value function(计算状态价值函数)
    state_value = tf.keras.layers.Dense(fc1, activation='relu')(input_layer)
    state_value = tf.keras.layers.Dense(1, activation='linear')(state_value)
    # state value and action value need to have the same shape for adding
    # 这里是进行统一维度的
    state_value = tf.keras.layers.Lambda(
        lambda s: tf.keras.backend.expand_dims(s[:, 0], axis=-1),
        output_shape=(input_dims,))(state_value)

    # define acion advantage (行为优势)
    action_advantage = tf.keras.layers.Dense(fc1, activation='relu')(input_layer)
    action_advantage = tf.keras.layers.Dense(fc2, activation='relu')(action_advantage)
    action_advantage = tf.keras.layers.Dense(fc3, activation='relu')(action_advantage)
    action_advantage = tf.keras.layers.Dense(num_actions, activation='linear')(action_advantage)
    # See Dueling_DQN Paper
    action_advantage = tf.keras.layers.Lambda(
        lambda a: a[:, :] - tf.keras.backend.mean(a[:, :], keepdims=True),
        output_shape=(num_actions,))(action_advantage)
    # 相加
    Q = tf.keras.layers.add([state_value, action_advantage])
    # define model
    model = tf.keras.Model(inputs=input_node, outputs=Q)
    return model

其次是训练过程迭代的差异:

        if self.model == 'DQN' or self.model == 'Dueling_DQN':
            # 计算最大的Q^(s,a),reduce_max用于求最大值
            max_qsa = tf.reduce_max(target_q_network(next_states), axis=-1)
            # 如果登录完成,设置y = R,否则设置y = R + γ max Q^(s,a)。
            y_targets = rewards + (gamma * max_qsa * (1 - done_vals))
        elif self.model == 'Double_DQN' or self.model == 'Dueling_DDQN':
            next_action = np.argmax(q_values, axis=1)
            # tf.range(q_values.shape[0]构建0-batch_size的数组,next_action是q_network得出的动作,两者组合成二维数组
            # 从target_q_network(next_states)输出的batch_size*action dim个数组中取数
            Q2 = tf.gather_nd(target_q_network(next_states),
                              tf.stack([tf.range(q_values.shape[0]), tf.cast(next_action, tf.int32)], axis=1))
            y_targets = rewards + (gamma * Q2 * (1 - done_vals))

3、Dueling DDQN的实现效果

LunarLander环境下,使用Dueling DDQN并没有带来特别大的性能改善:
在这里插入图片描述

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

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

相关文章

Mybatis的关联查询(association和collection)

关联查询 实体间的关系(拥有 has、属于 belong) OneToOne:一对一关系(account ←→ user) OneToMany:一对多关系(user ←→ account) ManyToMany:多对多关系&#xff0…

测试框架|Burp Suite几个基本工具的使用

前阵子项目上想通过测试工具在网页上模拟返回错误代码 500 来查看页面的错误处理,然后去调查了下 burp suite,看了些基本工具的使用文档。虽然最后证实 burp suite 只能用来处理页面测试应用程序的实际行为和响应,而不是尝试模拟不存在的问题…

python脚本传参

sys.argvargparse 第一种:argparse 简单使用: import argparse # 创建一个参数解析实例 parser argparse.ArgumentParser(descriptionParameters) # 添加参数解析 parser.add_argument(--training_epoch, typeint, default3000) parser.add_argument(…

flutter + firebase 云消息通知教程 (android-安卓、ios-苹果)

如果能看到这篇文章的 一定已经对手机端的 消息推送通知 有了一定了解。 国内安卓厂商这里不提都有自己的FCM 可自行查找。(国内因无法科学原因 ,不能使用谷歌服务)只说海外的。 目前 adnroid 和 ios 推送消息分别叫 FCM 和 APNs。这里通过…

flutter开发windows应用的库

一、window_manager 这个插件允许 Flutter 桌面应用调整窗口的大小和位置 地址:https://github.com/leanflutter/window_manager二、win32 一个包,它使用FFI包装了一些最常见的Win32 API调用,使Dart代码可以访问这些调用,而不需…

华为交换机配置BGP的基本示例

BGP简介 定义 边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的距离矢量路由协议。早期发布的三个版本分别是BGP-1(RFC1105&#xff0…

Python+Playwright自动化测试--playwright处理浏览器多窗口切换

1.简介 浏览器多窗口的切换问题相比大家不会陌生吧,之前小编在javaselenium系列文章中就有介绍过。大致步骤就是:使用selenium进行浏览器的多个窗口切换测试,如果我们打开了多个网页,进行网页切换时,我们需要先获取各…

Ubuntu 常用命令之 history 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 history命令在Ubuntu系统中用于显示用户执行过的命令列表。这个命令在bash shell中非常有用,特别是当你需要记住你之前执行过的命令时。 history命令的参数如下 -c:清除历史记录。-d offset:删…

突破性能瓶颈:使用Asyncio构建高并发Python应用程序

是一种处理多个任务同时执行的编程方式,在Python中,asyncio是一种用于实现异步编程的强大工具。asyncio基于协程(coroutine)的概念,能够高效地处理I/O密集型任务。本文将介绍asyncio的基本原理和使用方法。 为啥需要a…

Nature Commun.:物理所揭示原子分辨下的铁电涡旋畴的原位力学转变过程

通过复杂的晶格-电荷相互作用形成的铁电涡旋畴在纳米电子器件研发中具有巨大的应用潜力。实际应用中,如何在外界激励下操纵这类结构的拓扑状态是至关重要的。中国科学院物理研究所/北京凝聚态物理国家研究中心表面物理国家重点实验室与北京大学、湘潭大学和美国宾夕…

云原生文件存储 CFS 线性扩展到千亿级文件数,百度沧海·存储论文被 EuroSys 2023 录用

恭喜百度沧海云存储和中科大合作的论文《CFS: Scaling Metadata Service for Distributed File System via Pruned Scope of Critical Sections》(以下简称论文)被 EuroSys 2023 录用。 EuroSys 全称欧洲计算机系统会议(The European Confer…

ROS2 学习09--ros 中的通信接口的定义以及如何创建自定义msg、srv和action文件

在ROS系统中,无论话题还是服务,或者我们后续将要学习的动作,都会用到一个重要的概念——通信接口。 通信并不是一个人自言自语,而是两个甚至更多个人,你来我往的交流,交流的内容是什么呢?为了让…

【收藏】法律人办案必备检索网站最新汇总!附检索技巧

为什么要进行法律检索?无论你擅长的是做诉讼还是非诉讼业务,法律检索都是必备技能之一。只有做好法律检索才能制定出更加完备的策略报告,才能提供更加充实、可行、准确的方案。 一、数据库检索 1、alpha数据库 https://www.icourt.cc 已经用了3年的大数据库,听说最近降价了…

微前端样式隔离、sessionStorage、localStorage隔离

1、样式隔离 前端样式不隔离,会产生样式冲突的问题,这个点在qiankun也存在 子应用1修改一个样式 button {background: red!important; }其它应用也会受到影响 qiankun的css隔离方案(shadow dom) shadow …

c语言易错题之数据类型变换

1.题目 #include<stdio.h> int main() {int arr[]{1,2,3,4,5};short*p (short*)arr;int i 0;for(i0;i<4;i){*(pi)0;}for(i0;i<5;i){printf("%d ",arr[i];}return 0; }2.解析 这道题主要容易错在&#xff0c;大家会以为通过指针赋值的时候&#xff0c;…

pickle反序列化

文章目录 基础知识pickle简介可序列化对象object.__reduce__() 函数 pickle过程详细解读opcode简介pickletools 漏洞利用利用思路如何手写opcode 工具pker实战例题[MTCTF 2022]easypickle 基础知识 pickle简介 与PHP类似&#xff0c;python也有序列化功能以长期储存内存中的数…

docusaurus简介及使用心得

docusaurus简介 Docusaurus 是 Facebook 专门为开源项目开发者提供的一款易于维护的静态网站创建工具&#xff0c;使用 Markdown 即可更新网站。构建一个带有主页、文档、API、帮助以及博客页面的静态网站&#xff0c;只需5分钟。 同类竞品还有vuepress&#xff0c;docusaurus…

基于Linux下gcc学习C/C++——编译过程

前提&#xff1a;WSL2&#xff08;Ubuntu&#xff09;、gcc编译器。gcc安装命令&#xff1a; sudo apt-get install gcc 查看gcc版本&#xff1a; 目录 1、编译过程 1.1、预处理 1.2、编译与汇编 1.3、链接 2、gcc实验 2.1、预处理 2.2、编译 2.3、汇编 2.4、链接 1、…

Win系统修改Nginx配置结合内网穿透实现远程访问多个Web站点

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…

[笔记]netty随笔

记录使用过程中偶然发现的一些关键逻辑。先做记录&#xff0c;以后netty知识有一定体系再做整理 childGroup 服务器中有俩group&#xff0c;一个是parentGroup&#xff0c;负责处理链接请求&#xff0c;一个是childGroup&#xff0c;负责业务逻辑。 channelActive是在childG…