本文作者:hhh5460

本文地址:https://www.cnblogs.com/hhh5460/p/10146554.html

说明:将之前 q-learning 实现的例一,用 saras 重新写了一遍。具体问题这里就不多说了。

0. q-learning 与 saras 伪代码的对比

图片来源:https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/3-1-A-sarsa/(莫凡)

1. q-learning 与 saras 真实代码对比

a). q-learning 算法

# 探索学习13次
for i in range(13):
# 0.从最左边的位置开始(不是必要的)
current_state = 0
# 1.进入循环,开始探索学习
while current_state != states[-1]:
# 2.取当前状态下的合法动作中,随机(或贪婪)地选一个作为 当前动作
if random.uniform(0,1) > epsilon: # 探索
current_action = random.choice(get_valid_actions(current_state))
else:
#current_action = q_table.ix[current_state].idxmax() # 这种写法是有问题的!二维迷宫有机会陷入死锁
s = q_table.ix[current_state].filter(items=get_valid_actions(current_state))
current_action = random.choice(s[s==s.max()].index) # 可能多个最大值,当然,一个更好
#3.执行当前动作,得到下一个状态(位置)
next_state = get_next_state(current_state, current_action)
# 4.下个状态的奖励
next_state_reward = rewards[next_state]
# 5.取下一个状态所有的Q value,待取其最大值
next_state_q_values = q_table.ix[next_state, get_valid_actions(next_state)]
# 6.根据贝尔曼方程,更新 Q table 中当前状态-动作对应的 Q value,有max!
q_table.ix[current_state, current_action] += alpha * (rewards[next_state] + gamma * next_state_q_values.max() - q_table.ix[current_state, current_action])
# 7.进入下一个状态(位置)
current_state = next_state

b). saras 算法

# 探索学习13次
for i in range(13):
# 0.从最左边的位置开始(不是必要的)
current_state = 0
# 1.取当前状态下的一个合法动作
if random.uniform(0,1) > epsilon: # 探索
current_action = random.choice(get_valid_actions(current_state))
else: # 利用(贪婪)
s = q_table.ix[current_state].filter(items=get_valid_actions(current_state))
current_action = random.choice(s[s==s.max()].index) # 可能多个最大值,当然,一个更好
# 2.进入循环,开始探索学习
while current_state != states[-1]:
# 3.执行当前动作,得到下一个状态(位置)
next_state = get_next_state(current_state, current_action)
# 4.取下个状态下的一个合法动作
if random.uniform(0,1) > epsilon: # 探索
next_action = random.choice(get_valid_actions(next_state))
else: # 利用(贪婪)
s = q_table.ix[next_state].filter(items=get_valid_actions(next_state))
next_action = random.choice(s[s==s.max()].index) # 可能多个最大值,当然,一个更好
# 5.下个状态的奖励
next_state_reward = rewards[next_state]
# 6.取下个状态,下个动作对应的一个Q value
next_q_value = q_table.ix[next_state, next_action]
# 7.更新 Q table 中当前状态-动作对应的 Q value,无max!
q_table.ix[current_state, current_action] += alpha * (next_state_reward + gamma * next_q_value - q_table.ix[current_state, current_action])
# 8.进入下一状态、下一动作
current_state, current_action = next_state, next_action

2. 完整代码

