许久没有更新重新拾起,献于小白

这次介绍的是强化学习  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有更深入的了解

欢迎大家一起学习共同提高,

独乐乐不如众乐乐 ^_^

随机推荐

  1. day9、用户登陆出现-bash-4.1$错误的原因及解决方法

    原因:用户家目录里面与环境变量有关的文件被删除所导致的 下面两个文件被删除导致的 .bash_profile .bashrc 解决方法:从/etc/skel把丢失的文件 复制回来就可以了 -bash- ...

  2. 【特征匹配】BRISK原文翻译

    原文:Stefan Leutenegger, Margarita Chli et al.<BRISK: Binary Robust Invariant Scalable Keypoints> ...

  3. Xcode6 UIWebView与JavaScript交互(issue fix)

    这篇文章中,有介绍UIWebView与JavaScript交互,在UIWebView截获JavaScript请求处理.从app的角度,这是JavaScript的Hook请求. 在Xcode6之前的Ap ...

  4. String 经常用法最优算法实现总结 (二)

    1. String getOrderedString(boolean isDuplicated, String - str) 说明: Orders all characters in the inpu ...

  5. 介绍一个法国的时间戳server

    特别说明: 以下介绍的法国时间戳server已经停止服务了.我曾发Email给相关站点的管理员.对方回复说他也不知道什么时候能恢复服务,有可能就是遥遥无期了.所以以下的内容仅有參考价值.没法实践了. ...

  6. java多线程编程核心技术——第七章补漏拾遗

    本章主要知识点: 1)线程组的使用 2)如何切换线程状态 3)SimpleDateFormat类与多线程的解决方法 4)如何处理线程异常. 这本书基本来到了终点,其实在第四章来说,核心(基础)的线程知 ...

  7. strus2项目中百度编辑器运用的几点细节

    百度编辑器的运用可以参考我之前写的一篇文章,在java项目中加入百度富文本编辑器.这篇文章是以maven+spring mvc项目进行的,总得来说配置比较简单,但是如果是想在strus2项目中配置ue ...

  8. springboot学习笔记-4 整合Druid数据源和使用@Cache简化redis配置

    一.整合Druid数据源 Druid是一个关系型数据库连接池,是阿里巴巴的一个开源项目,Druid在监控,可扩展性,稳定性和性能方面具有比较明显的优势.通过Druid提供的监控功能,可以实时观察数据库 ...

  9. 【adb】连接BlueStacks

    1.在任务管理器中找到

  10. 【java】实例化对象的3种方式:new、clone、反射

    实例化对象的3种方式:new.clone.反射