上一篇博客咱們介紹了價值迭代的原理。這一節咱們實現強化學習裏面的價值迭代的部分代碼(完整代碼GitHub)。html
咱們把注意點放在值函數上,等值函數收斂了,咱們的策略也會收斂到最優值。python
\[ v^{T+1}(s) =max_{a} \sum_{s_{t+1}}p(s_{t+1}|s_t,a_t)[r_{a_t}^{s_{t+1}} + \gamma * v^T_{\pi}(s_{t+1})] \]git
再對收斂值函數算狀態-行動值函數,經過狀態-行動值函數尋找最好的那個策略。這個步驟和策略迭代同樣,屬於策略提高,不一樣的是,價值迭代只要計算一次就能拿到最好的策略。github
\[ q^T_{\pi}(s_t,a_t)=\sum_{s_{t+1}}p(s_{t+1}|s_t,a_t)[r_{a_t}^{s_{t+1}} + \gamma * v^T_{\pi}(s_{t+1})]\;\;\;\;\;\;(2) \]
\[ \pi^{T+1}(s) = argmax_aq^T_{\pi}(s,a)\;\;\;\;\;\;(3) \]算法
實現代碼:app
class ValueIteration(object): def value_iteration(self, agent, max_iter=-1): """ :param obj agent: 智能體 :param int max_iter: 最大迭代數 """ iteration = 0 while True: iteration += 1 # 保存算出的值函數 new_value_pi = np.zeros_like(agent.value_pi) for i in range(1, agent.s_len): value_sas = [] for j in range(0, agent.a_len): # 對每個狀態s和行動a,計算值函數 value_sa = np.dot(agent.p[j, i, :], agent.r + agent.gamma * agent.value_pi) value_sas.append(value_sa) # 從每一個行動中,選出最好的值函數 new_value_pi[i] = max(value_sas) # 先後2次值函數的變化小於一個閾值,結束 diff = np.sqrt(np.sum(np.power(agent.value_pi - new_value_pi, 2))) if diff < 1e-6: break else: agent.value_pi = new_value_pi if iteration == max_iter: break print('Iter {} rounds converge'.format(iteration)) for i in range(1, agent.s_len): for j in range(0, agent.a_len): # 計算收斂後值函數的狀態-行動值函數 agent.value_q[i, j] = np.dot(agent.p[j, i, :], agent.r + agent.gamma * agent.value_pi) # 取出最大的行動 max_act = np.argmax(agent.value_q[i, :]) agent.pi[i] = max_act
到如今爲止,咱們介紹完了強化學習中的兩個基本的最優策略算法。策略迭代和價值迭代。函數
但一個可悲的事實是,在不少實際問題中,咱們沒法獲得遊戲的全貌,也就是說,狀態轉移的信息\(P(s_{t+1}|s_t, a_t)\)沒法得到。學習
通常來講,咱們知曉狀態轉移機率的問題稱爲「基於模型」的問題(Model-based),將不知曉的稱爲「無模型」問題(Model-free)。後面咱們要繼續升級咱們的問題,模擬一個真人去玩遊戲,沒法知道全部遊戲的全貌。spa