强化学习之Q-learning ^_^
许久没有更新重新拾起,献于小白
这次介绍的是强化学习 Q-learning,Q-learning也是离线学习的一种
关于Q-learning的算法详情看 传送门
下文中我们会用openai gym来做演示
简要
q-learning的伪代码先看这部分,很重要

简单的算法语言描述就是
开始执行任务:
随机选择一个初始动作
执行这些动作
若未达到目标状态,则执行一下几步
在当前状态s所有可能的行为中选择一个a
利用a得到下一个状态s_
计算Q(s,a) (对当前的行为进行学习)
下一个状态等于当前状态
开始下一个循环
有重要的几个参数,GAMMA(gamma 是对未来 reward(分数) 的衰减值),ALPHA(学习率),EPSILON(策略)
GAMMA是什么意思呢,就是对获取过的奖励为了防止再次获取后得到的分数一样,于是对reward进行一个衰减,这样就会有长远的眼光,机器人就不只专注于眼前的奖励了
EPSILON 是一种策略,0.8代表的意思就是我们有80%的概率来选择之前的经验剩下的20%的概率来进行新的探索
游戏开始
首先我们初始化环境
import numpy as np
import gym GAME = 'FrozenLake-v0'
env = gym.make(GAME) MAX_STEPS=env.spec.timestep_limit
EPSILON=0.8
GAMMA=0.8
ALPHA=0.01
q_table=np.zeros([16,4],dtype=np.float32)
q_table就是Q-Learning的Q表了,里面有所有我们进行学习的经验,程序的动作选择都是从Q表中选择
def action_choise(obervation):
if np.random.uniform()<EPSILON:
action=np.argmax(q_table[obervation])
else:
action=env.action_space.sample()
return action
上面代码为策略选择,80%的概率总Q表中选择最优策略,20%的概率进行随机操作
def learn(state,action,reward,obervation):
q_table[state][action]+=ALPHA*(reward+GAMMA*max(q_table[obervation])-q_table[state,action])
此部分为学习部分,重要部分用红线标示出来了
Q表的更新方式为 学习率 * (真实值 - 预测值) 将判断误差传递回去 以此来进行学习
对应算法部位为

GAME OVER
以上就是Q-learning的简单介绍
下面是全部的代码
import numpy as np
import gym GAME = 'FrozenLake-v0'
env = gym.make(GAME) MAX_STEPS=env.spec.timestep_limit
EPSILON=0.8
GAMMA=0.8
ALPHA=0.01
q_table=np.zeros([16,4],dtype=np.float32) def action_choise(obervation):
if np.random.uniform()<EPSILON:
action=np.argmax(q_table[obervation])
else:
action=env.action_space.sample()
return action def learn(state,action,reward,obervation):
q_table[state][action]+=ALPHA*(reward+GAMMA*max(q_table[obervation])-q_table[state,action]) SCORE=0
for exp in xrange(10000):
obervation=env.reset()
EPSILON+=0.001
for i in xrange(MAX_STEPS):
# env.render()
action=action_choise(obervation) #动作选择
obervation_,reward,done,info=env.step(action) #学习
SCORE+=reward
if reward==0:
if done:
reward=-1
else:
reward=-0.001
learn(obervation,action,reward,obervation_)
obervation=obervation_
if done:
break
print 'esp,score (%d,%d)'%(exp,SCORE)
print 'score is %d'%SCORE
大家把Q表的信息打印出来,断点执行一下,相信会对Q-learning有更深入的了解
欢迎大家一起学习共同提高,
独乐乐不如众乐乐 ^_^
随机推荐
- Sql Server 的服务器类型
Sql Server 提供了四种服务器类型: 如图所示 : 1, 数据库引擎 2, Analysis Services (分析服务 ) 3, Reporting Services (报告服务) ...
- ArrayList与数组间的转换
关键句:String[] array = (String[])list.toArray(new String[size]); public class Test { public static voi ...
- 使用asyncsocket群聊
#import "ViewController.h" #import "AsyncSocket.h" @interface ViewController ()& ...
- JAVA入门[5]-初步搭建SpringMVC站点
一.新建Module 1.新建Module,类型如下图所示: 2.为项目添加Spring框架支持,操作步骤如下: 首先在Module右键->Add Framework Support: 2.Sp ...
- ASP.NET Core 使用 Alipay.AopSdk.Core 常见问题解答
1.Alipay.AopSdk.Core.AopException:"您使用的私钥格式错误,请检查RSA私钥配置,charset = UTF-8" 出现这个问题,就是配置不正确.首 ...
- nginx+redis实现session的共享
上一篇我们介绍了nginx实现的负载均衡和动静分离,可看这边. 我们在文章的末尾说到,负载均衡需要面临的一个问题是内存数据的同步.例如:我有A,B两台服务器做了负载均衡,当我在A服务器上执行了登录并且 ...
- 自学Python4.2 迭代器、生成器
迭代器.生成器一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么, 因为人们很少在迭代途中往后退.另外 ...
- Tomcat配置(二):tomcat配置文件server.xml详解和部署简介
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- IDEA配置jdk
提前安装jdk,配置环境变量 一.配置jdk 1.依次点开File -->Project Structure,点击左侧标签页,点击SDKs 2.点击+号,选SDK 3.按照这个顺序,可以配置多个 ...
- JS获取字符对应的ASCII码
有时候会需要用到字符的ASCII码,一时之间调试时可能会忘记字符与ASCII码对应的数字. 最近喜欢用浏览器控制台直接跑JS代码,将这个代码直接贴到浏览器控制台,即可调试(谷歌浏览器快捷键 ctrl+ ...