強化學習-價值迭代代碼實現

1. 前言

上一篇博客咱們介紹了價值迭代的原理。這一節咱們實現強化學習裏面的價值迭代的部分代碼(完整代碼GitHub)。html

2. 價值迭代回顧

咱們把注意點放在值函數上,等值函數收斂了,咱們的策略也會收斂到最優值。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

3. 總結

到如今爲止,咱們介紹完了強化學習中的兩個基本的最優策略算法。策略迭代和價值迭代。函數

但一個可悲的事實是,在不少實際問題中,咱們沒法獲得遊戲的全貌,也就是說,狀態轉移的信息\(P(s_{t+1}|s_t, a_t)\)沒法得到。學習

通常來講,咱們知曉狀態轉移機率的問題稱爲「基於模型」的問題(Model-based),將不知曉的稱爲「無模型」問題(Model-free)。後面咱們要繼續升級咱們的問題,模擬一個真人去玩遊戲,沒法知道全部遊戲的全貌。spa

相關文章
相關標籤/搜索