文章目录

  • 强化学习
  • Q-Learning算法
  • 代码实现
    • 算法参数
    • 状态集
    • 动作集
    • 奖励集
    • Q table
    • Q-learning算法实现
    • 更新状态
  • 完整代码

强化学习

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。

强化学习是智能体(Agent)以“试错”的方式进行学习,通过与环境进行交互获得的奖赏指导行为,目标是使智能体获得最大的奖赏,强化学习不同于连接主义学习中的监督学习,主要表现在强化信号上,强化学习中由环境提供的强化信号是对产生动作的好坏作一种评价(通常为标量信号),而不是告诉强化学习系统RLS(reinforcement learning system)如何去产生正确的动作。由于外部环境提供的信息很少,RLS必须靠自身的经历进行学习。通过这种方式,RLS在行动-评价的环境中获得知识,改进行动方案以适应环境。

Q-Learning算法

伪代码

Q value的更新是根据贝尔曼方程

代码实现

算法参数
epsilon = 0.9  # 贪婪度
alpha = 0.1  # 学习率
gamma = 0.8  # 奖励递减值
状态集
states = range(6)  # 状态集
def get_next_state(state, action):'''对状态执行动作后,得到下一状态'''global states# l,r,n = -1,+1,0if action == 'right' and state != states[-1]:  # 除非最后一个状态(位置),向右就+1next_state = state + 1elif action == 'left' and state != states[0]:  # 除非最前一个状态(位置),向左就-1next_state = state - 1else:next_state = statereturn next_state
动作集
actions = ['left', 'right']  # 动作集
def get_valid_actions(state):'''取当前状态下的合法动作集合,与reward无关!'''global actions  # ['left', 'right']valid_actions = set(actions)if state == states[-1]:  # 最后一个状态(位置),则valid_actions -= set(['right'])  # 不能向右if state == states[0]:  # 最前一个状态(位置),则valid_actions -= set(['left'])  # 不能向左return list(valid_actions)
奖励集
rewards = [0, 0, 0, 0, 0, 1]  # 奖励集
Q table

Q table是一种记录状态-行为值 (Q value) 的表。常见的q-table都是二维的,但是也有3维的Q table。

q_table = pd.DataFrame(data=[[0 for _ in actions] for _ in states], index=states, columns=actions)
Q-learning算法实现
for i in range(13):# current_state = random.choice(states)current_state = 0update_env(current_state)  # 环境相关total_steps = 0  # 环境相关while current_state != states[-1]:if (random.uniform(0, 1) > epsilon) or ((q_table.loc[current_state] == 0).all()):  # 探索current_action = random.choice(get_valid_actions(current_state))else:current_action = q_table.loc[current_state].idxmax()  # 利用(贪婪)next_state = get_next_state(current_state, current_action)next_state_q_values = q_table.loc[next_state, get_valid_actions(next_state)]q_table.loc[current_state, current_action] += alpha * (rewards[next_state] + gamma * next_state_q_values.max() - q_table.loc[current_state, current_action])current_state = next_stateupdate_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)
更新状态
def update_env(state):global statesenv = list('-----T')if state != states[-1]:env[state] = '0'print('\r{}'.format(''.join(env)), end='')time.sleep(0.1)

完整代码

