强化学习之CartPole游戏(Q-learning)

【ReinforcementLearning】二、强化学习初探——以gym库中的CartPole环境为例 以强化学习的gym官方库中的CartPole环境为例,介绍强化学习中的相关概及智能体与环境分离编程的实现。 阅读详情

CartPole是OpenAI gym中的一个游戏测试
https://gym.openai.com/envs/CartPole-v1/

在这里插入图片描述

目的是通过强化学习让Agent控制cart,使pole尽量长时间不倒
这里用Q-learning实现,理解Q-learning

Q矩阵定义:

CartPole状态是保存在observation中的,有4个变量,cart位置和速度,pole的角度和速度,它们都是连续值,现在要把这些连续值离散化
cart位置:-2.4 ~ 2.4
cart速度:-inf ~ inf
pole角度:-0.5 ~ 0.5 (radian)
pole角速度:-inf ~ inf

离散化为6个bins,4个变量,所以有64 = 1296种state,action只有左和右2种
因此Q矩阵size是1296 * 2

定义3个class:Agent,Brain,Environment,它们的关系如下:

(1) Agent把当前的observation传给Brain
(2) Brain把observation的状态离散化后,根据Q矩阵决定action,然后把action给Agent
(3) Agent把action用到Environment,Environment把action反馈的observation_t+1和reward_t+1返回给Agent
(4) Agent把当前observation_t, action_t, 行动后的observation_t+1, reward_t+1给Brain
(5) Brain更新Q矩阵
更新observation=observation_t+1,重复(1) ~ (5)

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import gym

ENV = 'CartPole-v1'
NUM_DIGITIZED = 6
GAMMA = 0.99 #decrease rate
ETA = 0.5 #learning rate
MAX_STEPS = 200 #steps for 1 episode
NUM_EPISODES = 2000 #number of episodes
class Agent:
    def __init__(self, num_states, num_actions):
        self.brain = Brain(num_states, num_actions)
    
    #update the Q function
    def update_Q_function(self, observation, action, reward, observation_next):
        self.brain.update_Q_table(
            observation, action, reward, observation_next)
     
    #get the action
    def get_action(self, observation, step):
        action = self.brain.decide_action(observation, step)
        return action
class Brain:
    #do Q-learning
    
    def  __init__(self, num_states, num_actions):
        self.num_actions = num_actions #the number of CartPole actions
    
        #create the Q table, row is the discrete state(digitized state^number of variables), column is action(left, right)
        self.q_table = np.random.uniform(low=0, high=1, size=(NUM_DIGITIZED**num_states, num_actions)) #uniform distributed sample with size
    
    def bins(self, clip_min, clip_max, num):
        #convert continous value to discrete value
        return np.linspace(clip_min, clip_max, num + 1)[1: -1]   #num of bins needs num+1 value
    
    def digitize_state(self, observation):
        #get the discrete state in total 1296 states
        cart_pos, cart_v, pole_angle, pole_v = observation
        
        digitized = [
            np.digitize(cart_pos, bins = self.bins(-2.4, 2.4, NUM_DIGITIZED)),
            np.digitize(cart_v, bins=self.bins(-3.0, 3.0, NUM_DIGITIZED)),
            np.digitize(pole_angle, bins=self.bins(-0.5, 0.5, NUM_DIGITIZED)), #angle represent by radian
            np.digitize(pole_v, bins=self.bins(-2.0, 2.0, NUM_DIGITIZED))
        ]
        
        return sum([x* (NUM_DIGITIZED**i) for i, x in enumerate(digitized)])
    
    def update_Q_table(self, observation, action, reward, observation_next):
        state = self.digitize_state(observation)
        state_next = self.digitize_state(observation_next)
        Max_Q_next = max(self.q_table[state_next][:])
        self.q_table[state, action] = self.q_table[state, action] + \
            ETA * (reward + GAMMA * Max_Q_next - self.q_table[state, action])
        
    def decide_action(self, observation, episode):
        #epsilon-greedy
        state = self.digitize_state(observation)
        epsilon = 0.5 * (1 / (episode + 1))
        
        if epsilon <= np.random.uniform(0, 1):
            action = np.argmax(self.q_table[state][:])
        else:
            action = np.random.choice(self.num_actions)
            
        return action
