【强化学习】python 实现 saras lambda 例一
本文作者:hhh5460
本文地址:https://www.cnblogs.com/hhh5460/p/10147265.html
将例一用saras lambda算法重新撸了一遍,没有参照任何其他人的代码。仅仅根据伪代码,就撸出来了。感觉已真正理解了saras lambda算法。记录如下
0. saras lambda算法伪代码
图片来源:https://morvanzhou.github.io/static/results/reinforcement-learning/3-3-1.png(莫凡)
1. saras lambda算法真实代码
# e_table是q_table的拷贝
e_table = q_table.copy() # ... # saras(lambda)算法
# 参见:https://morvanzhou.github.io/static/results/reinforcement-learning/3-3-1.png
for i in range(13):
# 0. e_table清零
e_table *= 0
# 1.从状态0开始
current_state = 0
# 2.选择一个合法的动作
current_action = choose_action(current_state, epsilon)
# 3.进入循环,探索学习
while current_state != states[-1]:
# 4.取下一状态
next_state = get_next_state(current_state, current_action)
# 5.取下一奖励
next_reward = rewards[next_state]
# 6.取下一动作
next_action = choose_action(next_state, epsilon)
# 7.计算德塔
delta = next_reward + gamma * q_table.ix[next_state, next_action] - q_table.ix[current_state, current_action]
# 8.当前状态、动作对应的e_table的值加1
#e_table.ix[current_state, current_action] += 1 # 这是标准的操作,但是莫凡指出改成下面两句效果更好!
e_table.ix[current_state] *= 0
e_table.ix[current_state, current_action] = 1
# 9.遍历每一个状态的所有动作(不能仅合法动作)
for state in states:
for action in actions:
# 10.逐个更新q_talbe, e_table中对应的值
q_table.ix[state, action] += alpha * delta * e_table.ix[state, action]
e_table.ix[state, action] *= gamma * lambda_
# 11.进入下一状态、动作
current_state, current_action = next_state, next_action
第9步,刚开始我这么写:for action in get_valid_actions(state):,运行后发现没有这样写好:for action in actions:
2. 完整代码
'''
-o---T
# T 就是宝藏的位置, o 是探索者的位置
'''
# 作者: hhh5460
# 时间:20181220 '''saras(lambda)算法实现''' import pandas as pd
import random
import time epsilon = 0.9 # 贪婪度 greedy
alpha = 0.1 # 学习率
gamma = 0.8 # 奖励递减值
lambda_ = 0.9 # 衰减值 states = range(6) # 状态集。从0到5
actions = ['left', 'right'] # 动作集。也可添加动作'none',表示停留
rewards = [0,0,0,0,0,1] # 奖励集。只有最后的宝藏所在位置才有奖励1,其他皆为0 q_table = pd.DataFrame(data=[[0 for _ in actions] for _ in states],
index=states, columns=actions) e_table = q_table.copy() def update_env(state):
'''更新环境,并打印'''
env = list('-----T') # 环境 env[state] = 'o' # 更新环境
print('\r{}'.format(''.join(env)), end='')
time.sleep(0.1) def get_next_state(state, action):
'''对状态执行动作后,得到下一状态'''
global states
# l,r,n = -1,+1,0
if action == 'right' and state != states[-1]: # 除末状态(位置),向右+1
next_state = state + 1
elif action == 'left' and state != states[0]: # 除首状态(位置),向左-1
next_state = state -1
else:
next_state = state
return next_state def get_valid_actions(state):
'''取当前状态下的合法动作集合,与reward无关!'''
global actions # ['left', 'right']
valid_actions = set(actions)
if state == states[0]: # 首状态(位置),则 不能向左
valid_actions -= set(['left'])
if state == states[-1]: # 末状态(位置),则 不能向右
valid_actions -= set(['right'])
return list(valid_actions) def choose_action(state, epsilon_=0.9):
'''选择动作,根据状态'''
if random.uniform(0,1) > epsilon_: # 探索
action = random.choice(get_valid_actions(state))
else: # 利用(贪婪)
#current_action = q_table.ix[current_state].idxmax() # 这种写法是有问题的!
s = q_table.ix[state].filter(items=get_valid_actions(state))
action = random.choice(s[s==s.max()].index) # 可能多个最大值,当然,一个更好
return action # saras(lambda)算法
# 参见:https://morvanzhou.github.io/static/results/reinforcement-learning/3-3-1.png
for i in range(13):
e_table *= 0 # 清零 current_state = 0
current_action = choose_action(current_state, epsilon) update_env(current_state) # 环境相关
total_steps = 0 # 环境相关 while current_state != states[-1]:
next_state = get_next_state(current_state, current_action)
next_reward = rewards[next_state] next_action = choose_action(next_state, epsilon)
delta = next_reward + gamma * q_table.ix[next_state, next_action] - q_table.ix[current_state, current_action]
#e_table.ix[current_state, current_action] += 1 # 这是标准的操作,但是莫凡指出改成下面两句效果更好!
e_table.ix[current_state] *= 0
e_table.ix[current_state, current_action] = 1
for state in states:
for action in actions: #get_valid_actions(state):
q_table.ix[state, action] += alpha * delta * e_table.ix[state, action]
e_table.ix[state, action] *= gamma * lambda_
current_state, current_action = next_state, next_action update_env(current_state) # 环境相关
total_steps += 1 # 环境相关 print('\rEpisode {}: total_steps = {}'.format(i, total_steps), end='') # 环境相关
time.sleep(2) # 环境相关
print('\r ', end='') # 环境相关 print('\nq_table:')
print(q_table)
【强化学习】python 实现 saras lambda 例一的更多相关文章
- (待续)【转载】 DeepMind发Nature子刊:通过元强化学习重新理解多巴胺
原文地址: http://www.dataguru.cn/article-13548-1.html -------------------------------------------------- ...
- 【强化学习】用pandas 与 numpy 分别实现 q-learning, saras, saras(lambda)算法
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10159331.html 特别感谢:本文的三幅图皆来自莫凡的教程 https://morvan ...
- 【强化学习】python 实现 q-learning 例一
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10134018.html 问题情境 -o---T# T 就是宝藏的位置, o 是探索者的位置 ...
- 强化学习-时序差分算法(TD)和SARAS法
1. 前言 我们前面介绍了第一个Model Free的模型蒙特卡洛算法.蒙特卡罗法在估计价值时使用了完整序列的长期回报.而且蒙特卡洛法有较大的方差,模型不是很稳定.本节我们介绍时序差分法,时序差分法不 ...
- 以股票RSI指标为例,学习Python发送邮件功能(含RSI指标确定卖点策略)
本人之前写过若干“给程序员加财商”的系列文,目的是通过股票案例讲述Python知识点,让大家在学习Python的同时还能掌握相关的股票知识,所谓一举两得. 在之前的系列文里,大家能看到K线,均线,成交 ...
- python面向对象学习(七)单例
目录 1. 单例设计模式 单例设计模式的应用场景 2. __new__ 方法 3. Python 中的单例 只执行一次初始化工作 1. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常 ...
- 强化学习 平台 openAI 的 gym 安装 (Ubuntu环境下如何安装Python的gym模块)
openAI 公司给出了一个集成较多环境的强化学习平台 gym , 本篇博客主要是讲它怎么安装. openAI公司的主页: https://www.openai.com/systems/ 从主页上我 ...
- 零基础入门学习Python(21)--函数:lambda表达式
知识点 lambda 表达式 Python 允许使用lambda关键字创建匿名函数 lambda 函数怎么使用? 单个参数 >>> def add(x): return 2*x + ...
- 【转】强化学习(一)Deep Q-Network
原文地址:https://www.hhyz.me/2018/08/05/2018-08-05-RL/ 1. 前言 虽然将深度学习和增强学习结合的想法在几年前就有人尝试,但真正成功的开端就是DeepMi ...
随机推荐
- android一个倾斜的TextView,适用于标签效果
描述: android一个倾斜的TextView,适用于标签效果 应用截图: 使用说明: <com.haozhang.lib.SlantedTextView android:layout_wid ...
- Apache POI导出excel表格
项目中我们经常用到导出功能,将数据导出以便于审查和统计等.本文主要使用Apache POI实现导出数据. POI中文文档 简介 ApachePOI是Apache软件基金会的开放源码函式库,POI提供A ...
- 第六章 Hyper-V 2012 R2 的检查点
"检查点"是 Windows Server 2012 R2 中对 Windows Server 2012 及以前版本的 Hyper-V"快照"功能的新称呼.之所 ...
- .net 调用R语言的函数(计算统计值pvalue 对应excel :ttest)
Pvalue 计算 项目设计pvalue计算,但是由于.net 没有类似的公式或者函数,最终决定使用.net 调用R语言 采用.net 调用r语言的公用函数 需要安装 r语言环境 https://mi ...
- lvm管理卷之缩减卷大小
最近刚刚装好了一个系统,但是因为没有分好区,导致home分区过大,所以想把home分区的一大半移动到根分区里面. 1.先说一下我的环境. 安装的是centos6版本的系统,使用的默认文件系统是ext4 ...
- zabbix实现微信告警配置
zabbix设置微信报警的配置过程 zabbix的报警方式有很多,在这里我们来详细说明一下如何通过微信报警 微信企业号的申请 注册的地址https://qy.weixin.qq.com/ 这样企业就 ...
- git命令行clone指定分支、更新、冲突解决、提交代码步骤
clone指定分支 : git init 初始化仓库 git clone -b 分支名 git@192.168.3.166:xxxx/xxxx.git 克隆指定分支 更新 :git status ...
- Mac显示器不亮
上班的时候mac连接上显示器,但是显示器并没有亮,于是乎各种插拔ing...偶尔一两次还可以接受,但是天天这样小身板招架不住呀,于是乎终于找到一个可以让显示器快速亮起的方法,遂赶紧分享给各位小火鸡~ ...
- Activity声明周期1
oncreate():在Activity对象第一次创建时调用 onStart():当Activity变得可见时调用该函数 onResume():当Activity开始准备于用户交互时调用该方法(即获得 ...
- 简明 Vim 练级攻略------转自陈皓coolshell
vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...