基于强化学习的Deep-Qlearning网络玩cartpole游戏

1、环境准备,gym的版本为0.26.2

2、编写网络代码

# 导入必要的库
import gym
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
from collections import deque
import random# 定义DQN网络
class DQN(nn.Module):def __init__(self, state_size, action_size):super(DQN, self).__init__()# 定义三层全连接网络self.fc1 = nn.Linear(state_size, 24)self.fc2 = nn.Linear(24, 24)self.fc3 = nn.Linear(24, action_size)def forward(self, x):x = torch.relu(self.fc1(x))x = torch.relu(self.fc2(x))return self.fc3(x)# 定义DQN智能体
class DQNAgent:def __init__(self, state_size, action_size):self.state_size = state_sizeself.action_size = action_sizeself.memory = deque(maxlen=2000)  # 经验回放池self.gamma = 0.95  # 折扣因子self.epsilon = 1.0  # 探索率self.epsilon_min = 0.01self.epsilon_decay = 0.995self.learning_rate = 0.001self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")self.model = DQN(state_size, action_size).to(self.device)self.optimizer = optim.Adam(self.model.parameters(), lr=self.learning_rate)def remember(self, state, action, reward, next_state, done):# 将经验存储到经验回放池中self.memory.append((state, action, reward, next_state, done))def act(self, state):# ε-贪婪策略选择动作if np.random.rand() <= self.epsilon:return random.randrange(self.action_size)state = torch.FloatTensor(state).unsqueeze(0).to(self.device)act_values = self.model(state)return np.argmax(act_values.cpu().data.numpy())def replay(self, batch_size):# 从经验回放池中随机采样进行学习minibatch = random.sample(self.memory, batch_size)for state, action, reward, next_state, done in minibatch:target = rewardif not done:next_state = torch.FloatTensor(next_state).unsqueeze(0).to(self.device)target = (reward + self.gamma * np.amax(self.model(next_state).cpu().data.numpy()))state = torch.FloatTensor(state).unsqueeze(0).to(self.device)target_f = self.model(state)target_f[0][action] = targetself.optimizer.zero_grad()loss = nn.MSELoss()(self.model(state), target_f)loss.backward()self.optimizer.step()# 更新探索率if self.epsilon > self.epsilon_min:self.epsilon *= self.epsilon_decaydef load(self, name):# 加载模型self.model.load_state_dict(torch.load(name))def save(self, name):# 保存模型torch.save(self.model.state_dict(), name)# 训练函数
def train_dqn():env = gym.make('CartPole-v1')state_size = env.observation_space.shape[0]action_size = env.action_space.nagent = DQNAgent(state_size, action_size)episodes = 1000batch_size = 32for e in range(episodes):state, _ = env.reset() #重置环境,返回初始观察值和初始奖励for time in range(500):action = agent.act(state)next_state, reward, done, _, _ = env.step(action) # 执行动作,返回5个数值reward = reward if not done else -10 # 如果游戏结束,给予负奖励agent.remember(state, action, reward, next_state, done)state = next_stateif done:print(f"episode: {e}/{episodes}, score: {time}, epsilon: {agent.epsilon:.2}")breakif len(agent.memory) > batch_size:agent.replay(batch_size)if e % 100 == 0:agent.save(f"cartpole-dqn-{e}.pth")  # 每100回合保存一次模型# 使用训练好的模型玩游戏
def play_cartpole():env = gym.make('CartPole-v1')state_size = env.observation_space.shape[0]action_size = env.action_space.nagent = DQNAgent(state_size, action_size)agent.load("cartpole-dqn-900.pth")  # 加载训练好的模型for e in range(10):  # 玩10局state, _ = env.reset()for time in range(500):env.render()action = agent.act(state)next_state, reward, done, _, _= env.step(action)state = next_stateif done:print(f"episode: {e}, score: {time}")breakenv.close()if __name__ == '__main__':# 如果要训练模型,取消下面这行的注释# train_dqn()# 如果要使用训练好的模型玩游戏,取消下面这行的注释play_cartpole()

更多解析请参考:https://zhuanlan.zhihu.com/p/29283993

 https://zhuanlan.zhihu.com/p/29213893

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

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

相关文章

基于web的购物网站的设计与实现(系统源码+lw+部署文档+讲解等)

文字目录&#xff1a; 目录 详细视频演示 系统实现界面 1.1系统开发环境以及运行环境 1.1.1系统开发环境 1.1.2系统运行环境 1.2系统功能实现 1.3管理员模块实现 2 技术介绍 2.1 thinkphp5介绍 2.2 MySQL数据库 2.3 B/S结构 4.1系统结构设计 4.2系统功能结构设计…

如何挑选理想的报表工具?从入门到专业,测评十大热门工具的优缺点

报表能够用表格和图表等格式动态显示数据&#xff0c;因此衍生出相应的报表工具&#xff0c;已经有20年以上的发展历史了&#xff0c;期间报表工具不断随着需求的改变而更新迭代&#xff0c;今天博主就来推荐十款实用的报表工具&#xff0c;祝你轻松解决烦人的中国式复杂报表。…

【MySQL进阶】MySQL主从复制

目录 MySQL主从复制 概念 主从形式 一主多从 多主一从 双主复制 主从级联复制 主从复制原理 三个线程 两个日志文件 主从复制的主要工作模式 异步复制 半同步复制 全同步复制 MySQL主从复制 概念 MySQL主从复制是一种数据分布机制&#xff0c;允许从一个数据库服…

32.x86游戏实战-使用物品call

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

【TDH社区版大事件】图分析、全文检索、小文件治理、数据开发工具通通都有!