'''
-o---T
# T 就是宝藏的位置, o 是探索者的位置
'''
# 作者: hhh5460
# 时间:20181219 import pandas as pd
import random
import time epsilon = 0.9 # 贪婪度 greedy
alpha = 0.1 # 学习率
gamma = 0.8 # 奖励递减值 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) 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) for i in range(13):
#current_state = random.choice(states)
current_state = 0
if random.uniform(0,1) > epsilon: # 探索
current_action = random.choice(get_valid_actions(current_state))
else: # 利用(贪婪)
#current_action = q_table.ix[current_state].idxmax() # 这种写法是有问题的!
s = q_table.ix[current_state].filter(items=get_valid_actions(current_state))
current_action = random.choice(s[s==s.max()].index) # 可能多个最大值,当然,一个更好 update_env(current_state) # 环境相关
total_steps = 0 # 环境相关 while current_state != states[-1]:
next_state = get_next_state(current_state, current_action) if random.uniform(0,1) > epsilon: # 探索
next_action = random.choice(get_valid_actions(next_state))
else: # 利用(贪婪)
#next_action = q_table.ix[next_state].idxmax() # 这种写法是有问题的!可能会陷入死锁
s = q_table.ix[next_state].filter(items=get_valid_actions(next_state))
next_action = random.choice(s[s==s.max()].index) # 可能多个最大值,当然,一个更好 next_state_reward = rewards[next_state]
next_q_value = q_table.ix[next_state, next_action] q_table.ix[current_state, current_action] += alpha * (next_state_reward + gamma * next_q_value - q_table.ix[current_state, current_action]) 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 例一的更多相关文章

  1. 强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods)

    强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods) 学习笔记: Reinforcement Learning: An Introduction, Richard S ...

  2. (待续)【转载】 DeepMind发Nature子刊:通过元强化学习重新理解多巴胺

    原文地址: http://www.dataguru.cn/article-13548-1.html -------------------------------------------------- ...

  3. 【强化学习】python 实现 q-learning 例一

    本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10134018.html 问题情境 -o---T# T 就是宝藏的位置, o 是探索者的位置 ...

  4. 强化学习-时序差分算法(TD)和SARAS法

    1. 前言 我们前面介绍了第一个Model Free的模型蒙特卡洛算法.蒙特卡罗法在估计价值时使用了完整序列的长期回报.而且蒙特卡洛法有较大的方差,模型不是很稳定.本节我们介绍时序差分法,时序差分法不 ...

  5. 以股票RSI指标为例,学习Python发送邮件功能(含RSI指标确定卖点策略)

    本人之前写过若干“给程序员加财商”的系列文,目的是通过股票案例讲述Python知识点,让大家在学习Python的同时还能掌握相关的股票知识,所谓一举两得. 在之前的系列文里,大家能看到K线,均线,成交 ...

  6. 强化学习 平台 openAI 的 gym 安装 (Ubuntu环境下如何安装Python的gym模块)

    openAI 公司给出了一个集成较多环境的强化学习平台  gym , 本篇博客主要是讲它怎么安装. openAI公司的主页: https://www.openai.com/systems/ 从主页上我 ...

  7. 【转】强化学习(一)Deep Q-Network

    原文地址:https://www.hhyz.me/2018/08/05/2018-08-05-RL/ 1. 前言 虽然将深度学习和增强学习结合的想法在几年前就有人尝试,但真正成功的开端就是DeepMi ...

  8. 深度强化学习(DQN-Deep Q Network)之应用-Flappy Bird

    深度强化学习(DQN-Deep Q Network)之应用-Flappy Bird 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-fu ...

  9. 机器学习之强化学习概览(Machine Learning for Humans: Reinforcement Learning)

    声明:本文翻译自Vishal Maini在Medium平台上发布的<Machine Learning for Humans>的教程的<Part 5: Reinforcement Le ...

随机推荐

  1. Django 添加mdia文件目录路径

    1.settings.py MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 2.urls.py from djan ...

  2. SpringCloud+Feign环境下文件上传与form-data同时存在的解决办法(2)

    书接上文. 上文中描述了如何在 SpringCloud+Feign环境下上传文件与form-data同时存在的解决办法,实践证明基本可行,但却会引入其他问题. 主要导致的后果是: 1. 无法与普通Fe ...

  3. Python数据清洗基本流程

    # -*- coding: utf-8 -*-"""Created on Wed Jul 4 18:40:55 2018 @author: zhen"" ...

  4. 关于excel中的查找

    弹出查找界面后,点击“选项”按钮 在范围下拉框中选择: 1.工作表:表示在当前表sheet中进行查找 2.工作簿:表示在此excel整个文件中进行查找

  5. EF的CodeFirst模式自动迁移(适用于开发环境)

    EF的CodeFirst模式自动迁移(适用于开发环境) 1.开启EF数据迁移功能 NuGet包管理器------>程序包管理控制台---------->Enable-Migrations ...

  6. mysql启动失败又一例

    搭的wordpress报错: 后台用的mysql,之前也崩过,原因是虚拟内存耗尽,通过增加swap空间最终让数据重新启动. 但仅过一晚上,数据库再次崩溃.看来要查一查是什么程序耗尽资源. 执行top, ...

  7. 什么是Docker?

      概观 Docker是推动集装箱运动的公司,也是唯一一家能够解决混合云中的每个应用的集装箱平台提供商.当今的企业面临数字化转型的压力,但受到现有应用程序和基础架构的制约,同时合理化日益多样化的云,数 ...

  8. zabbix疑难之时区问题

    zabbix疑难总结: 1.zabbix的web界面的时间不对.晚12个小时整 适用于:安装网上的说法来修改,但是时间仍然不对的情况   我们按照以前的网上的那些方法在配置zabbix,需要配置时区: ...

  9. SSRS奇怪报错Could not update a list of fields for the quer.

    今天遇到一个奇怪的问题,SSRS我觉得是个半成品,很多东西都搞不了.写了一段SQL,本来SQL写法都有点怪了,如下 WITH TMP_A AS (SELECT *,ROW_NUMBER() OVER( ...

  10. Lua 与 C 交互值 函数调用(2)

    @(语言) Lua和C 函数间的使用,都是通过栈来交互,并且基于遵守一定的规则,按照这个规则来就可以了. 1. 调用Lua函数 调用Lua方法过程 将被调用的函数入栈: 依次将所有参数入栈: 使用 l ...