Q-learning的算法:

(1)先初始化一个Q table,Q table的行数是state的个数,列数是action的个数。

(2)先随机选择一个作为初始状态S1,根据一些策略选择此状态下的动作,比如贪心策略,假设选择的动作为A1。

(3)判断由A1动作之后的状态S2是不是终止状态,如果是终止状态,返回的reward,相当于找到了宝藏,游戏结束,如果不是最终状态,在S2状态时选择此时使Q值最大的action作为下一步的动作。可以得到一个实际的Q值。Q(S1,A1)=R+λ*maxQ(S2)。更新Q table中的Q(S1,A1)。Q(S1,A1)=Q(S1,A1)+α*[R+λ*maxQ(S2)-Q(S1,A1)], []里面是实际的Q值减去估计的Q值。

简单的代码如下:

 #coding=utf-8
import numpy as np
import pandas as pd
import time
#计算机产生一段伪随机数,每次运行的时候产生的随机数都是一样的
np.random.seed(2)
#创建几个全局变量
N_STATES=6#状态的个数,一共有六个状态0-5状态
ACTIONS=["left","right"]#action只有两个左和右
EPSILON=0.9#贪心策略
ALPHA=0.1#学习率
LAMBDA=0.9#discount factor
MAX_EPISODEs=10#一共训练10次
FRESH_TIME=0.1
#初始化一个Q-table,我觉得Q-table里面的值初始化成什么样子应该不影响最终的结果
def build_q_table(n_states,actions):
table=pd.DataFrame(
np.zeros((n_states,len(actions))),
columns=actions,
)
# print(table)
return(table)
# build_q_table(N_STATES,ACTIONS)
def choose_action(state,q_table):
state_action=q_table.iloc[state,:]
if (np.random.uniform()>EPSILON) or (state_action.all()==0):
action_name=np.random.choice(ACTIONS)
else:
action_name=state_action.idxmax()
return action_name
def get_env_feedback(s,A):
if A=="right":
if s==N_STATES-2:
s_="terminal"
R=1
else:
s_=s+1
R=0
else:
R=0
if s==0:
s_=s
else:
s_=s-1
return s_,R
def update_env(S,episode,step_couter):
env_list=["-"]*(N_STATES-1)+["T"]
if S=="terminal":
interaction="Episode %s:total_steps=%s"%(episode+1,step_couter)
print("\r{}".format(interaction),end='')
time.sleep(2)
print('\r ',end='')
else:
env_list[S]=''
interaction=''.join(env_list)
print("\r{}".format(interaction),end='')
time.sleep(FRESH_TIME)
def rl():
#先初始化一个Q table
q_table=build_q_table(N_STATES,ACTIONS)
for episode in range(MAX_EPISODEs):
step_counter=0
#选择一个初始的S
S=0
is_terminal=False
update_env(S,episode,step_counter)
#如果S不是终止状态的话,选择动作,得到环境给出的一个反馈S_(新的状态)和R(奖励)
while not is_terminal:
A=choose_action(S,q_table)
S_,R=get_env_feedback(S,A)
q_predict=q_table.ix[S,A]
if S_!="terminal":
#算出来实际的Q值
q_target=R+LAMBDA*q_table.iloc[S_,:].max()
else:
q_target=R
is_terminal=True
q_table.ix[S,A]+=ALPHA*(q_target-q_predict)
S=S_
update_env(
S,episode,step_counter+1
)
step_counter=step_counter+1
return q_table if __name__=="__main__":
q_table=rl()
print("\r\nQ-table:\n")
print(q_table)