class Environment:
    
    def __init__(self):
        self.env = gym.make(ENV)
        num_states = self.env.observation_space.shape[0] #4
        num_actions = self.env.action_space.n #2
        self.agent = Agent(num_states, num_actions) #create the agent
    
    def run(self):
        complete_episodes = 0 #succeed episodes that hold on for more than 195 steps
        is_episode_final = False #last episode flag
        frames = []   #for animation
        
        for episode in range(NUM_EPISODES):   #1000 episodes
            observation = self.env.reset()  #initialize environment
            
            for step in range(MAX_STEPS):   #steps in one episode
                
                if is_episode_final is True:  #True / False is singleton in Python, so can use "is" to compare the object, while "==" compares the value
                    frames.append(self.env.render(mode='rgb_array'))
                    
                action = self.agent.get_action(observation, episode) #not step
                
                #get state_t+1, reward from action_t
                observation_next, _, done, _ = self.env.step(action) #reward and info not need
                #if use default reward, use following:
                #observation_next, reward, done, _ = self.env.step(action)   #Test
                #self.agent.update_Q_function(observation, action, reward, observation_next) #Test
                #observation = observation_next #Test
                
                
                #get reward
                if done: #step > 200 or larger than angle
                    if step < 195:
                        reward = -1  #give punishment if game over less than last step
                        complete_episodes = 0  #game over less than 195 step then reset
                    else:   
                        reward = 1  
                        complete_episodes += 1  
                else:
                    reward = 0   #until done, reward is 0 
                
                #update Q table
                self.agent.update_Q_function(observation, action, reward, observation_next)
                
                #update observation
                observation = observation_next
                
                if done:
                    print('{0} Episode: Finished after {1} time steps'.format(episode, step + 1))
                    break
                
            if is_episode_final is True:  #save the animation
                display_frames_as_gif(frames)
                break
                    
            if complete_episodes >= 10:
                print('succeeded for 10 times')
                is_episode_final = True

测试到的收敛性如下,可以看到从刚开始的很快就done,到后来可以坚持200step
在这里插入图片描述

CartPole环境下的强化学习 以CartPole为环境,实现DQN和PG算法,并按要求进行可视化(reward,loss,entropy等)。 阅读详情

相关推荐

强化学习 model-01:CartPole

强化学习是一种机器学习范式,其核心思想是通过agent与环境的交互,以达到实现某种目标的目的。在强化学习中,agent根据环境的反馈(reward or penalty)来调整其行为,以使得未来的预期奖励最大化。强化学习在许多领域中都有广泛的应用,如游戏、机器人控制、金融交易。

惟天有汉,故国有明的博客 900

CartPole 强化学习详解1 - DQN

工作中常会接触到强化学习的内容,自己以gym环境中的Cartpole为例动手实现一下,记录点实现细节。 1. gym-CartPole环境准备 环境是用的gym中的CartPole-v1,就是火柴棒倒立摆。gym是openai的开源资源,具体如何安装可参照: 强化学习一、基本原理与gym的使用_wshzd的博客-优快云博客_gym 强化学习 这个环境的具体细节(参考gym源码cartpole.py): action只有向左向右两个选择,离散量 观测值有4个,x, x_dot, thet

Oxalate的博客 1万+

DQN(Deep Q Network)及其代码实现

为什么需要DQN 我们知道,最原始的Q-learning算法在执行过程中始终需要一个Q表进行记录,当维数不高时Q表尚可满足需求,但当遇到指数级别的维数时,Q表的效率就显得十分有限。因此,我们考虑一种值函数近似的方法,实现每次只需事先知晓S或者A,就可以实时得到其对应的Q值。DQN中采用了深度神经网络作为值函数近似的工具,这种方法被证明十分有效。 ​ DQN简介 Q-learning算法很早就有了,但是其与深度学习的结合是在2013年的DeepMind发布的《Playing Atari with Deep R

weixin_45552370的博客 3万+

强化学习实例分析:CartPole【蒙特卡洛方法】

本文基于gym库的cartpole环境来实现强化学习里的Monte Carlo 算法

v20000727的博客 2292

深度强化学习研究笔记(3)——Deep Q-Network(DQN)(DQN问题引入,建模,一个Python小例子)

