强化学习学习笔记-1

强化学习Q-Learning学习笔记

    • 算法流程
    • 代码

强化学习学习笔记-1_第1张图片

算法流程

  1. 初始化Q值表,其实就是一个矩阵,行为状态,列为动作,矩阵中每个元素代表:状态s下执行动作a的折扣奖励也就是Q值。
  2. 初始化状态s,在状态s情况下采用ε贪婪策略选择动作a(ε贪婪策略以ε概率选择使Q值最大的动作,以1-ε概率选择任意动作,全贪婪策略会以100%的概率选择使Q值最大的动作,这样导致较小的Q值得不到更新,这是全贪婪策略的一个弊端)
  3. 执行选择的动作a,此时得到奖励值r(奖励值自己设计)和下一个状态s’。
  4. 这时需要对Q表进行更新,更新公式如下:
    在这里插入图片描述
    Q(s,a)为当前状态s,a下的Q值(查表可得),maxa’Q(s’,a’)为下一状态下最大Q值(查表可得)。
  5. 更新当前状态(s<–s’)
  6. 重复以上步骤,直到s到达某个满意状态。(以下代码是要达到terminal状态)

代码

import numpy as np
import pandas as pd
import time

np.random.seed(2)  # reproducible


N_STATES = 6   # the length of the 1 dimensional world
ACTIONS = ['left', 'right']     # available actions
EPSILON = 0.9   # greedy police
ALPHA = 0.1     # learning rate
GAMMA = 0.9    # discount factor
MAX_EPISODES = 13   # maximum episodes
FRESH_TIME = 0.3 # fresh time for one move


'''
所构造的q表的大小是:行数是财产的探索者总共所处的位置数,列数就是动作的数量
'''
def build_q_table(n_states, actions):
    table = pd.DataFrame(
        np.zeros((n_states, len(actions))),     # q_table initial values
        columns=actions,    # actions's name
    )
    # print(table)    # show table
    return table


def choose_action(state, q_table):
    # This is how to choose an action
    state_actions = q_table.iloc[state, :] #将现在agent观测到的状态所对应的q值取出来
    if (np.random.uniform() > EPSILON) or ((state_actions == 0).all()):  #当生撑随机数大于EPSILON或者状态state所对应的q值全部为0时,就随机选择状态state所对应的动作
        action_name = np.random.choice(ACTIONS)
    else:   # act greedy
        action_name = state_actions.idxmax()    # 选择状态state所对应的使q值最大的动作
    return action_name


def get_env_feedback(S, A):
    # 选择动作之后,还要根据现在的状态和动作获得下一个状态,并且返回奖励,这个奖励是环境给出的,用来评价当前动作的好坏。
    #这里设置的是,只有在获得宝藏是才给奖励,没有获得奖励时,无论是向左移动还是向右移动,给出的即时奖励都是0.
    if A == 'right':    # move right
        if S == N_STATES - 2:   # terminate
            S_ = 'terminal'
            R = 1
        else:
            S_ = S + 1
            R = 0
    else:   # move left
        R = 0
        if S == 0:
            S_ = S  # reach the wall
        else:
            S_ = S - 1
    return S_, R


def update_env(S, episode, step_counter):
    # 更新环境的函数,比如向右移动之后,o表示的agent就距离宝藏进了一步,将agent随处的位置实时打印出来
    env_list = ['-']*(N_STATES-1) + ['T']   # '---------T' our environment
    if S == 'terminal':
        interaction = 'Episode %s: total_steps = %s' % (episode+1, step_counter)
        print('\r{}'.format(interaction), end='')
        time.sleep(2)
        print('\r                                ', end='')
    else:
        env_list[S] = 'o'
        interaction = ''.join(env_list)
        print('\r{}'.format(interaction), end='')
        time.sleep(FRESH_TIME)


def rl():
    # 开始更新q表
    q_table = build_q_table(N_STATES, ACTIONS)#随机初始化一下q表
    for episode in range(MAX_EPISODES):
        step_counter = 0#记录走了多少步
        S = 0#每个episode开始时都将agent初始化在最开始的地方
        is_terminated = False
        update_env(S, episode, step_counter)#打印的就是o-----T
        while not is_terminated:#判断episode是否结束

            A = choose_action(S, q_table)#agent根据当前的状态选择动作
            S_, R = get_env_feedback(S, A)  # 上一步已经获得了s对应的动作a,接着我们要获得下一个时间步的状态
            q_predict = q_table.loc[S, A]
            if S_ != 'terminal':#要判断一下,下一个时间步的是不是已经取得宝藏了,如果不是,可以按照公式进行更新
                q_target = R + GAMMA * q_table.iloc[S_, :].max()   # next state is not terminal
            else:#如果已经得到了宝藏,得到的下一个状态不在q表中,q_target的计算也不同。
                q_target = R     # next state is terminal
                is_terminated = True    # terminate this episode

            q_table.loc[S, A] += ALPHA * (q_target - q_predict)  # update
            S = S_  # move to next state

            update_env(S, episode, step_counter+1)
            step_counter += 1
    return q_table


if __name__ == "__main__":
    q_table = rl()
    print('\r\nQ-table:\n')
    print(q_table)

参考文章:
强化学习(RL)QLearning算法详解

你可能感兴趣的:(深度强化学习,python,算法)