Q-learning之一维世界的简单寻宝的更多相关文章

  1. 如何用简单例子讲解 Q - learning 的具体过程?

    作者:牛阿链接:https://www.zhihu.com/question/26408259/answer/123230350来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  2. 强化学习9-Deep Q Learning

    之前讲到Sarsa和Q Learning都不太适合解决大规模问题,为什么呢? 因为传统的强化学习都有一张Q表,这张Q表记录了每个状态下,每个动作的q值,但是现实问题往往极其复杂,其状态非常多,甚至是连 ...

  3. TensorflowTutorial_一维数据构造简单CNN

    使用一维数据构造简单卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 神经网络对于一维数据非常重要,时序数据集.信号处理数据集和一些文本嵌入数据集都是一维数据,会频繁的使用到神经网 ...

  4. 强化学习_Deep Q Learning(DQN)_代码解析

    Deep Q Learning 使用gym的CartPole作为环境,使用QDN解决离散动作空间的问题. 一.导入需要的包和定义超参数 import tensorflow as tf import n ...

  5. 攻防世界PWN简单题 level0

    攻防世界PWN简单题 level0 开始考验栈溢出的相关知识了 Checksec 一下文件 看看都开了什么保护 和 是多少位的程序 发现是64位的程序, 扔进IDA64.IDA YYDS.. 进入主函 ...

  6. 攻防世界PWN简单题 level2

    攻防世界PWN简单题 level2 此题考验的是对ROP链攻击的基础 万事开头PWN第一步checksec 一下 32位的小端程序,扔进IDA 进入函数,找出栈溢出漏洞. 又是这个位置的栈溢出,rea ...

  7. 增强学习(五)----- 时间差分学习(Q learning, Sarsa learning)

    接下来我们回顾一下动态规划算法(DP)和蒙特卡罗方法(MC)的特点,对于动态规划算法有如下特性: 需要环境模型,即状态转移概率\(P_{sa}\) 状态值函数的估计是自举的(bootstrapping ...

  8. Deep learning:四十一(Dropout简单理解)

    前言 训练神经网络模型时,如果训练样本较少,为了防止模型过拟合,Dropout可以作为一种trikc供选择.Dropout是hintion最近2年提出的,源于其文章Improving neural n ...

  9. python库的tkinter带你进入GUI世界(计算器简单功能)

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 一个处女座的程序猿 PS:如有需要Python学习资料的小伙伴可以加 ...

随机推荐

  1. spring boot 从开发到上线(三)—AOP 异常监控、上报

    在做这个项目的期间,看到一篇很有启发性的文章<程序员你为什么这么累>.对于初级程序员来说,拿到需求,第一反应是用什么技术来尽快的完成任务,这本身并没有问题.但长此以往,不仅被需求的更改搞得 ...

  2. Akka-CQRS(12)- akka-http for http-web-service: Routing-服务项目接口

    上篇提到,按当前对web-service功能需要,我们需要完成数据转换marshalling,服务接口routing这两部分的调研和示范.上篇已经完成了对序列化marshalling的讨论,这篇就介绍 ...

  3. python selenium IE Firxfor pyinstaller

    以前在python环境下selenium 主要用的是chromdriver,这次发现老是报错(Timeout), 实际又是正确的, 可能是和chrome版本不正确,再加上我程序蹦来就在windows环 ...

  4. C++强大背后

    转自MiloYip大神的博客 [原文]http://www.cnblogs.com/miloyip/archive/2010/09/17/behind_cplusplus.html 在31年前(197 ...

  5. spring cloud应用

    1.什么是注册中心 (1)就是首先有一个eureka server,服务的注册与发现的中心(2)你如果写好了一个服务,就可以将其注册到eureka server上去(3)然后别人的服务如果要调用你的服 ...

  6. DES加密 java与.net可以相互加密解密两种方法

    DES加密 java与.net可以相互加密解密两种方法 https://www.cnblogs.com/DrWang/archive/2011/03/30/2000124.html sun.misc. ...

  7. 1-python运算符和逻辑控制语句

    目录 运算符 条件语句if…else 断言assert 循环语句while 遍历for循环 1.运算符 1.1.算数运算符 加+.减-.乘*.除/.余%.次方**.向下取整除// 1.2.赋值运算符 ...

  8. Jmeter的安装与配置。

    1.本机配置好JAVA环境. 2.官网下载压缩包,在任意目录下解压. 3.修改配置文件 ,打开Jmeter的bin目录下jmeter.porperties,修改 language=zh_CN samp ...

  9. statsvn使用小记

    准备工作 1.安装TortoiseSVN,在安装时需要安装svn命令行工具: 2.拉取svn代码: svn co https://svn.myserver.cn/svn/myproject1\trun ...

  10. 《JavaScript高级程序设计》笔记:附录A ECMAScript Harmony

    一般性变化 常量 用const关键字声明常量,声明的变量在初始赋值后,就不能进行修改了,如下代码: const MAX_SIZE = 25; MAX_SIZE = 10; //报错 块级作用域及其他作 ...