星环科技大数据基础平台TDH社区版&#xff0c;在保留了商业版核心技术优势的基础上最大程度地降低了用户使用大数据技术的门槛与成本&#xff0c;具有更轻量、更简单、更易用等特性。 此次TDH社区开发版、社区版、社区订阅版均发布了新版本&#xff0c;带来新的产品组件和新的…

前端学鸿蒙有必要么?

在当今科技飞速发展的时代&#xff0c;前端开发领域也在不断演进和变革。那么&#xff0c;对于前端开发者来说&#xff0c;学习鸿蒙是否有必要呢? 一、前端学鸿蒙的必要性分析 1、鸿蒙开发简介 鸿蒙操作系统(HarmonyOS)是一个面向全场景的分布式操作系统&#xff0c;它不仅支持…

SX_c语言字符带空格字符串读写_9

改项目的时候又发现c语言读字符串的一些细节这里做补充其中%[^\n]可以读取带空格的字符串 #include <stdio.h>int main(){char cmd;scanf("%c", &cmd);char time[32] {0};scanf("%s", time);printf("%c\n", cmd);printf("%s&quo…

在IoT中的TCP增强

本文内容节选自一篇系统性文献综述&#xff08;Systematic Literature Review, SLR&#xff09;&#xff0c;标题为“TCP Performance Enhancement in IoT and MANET”&#xff0c;由 Sultana Parween 和 Syed Zeeshan Hussain 撰写&#xff0c;发表在《International Journal …

MySQL --- 内置函数介绍

目录 一、日期函数 二、字符串函数 三、数学函数 四、 其他函数 一、日期函数 current_date()当前日期current_time()当前时间current_timestamp()当前时间戳date(datetime)返回datetime的日期部分date_add(date&#xff0c;interval d_value_type) 在date中添加时间/日期…

微信支付海外走红,中国企业跨境支付‘轻装上阵’

当我们谈论中国企业走向世界&#xff0c;拓展海外市场的征程时&#xff0c;一个不可忽视的助力者就是微信支付。它不仅是一个支付工具&#xff0c;更是连接中国企业和全球消费者的桥梁&#xff0c;让中国企业在海外也能享受到与国内同等的支付便利与信任。 早在2016年1 月 15 …

【Vue3】组件通信之$attrs

【Vue3】组件通信之$attrs 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的…

便携气象设备:随身携带的天气侦探

在快节奏的现代生活中&#xff0c;准确掌握天气变化成为了我们日常出行、户外探险和农业生产的重要参考。 便携气象设备以其轻便、易携、功能全面的特点&#xff0c;满足了我们对即时气象信息的需求。无论是突如其来的暴雨&#xff0c;还是持续多日的晴朗&#xff0c;只需轻轻一…

mac下载exe后不自动打开虚拟机

看到网上没有相关教程&#xff0c;正好解决了&#xff0c;发一下 场景&#xff1a;Mac环境下下载EXE文件&#xff0c;会导致VM虚拟机自动打开来执行文件&#xff0c;所以很烦。 解决方法&#xff1a; Mac系统-系统设置-隐私与安全-vmfusion-取消掉下载文件夹即可。 还有其他…

ME31L-创建计划协议

ME31L创建计划协议 一般常用的就是LA和LPA LP不需要审批&#xff0c;LPA需要审批。 计划协议和采购申请实现的功能相同。 计划协议创建界面和创建合同的界面相同。 ME38可以分配交货计划行。 输入计划协议号。回车。 双击行项目后&#xff0c;维护行项目字段。 然后可以在货…

【海贼王航海日志:前端技术探索】CSS你了解多少?(一)

目录 1 -> CSS是什么 2 -> 基本语法规范 3 -> 引入方式 3.1 -> 内部样式表 3.2 -> 行内样式表 3.3 -> 外部样式 4 -> 代码风格 4.1 -> 样式格式 5 -> 选择器 5.1 -> 选择器的功能 5.2 -> 选择器的种类 5.3 -> 基础选择器 5.3…

三十种未授权访问漏洞复现 合集( 三)

未授权访问漏洞介绍 未授权访问可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷&#xff0c;导致其他用户可以直接访问&#xff0c;从而引发重要权限可被操作、数据库、网站目录等敏感信息泄露。---->目录遍历 目前主要存在未授权访问漏洞的有:NFS服务&a…

python入门基础篇(一)

基础篇 Python基础安装与配置Python环境理解Python解释器第一个Python程序&#xff1a;"Hello, World!" 基础语法注释与文档字符串变量与数据类型数字类型&#xff1a;整数、浮点数、复数字符串布尔值None值 运算符算术运算符比较运算符逻辑运算符赋值运算符位运算符…

Python 爬虫项目实战(一):爬取某云热歌榜歌曲

前言 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也称为网页蜘蛛&#xff08;Web Spider&#xff09;或网页机器人&#xff08;Web Bot&#xff09;&#xff0c;是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索引、内容抓…

《机器人SLAM导航核心技术与实战》第1季:第8章_激光SLAM系统

视频讲解 【第1季】8.第8章_激光SLAM系统-视频讲解【第1季】8.1.第8章_激光SLAM系统_Gmapping算法-视频讲解【第1季】8.2.第8章_激光SLAM系统_Cartographer算法-视频讲解【第1季】8.3.第8章_激光SLAM系统_LOAM算法-视频讲解 第1季&#xff1a;第8章_激光SLAM系统 先 导 课第…

如何使用 PHP Simple HTML DOM Parser 轻松获取网页中的特定数据

背景介绍 网页数据的抓取已经成为数据分析、市场调研等领域的重要工具。无论是获取产品价格、用户评论还是其他公开数据&#xff0c;网页抓取技术都能提供极大的帮助。今天&#xff0c;我们将探讨如何使用 PHP Simple HTML DOM Parser 轻松获取网页中的特定数据。PHP Simple H…