一、Q-learning算法更新提升的循环
from maze_env import Maze#导入环境
from RL_brain import QLearningTable#导入 QLearning表
#更新的功能
def update():
for episode in range(100):#100个回合
observation = env.reset()#环境给出的观测值
while True:
env.render()#刷新一下
action = RL.choose_action(str(observation))#基于观测值来挑选动作
observation_, reward, done = env.step(action)#去环境施加动作会返回下一个观测值、奖励,有没有跳进坑或者拿到宝藏
RL.learn(str(observation), action, reward, str(observation_))#状态转移:从第一个观测值、动作、奖励、下一个观测值进行学习
observation = observation_#观测值赋值,将最新观测值进行赋值
if done:#当回合结束的时候进行终止
break
print('game over')
env.destroy()
if __name__ == "__main__":
env = Maze()
RL = QLearningTable(actions=list(range(env.n_actions)))
env.after(100, update)
env.mainloop()
二、Q-learning思维决策
import numpy as np
import pandas as pd#引入两个库
class QLearningTable:#定义QLearning表
def __init__(self, actions, learning_rate=0.01, reward_decay=0.9, e_greedy=0.9):#初始全局化变量
self.actions = actions
self.lr = learning_rate
self.gamma = reward_decay#折扣
self.epsilon = e_greedy
self.q_table = pd.DataFrame(columns=self.actions, dtype=np.float64)
def choose_action(self, observation):
self.check_state_exist(observation)#检验状态是否在oberservation中
# 进行动作选择
if np.random.uniform() < self.epsilon:#90%的概率
state_action = self.q_table.loc[observation, :]#按最优结果选择action
action = np.random.choice(state_action[state_action == np.max(state_action)].index)#当两个action的value相等,那只会选第一个,因此需要通过这个操作进行打乱动作
else:
action = np.random.choice(self.actions)#10%进行随机动作选择
return action#返回动作
#以下为学习的步骤
def learn(self, s, a, r, s_):
self.check_state_exist(s_)
q_predict = self.q_table.loc[s, a]
if s_ != 'terminal':
q_target = r + self.gamma * self.q_table.loc[s_, :].max() #如果没有终止
else:
q_target = r # 状态终止
self.q_table.loc[s, a] += self.lr * (q_target - q_predict) # 更新
def check_state_exist(self, state):#检验动作是不是之前经历过
if state not in self.q_table.index:
#将新的状态加到qlearning表
self.q_table = self.q_table.append(
pd.Series(
[0]*len(self.actions),
index=self.q_table.columns,
name=state,
)
)