lonenysky

 

上篇文章讲到Q-learning, Sarsa与Q-learning的在决策上是完全相同的,不同之处在于学习的方式上

这次我们用openai gym的Taxi来做演示

Taxi是一个出租车的游戏,把顾客送到目的地+20分,每走一步-1分,如果在路上把乘客赶下车的话扣10分

 

简要

Sarsa是一种在线学习算法,也就是on-polic,Sarsa在每次更新算法时都是基于确定的action,而Q-learning还没有确定

Sarsa相对比较保守,他的每一步行动都是基于下一个Q(s',a')来完成的

我们来看Sarsa的算法部分

是不是看起来很眼熟,没错和Q-learning的区别很小

Q-learning每次都时action'都选择最大化,而Sarsa每次更新都会选择下一个action,在我们对代码中对应的代码也就是

obervation_, reward, done, info=env.step(action)
action_=choise(obervation_)

 

游戏开始

首先我们初始化游戏环境

import gym
import numpy as np

env=gym.make('Taxi-v2')
env.seed(1995)

MAX_STEP=env.spec.timestep_limit
ALPHA=0.01
EPS=1
GAMMA=0.8

q_table=np.zeros([env.observation_space.n,env.action_space.n],dtype=np.float32)

对没错,Sarsa还是需要Q表来保存经验的

 

Sarsa的决策上还是和Q-learning相同的

def choise(obervation):
    if np.random.uniform()<EPS:
        action=env.action_space.sample()
    else:
        action=np.argmax(q_table[obervation])
    return action

 

下面是我们的核心部分,就是学习啦^_^

#这里是Q-learning的学习更新部分

def learn(state,action,reward,obervation_):
    q_table[state][action]+=ALPHA*(reward+GAMMA*(max(q_table[obervation_])-q_table[state,action]))

#这里是Sarsa的学习更新部分

def learn(state,action,reward,obervation_,action_):
    q_table[state][action] += ALPHA * (reward + GAMMA * q_table[obervation_,action_] - q_table[state, action])

哒当,我用红线标示出来了,聪明的你一定发现了不同对吧

 

GAME OVER

让我们大干一场吧

下面是所有的代码,小伙伴们快来运行把

 1 import gym
 2 import numpy as np
 3 
 4 env=gym.make('Taxi-v2')
 5 env.seed(1995)
 6 
 7 MAX_STEP=env.spec.timestep_limit
 8 ALPHA=0.01
 9 EPS=1
10 GAMMA=0.8
11 
12 q_table=np.zeros([env.observation_space.n,env.action_space.n],dtype=np.float32)
13 
14 def choise(obervation):
15     if np.random.uniform()<EPS:
16         action=env.action_space.sample()
17     else:
18         action=np.argmax(q_table[obervation])
19     return action
20 
21 
22 def learn(state,action,reward,obervation_,action_):
23     q_table[state][action] += ALPHA * (reward + GAMMA * q_table[obervation_,action_] - q_table[state, action])
24 
25 
26 SCORE=0
27 for exp in xrange(50000):
28     obervation=env.reset()
29     EPS-= 0.001
30 
31     action=choise(obervation)
32 
33     for i in xrange(MAX_STEP):
34         # env.render()
35         obervation_, reward, done, info=env.step(action)
36         action_=choise(obervation_)
37 
38         learn(obervation,action,reward,obervation_,action_)
39 
40         obervation=obervation_
41         action=action_
42 
43         SCORE+=reward
44         if done:
45             break
46 
47     if exp % 1000 == 0:
48         print 'esp,score (%d,%d)' % (exp, SCORE)
49         SCORE = 0
50 
51 print 'fenshu is %d'%SCORE

欢迎大家一起来学习^_^

 

相关文章: