1. 程式人生 > >強化學習學習總結(三)——QLearning思維決策

強化學習學習總結(三)——QLearning思維決策

一、思維決策構架 

import numpy as np
import pandas as pd

class QLearningTable:
    # 初始化
    def __init__(self, actions, learning_rate=0.01, reward_decay=0.9, e_greedy=0.9):

    # 選行為
    def choose_action(self, observation):

    # 學習更新引數
    def learn(self, s, a, r, s_):

    # 檢測 state 是否存在
    def check_state_exist(self, state):

二、函式實現

1.初始化

  • actions: 所有行為
  • epsilon: 貪婪率e_greesy
  • lr:          學習率α
  • gamma:  獎勵衰減γ
  • q_table: Q表
  def __init__(self, actions, learning_rate=0.01, reward_decay=0.9, e_greedy=0.9):
        self.actions = actions  # a list
        self.lr = learning_rate # 學習率
        self.gamma = reward_decay   # 獎勵衰減
        self.epsilon = e_greedy     # 貪婪度
        self.q_table = pd.DataFrame(columns=self.actions, dtype=np.float64)   # 初始 q_table

2.選行為choose_action

  • if:在貪婪率內則選擇最大(防止數值相同 choice亂序)
  • else:隨機選擇
 def choose_action(self, observation):
        self.check_state_exist(observation) # 檢測本 state 是否在 q_table 中存在

        # 選擇 action
        if np.random.uniform() < self.epsilon:  # 選擇 Q value 最高的 action
            state_action = self.q_table.loc[observation, :]
            # 同一個 state, 可能會有多個相同的 Q action value, 所以我們亂序一下
            action = np.random.choice(state_action[state_action == np.max(state_action)].index)

        else:   # 隨機選擇 action
            action = np.random.choice(self.actions)

        return action

3.學習更新引數(更新Q表)

  def learn(self, s, a, r, s_):
        self.check_state_exist(s_)  # 檢測 q_table 中是否存在 s_ 


        q_predict = self.q_table.loc[s, a]    # 獲取Q預測值
        if s_ != 'terminal':                  # 獲取真實值
            q_target = r + self.gamma * self.q_table.loc[s_, :].max()  # 下個state不是終止符
        else:
            q_target = r  # 下個 state 是終止符

         # 更新Q表:更新對應的state-action 值
        self.q_table.loc[s, a] += self.lr * (q_target - q_predict)

4.檢測Q表中有無當前state—action值

如果還沒有當前 state, 那我我們就插入一組全 0 資料, 當做這個 state 的所有 action 初始 values.

def check_state_exist(self, state):
        if state not in self.q_table.index:
            # append new state to q table
            self.q_table = self.q_table.append(
                pd.Series(
                    [0]*len(self.actions),
                    index=self.q_table.columns,
                    name=state,
                )
            )