import pandas as pd
import random
import time#########参数
epsilon = 0.9  # 贪婪度
alpha = 0.1  # 学习率
gamma = 0.8  # 奖励递减值#####探索者的状态,即可到达的位置
states = range(6)  # 状态集
actions = ['left', 'right']  # 动作集
rewards = [0, 0, 0, 0, 0, 1]  # 奖励集q_table = pd.DataFrame(data=[[0 for _ in actions] for _ in states], index=states, columns=actions)def update_env(state):global statesenv = list('-----T')if state != states[-1]:env[state] = '0'print('\r{}'.format(''.join(env)), end='')time.sleep(0.1)def get_next_state(state, action):'''对状态执行动作后,得到下一状态'''global states# l,r,n = -1,+1,0if action == 'right' and state != states[-1]:  # 除非最后一个状态(位置),向右就+1next_state = state + 1elif action == 'left' and state != states[0]:  # 除非最前一个状态(位置),向左就-1next_state = state - 1else:next_state = statereturn next_statedef get_valid_actions(state):'''取当前状态下的合法动作集合,与reward无关!'''global actions  # ['left', 'right']valid_actions = set(actions)if state == states[-1]:  # 最后一个状态(位置),则valid_actions -= set(['right'])  # 不能向右if state == states[0]:  # 最前一个状态(位置),则valid_actions -= set(['left'])  # 不能向左return list(valid_actions)for i in range(13):# current_state = random.choice(states)current_state = 0update_env(current_state)  # 环境相关total_steps = 0  # 环境相关while current_state != states[-1]:if (random.uniform(0, 1) > epsilon) or ((q_table.loc[current_state] == 0).all()):  # 探索current_action = random.choice(get_valid_actions(current_state))else:current_action = q_table.loc[current_state].idxmax()  # 利用(贪婪)next_state = get_next_state(current_state, current_action)next_state_q_values = q_table.loc[next_state, get_valid_actions(next_state)]q_table.loc[current_state, current_action] += alpha * (rewards[next_state] + gamma * next_state_q_values.max() - q_table.loc[current_state, current_action])current_state = next_stateupdate_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——实现简单的强化学习相关推荐

  1. python代码:基于强化学习的智能电网的动态定价方法 摘要:提出了一种考虑服务提供商(SP)利润和用户(CUs)成本的分级电力市场中能量管理的动态定价DR算法

    python代码:基于强化学习的智能电网的动态定价方法 摘要:提出了一种考虑服务提供商(SP)利润和用户(CUs)成本的分级电力市场中能量管理的动态定价DR算法. 使用强化学习(RL)描述分层决策框架 ...

  2. 通过简单的强化学习实现井字棋(Tic-Tac-Toe)

    一.强化学习简介 强化学习的过程可以理解为Agent与Environment的交互.学习.进步的过程,在井字棋中,可以简单的将其中的一方理解为Agent,另一方为Environment.交互的过程中主 ...

  3. 使用tensorflow进行简单的强化学习 1—Q-learning

    注:该系列文章为学习笔记,欢迎指正! 文章目录 前言 一.Q-learning 1. FrozenLake 环境 2.Q-Learning的简单实现 二.Q-Table Learning 代码实现 1 ...

  4. bandit agent下棋AI(python编写) 通过强化学习RL 使用numpy

    PS:首先声明是学校的作业= = 我喊它贝塔狗(原谅我不要脸),因为一直觉得阿法狗很厉害但离我很遥远,终于第一次在作业驱动下尝试写了一个能看的AI,有不错的胜率还是挺开心的 正文 对战随机agent的 ...

  5. 使用 Carla 和 Python 的自动驾驶汽车第 4 部分 —— 强化学习代理

    在我们的自动驾驶汽车的第四部分,Carla, Python, TensorFlow,和强化学习项目,我们将为我们的实际代理编码.在前一篇教程中,我们研究了环境类,我们的代理将与之交互. 在考虑如何创建 ...

  6. 用C++实现强化学习,速度不亚于Python,这里有个框架可用

    乾明 发自 凹非寺  量子位 报道 | 公众号 QbitAI 没法用Python,怎么实现强化学习? 现在,有了一个新选择. 一位名叫Isaac Poulton的英国小哥,开源了一个名为CppRL的C ...

  7. 了解第二部分多武装匪徒的强化学习手

    系列的链接: (Series' Links:) Introduction 介绍 Multi-Armed Bandits | Notebook 多臂土匪 | 笔记本 This is the second ...

  8. 如何用强化学习优化广告投放中的A/B Test

    公众号后台回复"图书",了解更多号主新书内容 作者:会痛的stone 来源:R语言工程化 A/B Test是决策科学的最常见方法之一.以广告投放为例,将客户群分为两组或多组,每组群 ...

  9. 强化学习(一)模型基础

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.前言 从今天开始整理强化学习领域的知识,主要参考的资料是Sut ...

最新文章

  1. iview 表单 验证_iview必备技能一、表单验证规则
  2. Java开发面试问题,Java中高级核心知识全面解析(10)
  3. 并发容器之CopyOnWriteArrayList
  4. Codeforces Round #539 Div. 1
  5. html获取微信code,get-weixin-code.html
  6. springboot banner在线生成_SpringBoot系列教程10--小花样之SpringBoot配置自定义Banner
  7. [转]2020年排名前20的基于SpringBoot搭建的开源项目,帮你快速进行项目搭建!
  8. 怎么判断冠词用a还是an_【语法微课堂】英语冠词的用法,学会这4点,轻松玩转a、an、the...
  9. Quartz教程:快速入门
  10. zookeeper学习02 使用
  11. 完美国际服务器维护中,《完美国际2》3月31日全服更新维护公告
  12. python数据分析之数据分析(步骤)流程
  13. 【文本差异对比工具网页版】
  14. 云计算与大数据——云计算概述
  15. 辨别貔貅币的一种代码思路
  16. 乐视网今日开市起停牌 深交所将作出是否暂停上市的决定
  17. ffmpeg基础——基本框架介绍
  18. AS2021为工具 AOSP为源码 rk开发板为目标设备 调式app到android framework service
  19. 如何用手机控制stm32单片机,通过蓝牙模块
  20. [HR面试] 65个最常见的面试问题

热门文章

  1. ambiguous package name 'libglib2.0-0' with more than one installed instance
  2. eclipse项目中关于导入的项目里提示HttpServletRequest 不能引用的解决办法
  3. linux枯燥命令行下的“有趣命令”
  4. php-fpm的重启
  5. Redis异步消息队列
  6. akka一些邮箱的实现
  7. netty keepalive 和 idle 的关系
  8. Sentinel熔断限流器工作原理
  9. eos节点服务器_EOS跌落神坛?
  10. ip netns的使用及network namespace 简介