强化学习之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有更深入的了解
欢迎大家一起学习共同提高,
独乐乐不如众乐乐 ^_^
随机推荐
- spring boot系列03--spring security (基于数据库)登录和权限控制(上)
这篇打算写一下登陆权限验证相关 说起来也都是泪,之前涉及权限的比较少所以这次准备起来就比较困难. 踩了好几个大坑,还好最终都一一消化掉(这是废话你没解决你写个什么劲
- HDU 2298 Toxophily(公式/三分+二分)
Toxophily Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- UVA 10465 Homer Simpson(全然背包: 二维目标条件)
UVA 10465 Homer Simpson(全然背包: 二维目标条件) http://uva.onlinejudge.org/index.php? option=com_onlinejudge&a ...
- hdu 4409 Family Name List(LCA&有坑点)
Family Name List Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu5303Delicious Apples
题意大概就是有n框苹果放在长度为L的环上,每框有ai个苹果.你有一个容量为k的框.要你从0点处出发,随意走.框满了就回到0点把苹果放在那里.继续走直到把苹果都拿完为止.问你最少要走多少路程. 首先贪心 ...
- java多线程编程核心技术——第七章补漏拾遗
本章主要知识点: 1)线程组的使用 2)如何切换线程状态 3)SimpleDateFormat类与多线程的解决方法 4)如何处理线程异常. 这本书基本来到了终点,其实在第四章来说,核心(基础)的线程知 ...
- zephyr初始化流程
1.调用应用层main()函数 kernel/init.c 181行 /** * * @brief Mainline for kernel's background task ...
- MyBatis_通过resultMap解决不一致的问题
- [转]addEventListener() 方法,事件监听
转载 白杨-M http://www.cnblogs.com/baiyangyuanzi/p/6627401.html addEventListener() 方法,事件监听 你可以使用 remov ...
- SDWebimage如何获取缓存大小以及清除缓存
sdwebimage如何获取缓存大小以及清除缓存 1.找到SDImageCache类 2.添加如下方法: - (float)checkTmpSize { float totalSize = 0; ...