見出し画像

Gymで強化学習⑪動的計画法:実装編

前回はGymの環境であるFrozen Lake(凍った湖)で動くランダムなエージェントと手動エージェントを作成しました。また状態遷移の確率によって最適なポリシーが変わってくることを解説しました。

今回は動的計画法であるポリシー反復法と価値反復法を実装します。

動的計画法エージェント

エージェントの全体像

動的計画法では環境における状態、報酬、状態遷移の確率がすべてわかっていることを前提としています。なので、経験から学ぶ必要がありません。

よって、エージェントを初期化する段階でポリシーが確定します。動的計画法は英語ではDynamic Programming(ダイナミック・プログラミング)なので以下のように定義しました。

class DynamicProgrammingAgent:
    def __init__(self, env, method, gamma, threshold):
        # エージェントの初期化
        self.env = env
        self.policy = dynamic_programming(env, method, gamma, threshold)

    def reset(self, observation, info):
        # 環境からの初期観測値を受け取る
        self.state = observation

    def act(self):
        # ポリシーから行動を取得
        action = self.policy[self.state]
        return action

    def learn(self, observation, reward, terminated, truncated, info):
        self.state = observation

エージェントの初期化のところでポリシーを計算しています。詳細は後述します。

    def __init__(self, env, method, gamma, threshold):
        # エージェントの初期化
        self.env = env
        self.policy = dynamic_programming(env, method, gamma, threshold)

また、観測値は凍った湖における位置を示す整数です。4x4 ならば0から15の値になります。この観測値によって得る報酬とエピソードが終了するかどうかが決まるので観測値をそのまま状態として使います。

https://gymnasium.farama.org/environments/toy_text/frozen_lake/

よってエージェントをリセットするときや観測値を与えられた際に値をキープしておきます。

    def reset(self, observation, info):
        # 環境からの初期観測値を受け取る
        self.state = observation

    ...

    def learn(self, observation, reward, terminated, truncated, info):
        self.state = observation

行動選択をする際には、ポリシーに状態を与えると取るべき行動が返されます。

    def act(self):
        # ポリシーから行動を取得
        action = self.policy[self.state]
        return action

全体的な処理の流れは以上になります。あとはポリシー反復法と価値反復法がどのように実装されているのかを見ていきましょう。

動的計画法の呼び出し

ここから先は

18,659字 / 33画像

キカベン・読み放題

¥1,000 / 月
初月無料
このメンバーシップの詳細

この記事が気に入ったらサポートをしてみませんか?