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

这次介绍的是强化学习  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. Sql Server 的服务器类型

    Sql Server 提供了四种服务器类型: 如图所示  : 1, 数据库引擎  2, Analysis Services (分析服务 )  3, Reporting  Services (报告服务) ...

  2. ArrayList与数组间的转换

    关键句:String[] array = (String[])list.toArray(new String[size]); public class Test { public static voi ...

  3. 使用asyncsocket群聊

    #import "ViewController.h" #import "AsyncSocket.h" @interface ViewController ()& ...

  4. JAVA入门[5]-初步搭建SpringMVC站点

    一.新建Module 1.新建Module,类型如下图所示: 2.为项目添加Spring框架支持,操作步骤如下: 首先在Module右键->Add Framework Support: 2.Sp ...

  5. ASP.NET Core 使用 Alipay.AopSdk.Core 常见问题解答

    1.Alipay.AopSdk.Core.AopException:"您使用的私钥格式错误,请检查RSA私钥配置,charset = UTF-8" 出现这个问题,就是配置不正确.首 ...

  6. nginx+redis实现session的共享

    上一篇我们介绍了nginx实现的负载均衡和动静分离,可看这边. 我们在文章的末尾说到,负载均衡需要面临的一个问题是内存数据的同步.例如:我有A,B两台服务器做了负载均衡,当我在A服务器上执行了登录并且 ...

  7. 自学Python4.2 迭代器、生成器

    迭代器.生成器一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么, 因为人们很少在迭代途中往后退.另外 ...

  8. Tomcat配置(二):tomcat配置文件server.xml详解和部署简介

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  9. IDEA配置jdk

    提前安装jdk,配置环境变量 一.配置jdk 1.依次点开File -->Project Structure,点击左侧标签页,点击SDKs 2.点击+号,选SDK 3.按照这个顺序,可以配置多个 ...

  10. JS获取字符对应的ASCII码

    有时候会需要用到字符的ASCII码,一时之间调试时可能会忘记字符与ASCII码对应的数字. 最近喜欢用浏览器控制台直接跑JS代码,将这个代码直接贴到浏览器控制台,即可调试(谷歌浏览器快捷键 ctrl+ ...