文章目录1. DQN问题描述 1. DQN问题描述 传统Q-learning方法难以处理真实场景下的高维数据,将大量的state和QQQ value存储在内存中会导致计算复杂。于是有研究者想到利用深度神经网络(DNN)来高维数据的强化学习问题,其核心思想是利用价值函数的近似(Value Function Approximation)求解,通过深度神经网络来表示QQQ值的近似分布。下图描述了如何利用...

越野者的博客 6023

强化学习Q-learning Gym实现游戏AI CartPole-v0 附完整代码和教程

强化学习Q-learning Gym实现游戏AI CartPole-v0 附完整代码和教程

1136

基于Q-Learning的CartPole游戏强化学习实战指南

本文将手把手教你使用Python和Gym库实现Q-Learning算法解决CartPole问题。CartPole问题虽小,却包含了强化学习的核心要素。无论你是强化学习新手还是希望夯实基础的从业者,本文都能带给你实用价值。现在,是时候将你的强化学习技能应用到更广阔的领域了!:Q-Learning到DQN的迁移减少40%训练时间。:优先使用Q-Learning,快速实现且易于调试。从基础Q-Learning到深度Q网络的进阶路径。:考虑策略蒸馏,将复杂模型压缩为轻量级Q表。:添加角度相关奖励可加速学习30%

LWW2298620280的博客 1166

使用Q-learning实现游戏智能体:一步步打造你的AI

但是,在CartPole游戏中,我们的状态是连续的,这意味着我们不能直接为每个状态动作对创建一个条目。epsilon是我们进行探索的概率,有时我们需要选择非最优的动作,以便获取更多的信息。Q-learning是一个值迭代算法,它试图学习一个动作值函数Q(s, a),这个函数可以告诉我们在给定状态下采取给定动作的期望回报。其中在上述公式中,s是当前状态,a是当前动作,r是收到的奖励,s'是下一个状态,a'是在s'状态下的最佳动作,α是学习率,γ是折扣因子。训练完成后,我们可以测试我们的智能体的表现。

YOLO 792

具身系列——Q-Learning算法实现CartPole游戏(强化学习)

【代码】具身系列——Q-Learning算法实现CartPole游戏(强化学习)

m0_74001625的博客 336

第六章:深度Q网络实战:CartPole游戏

第六章:深度Q网络实战:CartPole游戏 1. 背景介绍 1.1 强化学习与深度Q网络 强化学习(Reinforcement Learning)是机器学习的一个重要分支,它关注智能体如何在与环境的交互中学习,通过试错的

AI天才研究院 933

使用Python实现基于强化学习的游戏AI:打造智能化游戏体验

通过本文的介绍,我们展示了如何使用Python实现基于强化学习的游戏AI。该系统集成了环境模拟、数据处理、模型训练、结果预测和性能评估等功能,能够在复杂和动态的游戏环境中做出智能决策。希望本文能为读者提供有价值的参考,帮助实现基于强化学习的游戏AI系统的开发和应用。

Echo_Wish 384

用一个小游戏入门深度强化学习

今天我们来用深度强化学习算法 deep Q-learning 玩 CartPole 游戏。强化学习是机器学习的一个重要分支,通过强化学习我们可以创建一个 agent,让它...

极客X养成计划 1045

Cartpole-V0-V1:Pytorch教程

用于解决Cartpole-V0和Cartpole-V1的Rl的不同方法 <iframe src =“ ” width =“ 100%” height =“ 300”> </ iframe>

强化学习之DQN(deep Q-network)算法

DQN算法是深度学习领域首次广泛应用于强化学习的算法模型之一。它于2013年由DeepMind公司的研究团队提出,通过将深度神经网络与经典的强化学习算法Q-learning结合,实现了对高维、连续状态空间的处理,具备了学习与规划的能力。

niulinbiao的博客 3260

小程序强制更新避坑指南:手把手教你实现无缝升级

本文详细解析小程序强制更新的实现方法,重点介绍wx.getUpdateManager API的使用技巧,帮助开发者规避冷热启动机制下的版本管理陷阱。通过实战案例展示如何设计多级更新提示策略,确保用户无缝升级,提升小程序版本更新率。

star的博客 280

【文本分析学习】Anaconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码) NLTK

文本分析学习之 Anadconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码)

