知识的搬运者

SARSA 的 python 实现

2020-04-08  本文已影响0人  不会停的蜗牛

首先初始化一个 Q table:

Q = np.zeros((env.observation_space.n, env.action_space.n))

下面是 epsilon greedy 算法,用来选择 action:

设置一个 epsilon,如果随机产生的数字小于eps就随便弄个action探索一下,如果大于eps就利用环境信息挑选action:

np.random.seed(seed)            
def choose_action(state):           
    if np.random.random() < epsilon:
        action = np.random.randint(0, 4)            # 小于eps就随便弄个action探索一下
    else:
        action = np.argmax(Q[state, :])         # 大于eps就利用环境信息,挑选action
    return action

下面是 SARSA 算法的核心函数:

算法最后就是得到一个 Q 表,输入是 state, state2, reward, action, action2 这五个

def learn(state, state2, reward, action, action2):  
    predict = Q[state, action]
    target = reward + gamma * Q[state2, action2]
    Q[state, action] = Q[state, action] + alpha * (target - predict)

设置总共玩 total_episodes 次游戏,
每次游戏时都重新选择一个初始state,
有了state,自然要选择action,至于action如何选择,这里有讲究,不同的算法不一样,
每次的游戏一直玩到end,
拿到一个action后,env执行这个action,就可以走到下一个state,拿到reward,以及标记游戏是否结束,
再根据新的state选择action,这样有前后两对action和state,
将两对state和action输入到学习算法中

for episode in range(total_episodes):    # 总共玩多少次游戏

    #print("current episode: " + str(episode))

    state = env.reset()         # 每次游戏时都重新选择一个初始state
    action = choose_action(state)       # 有了state,自然要选择action,至于action如何选择,这里有讲究,不同的算法不一样
    done = False
    
    while not done:             # 每次的游戏一直玩到end

        state2, reward, done, info = env.step(action)           # 拿到一个action后,env执行这个action,就可以走到下一个state,拿到reward,以及标记游戏是否结束

        action2 = choose_action(state2)                 # 再根据新的state选择action,这样有前后两对action和state

        learn(state, state2, reward, action, action2)       # 将两对state和action输入到学习算法中,这个学习算法也是一个核心

        state = state2                  # 更新state,和action 到最新的,继续while循环
        action = action2
上一篇下一篇

猜你喜欢

热点阅读