什么是Q Learning
Q Learning也是一个决策过程
小例子
用tabular Q-learning的方法实现一个小例子,例子的环境是一个一维世界,在世界的右边有宝藏,探索者只要得到了宝藏尝到了甜头,然后以后就记住了得到宝藏的方法,这就是他用强化学习所学习到的行为。
-o---T
# T 就是宝藏的位置, o 是探索者的位置
Q-learing是一种记录行为值(Q value)的方法,每种在一定状态的行为都会有一个值Q(s,a),就是说行为a在s状态的值是Q(s,a).s在上面的探索游戏中,就是o所咋的地点。而每个地点探索者都能做出两个行为left/right,这就是探索者的所有可行的a
如果在某个地点s1,探索者计算了他能有的两种行为,哪个行为的Q值大则选择哪个行为。
预设值
import numpy as np
import pandas as pd
import time
N_STATES=6 #1维世界的宽度
ACTION=['left','right'] #探索者的的可用动作
EPSILON=0.9 #贪婪度 greedy
ALPHA=0.1 #学习率
GAMMA=0.9 #奖励递减值
MAX_EPISODES=13 #最大回合数
FRESH_TIME=0.3 #移动间隔时间
Q表
def build_q_table(n_states,actions):
table=pd.DataFrame(
np.zeros((n_states,len(actions))),columns=actions,) #columns对应的是行为名称
return table
定义动作
接着是定义探索者是如何挑选行为的,引入epsilon greedy的概念。因为在初始阶段,随机的探索环境,往往比固定的行为模式要好,所以这也是累计经验的阶段,我们希望探索者不会那么贪婪(greedy),所以EPSILON就是用来控制贪婪程度的值。EPSILON可以随着探索时间不断提升(越来越贪婪),不过这个例子中,我们就固定成EPSILON=0.9,90%的时间是选择最优策略,10%的时间用来探索。
#在某个state地点,选择行为
def choose_action(state,q_table):
state_actions=q.table.iloc[state,:] #选出这个state的所有action值
if (np.random.uniform() > EPSILON) or (state_actions.all() == 0): # 非贪婪 or 或者这个 state 还没有探索过
action_name = np.random.choice(ACTIONS)
else:
action_name=state_actions.argmax()#贪婪度
return action_name
环境反馈
做出行为后,环境也要给我们的行为一个反馈,反馈出下个state,以及reward
def get_env_feedback(S, A):
# This is how agent will interact with the environment
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):
# This is how environment be updated
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_table=build_q_table(N_STATES,ACTIONS) #初始 qtable
for episode in range(MAX_EPISODES):#回合
step_counter=0
S=0 #回合初始位置
is_terminated=False #是否回合结束
update_env(S,episode,step_counter) #环境更新
while not is_terminated:
A=choose_action(S,q_table) #选择行为
S_,R=get_env_feeback(S,A) #实施行为并得到环境的反馈
q_predict=q_table.loc[S,A] #估算得到的(状态-行为)值
if S_!='terminal':
q_target = R + GAMMA * q_table.iloc[S_, :].max() # 实际的(状态-行为)值 (回合没结束)
else:
q_target=R #实际的(状态-行为值)回合结束
is_terminated=True
q_table.loc[S,A]+=ALPHA*(q_target-q_predict) #q_table更新
S=S_ #探索者移动到下一个state
updata_env(S,episode,step_counter+1) #环境更新
step_counter+=1
return q_table