littlexmj的博客 2330

【强化学习】Policy Gradient 算法实现案例

【强化学习】Policy Gradient算法详解 1.算法思想 之前的文章已经介绍了Q-Learning的相关知识及其实例:【强化学习】Q-Learning 迷宫算法案例 Q-Learning 是一个基于价值value的方法,通过计算动作得分来决策的,它在确定了价值函数的基础上采用某种策略(贪婪-epslion)的方法去选取动作。 2.项目介绍 3.算法实现 ...

Gilgame的博客 3061

深入解析MTK DRM初始化流程:从KMS模块到组件框架

本文深入解析了联发科(MTK)平台上DRM显示框架的初始化流程。从内核模块加载、Component框架管理依赖,到核心的mtk_drm_bind函数构建KMS对象(CRTC、Plane、Encoder、Connector),最终完成DRM设备注册并创建用户空间接口。文章结合调试经验,为开发者梳理了从驱动启动到屏幕点亮的完整路径与关键排查点。

onion的博客 765

基于Keras的OpenAI-gym强化学习的车杆/FlappyBird游戏

强化学习 课程:Q-Learning强化学习(李宏毅)、深度强化学习 强化学习是一种允许你创造能从环境中交互学习的AI Agent的机器学习算法,其通过试错来学习。如上图所示,大脑代表AI Agent并在环境中活动。当每次行动过后,Agent接收到环境反馈。反馈包括回报Reward和环境的下个状态State,回报由模型设计者定义。如果类比人类学习自行车,可以将车从起始点到当前位...

aohun0743的博客 2081

消费级显卡跑大模型:RTX 3060 12G 部署 70 亿参数 AI 编程助手的优化实战

本文详细介绍了如何在消费级显卡RTX 3060 12G上,通过量化、投机解码和分页KV-Cache等核心优化技术,成功部署并流畅运行70亿参数的CodeLlama-7B编程助手。文章提供了从环境配置、模型准备到参数调优的完整实战笔记,实测显存占用降至7.3GB,生成速度达21.7 token/秒,为开发者和技术爱好者提供了可行的本地AI部署方案。

weixin_29053067的博客 1251

Ubuntu 20.04 server 安装

Ubuntu 20.04 server 安装 前面我们介绍了 Ubuntu Desktop 版本的安装,今天我们来看看 Ubuntu server 版本的安装。Ubuntu Server 版本的安装和 Desktop 有很大的区别,并且全程不能使用鼠标,只能通过键盘。 从光盘或 U 盘启动到 Welcome 界面,选择语言,一般都是使用 English,所以保保持默认,直接按回车即可; 系统检测到了新的版本,问你是否是否更新,这里我们不需要安装新的版本,所以选项 Continue without upda

as900的博客 1万+

【机器学习入门】第20讲:强化学习入门——Q-Learning与马尔可夫决策过程的探索之旅

*强化学习(Reinforcement Learning)**让机器在环境中通过交互学习最优行为。】复制整段内容,打开最新版「夸克APP」即可获取。伏脂撺掇蒌葶苘洞座 /835a36NvQn😕 链接:https://pan.quark.cn/s/5180c62aacf7。链接:https://pan.quark.cn/s/fe4976448ca1。链接:https://pan.quark.cn/s/4598337f6b3e。Q值像一张“收益地图”,智能体通过不断探索更新地图,逐渐找到最优路径。

工宗浩生财指南针 902

构建一个基于Simulink的LC滤波器仿真模型

需求分析LC滤波器(Inductor-Capacitor Filter)是一种常见的无源滤波器,广泛应用于电力电子、通信、音频处理等领域。其主要作用是平滑输入信号中的高频谐波成分,保留低频或直流成分,从而提高输出信号的质量。在电力电子系统中,LC滤波器常用于逆变器、整流器等设备的输出端,以减少开关噪声和电磁干扰(EMI),确保输出电压和电流的稳定性。本项目将基于Simulink平台,开发一个完整的LC滤波器仿真模型,涵盖从电源输入到滤波输出的整个过程,并通过PI控制器实现对滤波效果的闭环控制。

MHD0815的博客 733
上一篇: 强化学习之迷宫问题(MC, Sarsa, Q-learning实现)
下一篇: PyTorch 识别 MNIST 手写数字
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值