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. Java8 日期与时间 API

    在 Java 中,想处理日期和时间时,通常都会选用 java.util.Date 这个类进行处理.不过不知道是设计者在当时没想好还是其它原因,在 Java 1.0 中引入的这个类,大部分的 API 在 ...

  2. Hyper-V虚拟机安装Ubuntu,启动的时候会出现:Please remove the installation medium,then press ENTER

    Hyper-V虚拟机安装Ubuntu成功以后,重启的时候页面会一直卡在下面,并报Please remove the installation medium,then press ENTER,这是因为启 ...

  3. DataTable Linq Group Count where写法

    DataTable dataTable = new DataTable(); dataTable.Columns.Add("username", typeof(string)); ...

  4. CLH lock 原理及JAVA实现

    --喜欢记得关注我哟[shoshana]--​ 前记 JUC中的Lock中最核心的类AQS,其中AQS使用到了CLH队列的变种,故来研究一下CLH队列的原理及JAVA实现 一. CLH背景知识 SMP ...

  5. TP5 按照汉字的拼音排序

    业务需求:接口返回一个列表,但是这个列表要求按一定的条件排序,条件如下: 1,某字段(field1)为null的排前面 2,某字段(field2)为null的排前面 3,姓名(field3)按照汉字的 ...

  6. SAP替代,出口U904在RGGBS000中未生成

    报错.提示出口U904在RGGBS000中未生成. 一般情况下需要到 程序RGGBS000 中,在form:get_exit_titles 中增加下列代码. exits-name = 'U904. e ...

  7. SQL 2008R2问题:用户、组或角色'XXX'在当前数据库中已存在?

    为一个数据库添加一个用户或者映射数据库时,提示以下错误信息: 用户.组或角色 '*****' 在当前数据库中已存在. (Microsoft SQLServer, 错误 : 15023) 问题原因:在还 ...

  8. .NET Core 傻瓜式CSRedisCore缓存

    作者:依乐祝原本链接:https://www.cnblogs.com/yilezhu/p/9947905.html 需要安装Redis   => https://www.runoob.com/r ...

  9. 象棋中“车”的攻击范围_C#

    如题: var a = new String[8,8]; int h, l; Console.WriteLine("输入车所在的行(0-7):"); h = int.Parse(C ...

  10. 探索etcd,Zookeeper和Consul一致键值数据存储的性能

    这篇博文是探索三个分布式.一致性键值数据存储软件性能的系列文章中的第一篇:etcd.Zookeeper和Consul,由etcd团队所写,可以让我们全面地了解如何评估三个分布式一致存储软件的性能.翻译 ...