首先初始化一个 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