用零基础的视角学强化学习之 Qlearning(一)

qlearning 吾找了很久的中文名,终不得其果。

qlearning为何物,建立q_table ,优化q_table 矩阵的值。

何为q_table. 无例要不成文。

先理一下 ,这个例子的逻辑, 可以阅读完全文再返回来理解

源码地址:HTTPS://GITHUB.COM/YUANYUANGONG/GYYTENSOR.GIT  

在 《零碎的python基础代码》··这个文件夹里。人懒就不重新起 项目,感谢莫烦大神的教程和源码

1,根据实际情况 建立 q_table 

2,在不同的位置根据设置的方法 选择动作 (left,right)

3,根据选择的结果

一,小明想要从1走到6,吾等人类肯定知道 一直往右就对了,但电脑不知道啊,对于电脑 走到 每个 各自都有 两个 方向 right left  

小明想要从1走到6

那么吾就把 格子一记作  state:0 (数组都是从0开始的),格子二 记作 state:1 .每个 格子两个选择(left,right)以此列推,可记作 矩阵:

import numpy as np

import pandas as pd

n_states=6

actions=['left','right']

q_table = pd.DataFrame( np.zeros((n_states, len(actions))),columns=actions, )

print(q_table)

q_table

上面这个矩阵 里面的  0.0  表示 在  status 0   往left 可以获得的 收益值 。至于这 个值 初始是 0.0 。随着训练,在后面通过特有的方法来改变(优化)。 

整个矩阵表明了 在 格子1 ,2 ,3 等 地方 往left  的好处值 以及 往right 的好处,尽管现在全是0.0 。那么电脑现在只会随机选择方向。

有这么一个可以记录 每个格子 (state)选left 还是right 的表,就是让 电脑去瞎走,每走一步,改变 好处值(价值)就是 那些 0.0

代码如下

这是选择 向left right 的逻辑

state 是 0,1,2,3,4,5 

1,传入参数 当前格子(state)--可以理解当前位置  q_table

2, q_table.iloc[state, :]  获取当前 state 的 left  right 的价值 

3,np.random.uniform() 获取一个0到1 的随便变量。EPSILON 全局变量 设置为0.9 

 意味着 这个函数  10%的几率 执行 随机选动作 np.random.choice(ACTIONS)

def choose_action(state, q_table):

    state_actions = q_table.iloc[state, :] #获取当前 state 的 left  right 的价值 

    if (np.random.uniform() > EPSILON) or ((state_actions == 0).all()):  

        action_name = np.random.choice(ACTIONS) #10%的几率 执行 随机选 动作

    else:  

        action_name = state_actions.idxmax()   #选择 价值最大的 动作

    return action_name

当 执行动作就要获取这个动作的反馈,这个例子的反馈只有 两个 到达6 ,没有到达 6   用参数R = 0 or 1 

传入参数  格子位置state(S) 动作action(A) 

返回 S_ (下一步的位置),R(是否到达)

def get_env_feedback(S, A):

    if A == 'right':    # move right

        if S == N_STATES - 2:  #  N_STATES总共多少格子 (-2?从0 开始计数)

            S_ =  N_STATES-1 #终点

            R = 1 

        else:

            S_ = S + 1 #往右 state +1 也就是位置增1

            R = 0 

    else:  # move left

        R = 0

        if S == 0:

            S_ = S  # 到起点

        else:

            S_ = S - 1 #往左位置减 1

    return S_, R

执行了动作,获取了 state(位置) 以及是否到达。就开始评估 这个动作的价值。也就是改变那些0.0。

来看看代码是怎么个逻辑吧

             A = choose_action(S, q_table)  #选择动作 

            S_, R = get_env_feedback(S, A)  #获取反馈

            q_predict = q_table.loc[S, A]  #根据q_table 获取 当前 位置(S),动作(A)对应的 价值 (0.0)

            if R != 1:

                q_target = R + GAMMA * q_table.iloc[S_, :].max()  

                 #GAMMA  是全局变量, 设置为0.9,获取当前位置 最大的值那个值 

            else:

                q_target = R    # next state is terminal

            q_table.loc[S, A] += ALPHA * (q_target - q_predict)  #  ALPHA全局变量,可以理解为学习速率。 

            update_env(S_, episode, step_counter+1) #更新显示的位置

当然,上面这段代码需要循环多次 才能 吧 q_table 更新到我们想要的。

总结一下。qlearning. 就是 让 傻瓜 一开始 瞎乱跑。当这个傻瓜 跑到了 终点。就让他记住 在某个位置,执行了 某个动作 获得了成功 比如在 位置 5 执行向右 到6 。那么 傻瓜就记住了 位置5 动作right  对应 价值 为 1 (你也可以设置成100 ,随你高兴)。一次还无法让傻瓜学会从 1 到 6 怎么走。 他现在只知道 5到6 该如何走。

没事让他 从新再瞎跑一遍。当傻瓜 从位置4到位置5 ,根据上一次经验,位置5 上有 价值。于是就记录位置4 动作right  对应 价值 为 1*0.8 (0.8是我设置的系数,目的?现在不予讨论,去了解一下泛化吧)

同理,可以组建推出 4个位置的 right left 的价值。在这个例子中起点 ,终点的价值是 固定的 0 1。

因为该例子 简单,还不足以证实qlearning 的强大,请关注下一期的 ,走棋。


最后,感谢阅读此文的同志们,若有疑问可以加 QQ 群,660357555 一起来探讨。

你可能感兴趣的:(用零基础的视角学强化学习之 Qlearning(一))