深度学习-强化学习Q-learning算法简易实现

目标效果:
深度学习-强化学习Q-learning算法简易实现_第1张图片

这里贴一下Q-learning的公式:

深度学习-强化学习Q-learning算法简易实现_第2张图片

代码:

import numpy as np
import pandas as pd
import time
np.random.seed()   # 计算机产生一组伪随机数列
N_STATES=6   # 有多少个state,即有多少种状态,最开始的距离离宝藏的距离多少步
ACTIONS=['left','right']   # 两个可选动作
EPSILON=0.9   # 90%选择最优的动作,10%选择随机的动作
ALPHA=0.1   # 学习效率
LAMBDA=0.9   # 未来奖励的衰减值
MAX_EPISODES=5   # 只玩15回合
FRESH_TIME=0.1   # 规定走一步花的时间有多长

"""创建价值表格"""
def build_q_table(n_states,actions):
    table=pd.DataFrame(   # 使用pandas创建一个表格,表示向左走向右走的价值高低
        np.zeros((n_states,len(actions))),
        columns=actions,
    )
    return table

"""选择acition"""
def choose_action(state,q_action):   # 根据所在的状态,和q_table里边的值选择动作
    state_actions=q_action.iloc[state,:]   # 现在到了第几回合,把表格中第几回合的两个值赋值给一个变量
    if((np.random.uniform()>EPSILON)or(state_actions==0).all()):   # 10%的情况和一开始都为0的情况下
        action_name=np.random.choice(ACTIONS)   # 随机选择action
    else:   # 剩下90%的情况下
        action_name=state_actions.idxmax()   # 选择表格中价值最大的那个action
    return action_name

"""环境对我们的行为会做出什么样的反应(预测下一步)"""
def get_env_feedback(S,A):
    if(A=='right'):
        if(S==N_STATES-2):   # 总共六个位置,终点下标为5,如果当前下标为4又向右走,则到达终点
            S_='terminal'
            R=1   # 到达终点返回reward=1
        else:
            S_ = S+1   #下标+1,表示向右移动一步
            R = 0   # 没有到达终点,小人下表就往右移动一格
    else:
        R=0   # 往左走总是到达不了终点的,所以reward始终为0
        if(S==0):
            S_=S   # 在初始位置,如果往左移动小人默认原地不动
        else:
            S_ = S-1
    return S_,R   # 下一步到达哪个state,环境给我多少reward

"""建立环境"""
def update_env(S,episode,step_counter):   #当前小人下标(从0开始),回合数(从0开始),步数
    env_list = ['-']*(N_STATES-1) + ['T']   # 生成环境‘-----T’,只生成5个‘-’
    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'   # 如果没有结束,那就当前小人下标变为“o”
        interaction=''.join(env_list)
        print('\r{}'.format(interaction),end='')
        time.sleep(FRESH_TIME)   # 每步之间间隔0.1秒

"""创建组循环"""
def rl():
    q_table=build_q_table(N_STATES,ACTIONS)   # 建立Q表,6个state,2个action
    for episode in range(MAX_EPISODES):   # 从第一个回合玩到最后一个回合,共10个回合
        step_counter=0   # 计算步数,比较衡量模型效果好坏
        S=0   # 初始情况把小人放在最左边
        is_terminated=False   # 一开始不是终止,当小人达到目标位置变为True
        update_env(S,episode,step_counter)   # 更新环境
        while not(is_terminated):   # 判断到没到结束
            A=choose_action(S,q_table)   # 根据初始的state和Q值表选择一个action
            S_,R=get_env_feedback(S,A)   # 得到下一个state和reward
            q_predict=q_table.loc[S,A]   # 估计值
            if(S_!='terminal'):   # 下一步不是终止
                q_target=R+LAMBDA*q_table.iloc[S_,:].max()   # 真实值(下一个场景中每个action的最大值)
            else:   # 下一步终止
                q_target=R   # 这里因为到达终点了,没有下一步,所以那一部分为0,只考虑reward
                is_terminated=True
            q_table.loc[S,A]+=ALPHA*(q_target-q_predict)   # 更新价值表格,场景S选择A的Q值
            S=S_   # 更新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)

 

你可能感兴趣的:(深度学习)