强化学习之一:QLearning

强化学习:QLearning

1.什么是QLearning

在生活中,都有行为准则,好的行为会得到奖励,不好的行为会得到惩罚。比如小时候做作业,有两种选择:写作业或者看电视。如果选择写作业,则家长回来后写完了作业会受到表扬;如果选择看电视导致作业没有写完,那么父母回家后发现没有写完作业则会受到批评。
具体可看https://www.bilibili.com/video/BV13W411Y75P?from=search&seid=14506454741723552307

2.QLearning实现

QLearning也是一个决策过程。
代码如下:

import numpy as np
import pandas as pd
import time
np.random.seed(2)#随机数列
print(np.random.uniform())
N_STATES=6 #一回合有多少此选择
ACTIONS=['left','right'] #每次选择
EPSILON=0.9 #选择最优的概率
ALPHA=0.1#学习效率
LAMBDA=0.9#奖励衰减
MAX_EPISODES=10#回合次数
FRESH_TIME=0.1#步长
def build_q_table(n_states,actions):
    table=pd.DataFrame(np.zeros((n_states,len(actions))),columns=actions,)
    print(table)
    return table
def choose_action(state,q_table):
    state_actions=q_table.iloc[state,:]#q_table按行取
    if(np.random.uniform()>EPSILON)or(state_actions.all()==0):
        action_name=np.random.choice(ACTIONS)#随机选择ACTIONS中的动作,左或者右
    else:
        action_name=state_actions.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 updata_env(s,episode,step_counter):
    env_list=['-']*(N_STATES-1)+['T']
    if s=='terminal':
        interaction='Episode %s:total_step=%s'%(episode+1,step_counter)
        print('\r{}'.format(interaction),end='')
        time.sleep(2)
        print('\r                          ',end='')
    else:
        env_list[s]='0'
        interaction=''.join(env_list)
        print('\r{}'.format(interaction),end='')
        time.sleep(FRESH_TIME)

def rl():
    q_table=build_q_table(N_STATES,ACTIONS)
    for episode in range(MAX_EPISODES):
        step_counter=0
        S=0
        is_terminated=False
        updata_env(S,episode,step_counter)
        while not is_terminated:
            A=choose_action(S,q_table)
            S_,R=get_env_feedback(S,A)
            q_predict=q_table.loc[S,A]
            if S_!='terminal':
                q_target=R+LAMBDA*q_table.iloc[S_,:].max()
            else:
                q_target=R
                is_terminated=True
            q_table.loc[S,A]+=ALPHA*(q_target-q_predict)
            S=S_
            updata_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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值