Q-learning之一维世界的简单寻宝
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之一维世界的简单寻宝的更多相关文章
- 如何用简单例子讲解 Q - learning 的具体过程?
作者:牛阿链接:https://www.zhihu.com/question/26408259/answer/123230350来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 强化学习9-Deep Q Learning
之前讲到Sarsa和Q Learning都不太适合解决大规模问题,为什么呢? 因为传统的强化学习都有一张Q表,这张Q表记录了每个状态下,每个动作的q值,但是现实问题往往极其复杂,其状态非常多,甚至是连 ...
- TensorflowTutorial_一维数据构造简单CNN
使用一维数据构造简单卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 神经网络对于一维数据非常重要,时序数据集.信号处理数据集和一些文本嵌入数据集都是一维数据,会频繁的使用到神经网 ...
- 强化学习_Deep Q Learning(DQN)_代码解析
Deep Q Learning 使用gym的CartPole作为环境,使用QDN解决离散动作空间的问题. 一.导入需要的包和定义超参数 import tensorflow as tf import n ...
- 攻防世界PWN简单题 level0
攻防世界PWN简单题 level0 开始考验栈溢出的相关知识了 Checksec 一下文件 看看都开了什么保护 和 是多少位的程序 发现是64位的程序, 扔进IDA64.IDA YYDS.. 进入主函 ...
- 攻防世界PWN简单题 level2
攻防世界PWN简单题 level2 此题考验的是对ROP链攻击的基础 万事开头PWN第一步checksec 一下 32位的小端程序,扔进IDA 进入函数,找出栈溢出漏洞. 又是这个位置的栈溢出,rea ...
- 增强学习(五)----- 时间差分学习(Q learning, Sarsa learning)
接下来我们回顾一下动态规划算法(DP)和蒙特卡罗方法(MC)的特点,对于动态规划算法有如下特性: 需要环境模型,即状态转移概率\(P_{sa}\) 状态值函数的估计是自举的(bootstrapping ...
- Deep learning:四十一(Dropout简单理解)
前言 训练神经网络模型时,如果训练样本较少,为了防止模型过拟合,Dropout可以作为一种trikc供选择.Dropout是hintion最近2年提出的,源于其文章Improving neural n ...
- python库的tkinter带你进入GUI世界(计算器简单功能)
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 一个处女座的程序猿 PS:如有需要Python学习资料的小伙伴可以加 ...
随机推荐
- linux shell 写swoole重启脚本
linux shell 写swoole重启脚本 代码如下<pre>#!/bin/shkill `lsof -t -i:9501`sleep 2php /data/web/mircoweb/ ...
- Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave(二)
一.说明 1.1 说明 前面介绍采用 Jenkinsfile + KubernetesPod.yaml 方式进行部署项目(Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-s ...
- 读懂 ECMA 规格
一般我们都不关心 ECMA 规范,只需要学习怎么使用就好了.但有时候遇到一些难以解释的问题/现象,就不得不看一下规范是如何要求实现的了.规范内容庞杂,理解其中的术语有利于我们快速看懂规范. Envir ...
- 科大讯飞语音芯片xfs5152CE,分享遇到的一些坑
首先 芯片手册的I2C地址是写地址,是8位的,真正的地址是7位地址,应该是0x40,最低位是读写位,读置1,为0x81,写置0,为0x80. 如果是模拟I2C倒无所谓,最坑的是我用的是寄存器,所以必须 ...
- TestNG系列(三)TestNG之XML文件配置
前言 上一篇博客说了TestNG的注解,这篇博客来介绍Test.xml文件. Test.xml文件可以更方便的管理和执行测试用例 一.Test.xml-suite: suite为Test.xml的根节 ...
- 使用VBA将Excel指定单元格数据、字符串或者图表对象插入到Word模板指定书签处
准备工作: 1.首先需要提供一个word模板,并且标记好您要插入书签的位置,定义书签的命名.如图 2.模拟您要插入的Excel原始数据和图表对象 插入代码如下: Private Sub Command ...
- C# vb .NET读取识别条形码线性条码ean-8
ean-8是比较常见的条形码编码规则类型的一种.如何在C#,vb等.NET平台语言里实现快速准确读取该类型条形码呢?答案是使用SharpBarcode! SharpBarcode是C#快速高效.准确的 ...
- docker学习之路-nginx镜像(翻译)
本篇来自https://hub.docker.com/_/nginx/?tab=description 它是docker hub上nginx的官方网站,上面有关于nginx的使用描述等.从这里你可以找 ...
- Django--母版
目录 母版 语法 案例 在之前的两个小程序中,可以发现在写html页面的时候有很多重复的代码 而在python中,为了避免写重复代码,我们通过函数.模块或者类来进行实现,所以在Django里面也有这样 ...
- HTTP发展简史
HTTP发展简史 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的 ...