強化學習學習總結(三)——QLearning思維決策
阿新 • • 發佈:2018-12-12
一、思維決策構架
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,
)
)