【强化学习】python实现Q-learning算法更新

一、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,

                )

            )

你可能感兴趣的:(算法,机器学习,人工智能,python)