Article #966

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.

Pongと強化学習 (92)

posted by sakurai on March 28, 2025 #966

これだと5, 6は移動と射撃が複合されており、移動だけにマイナスのペナルティをつけても射撃につけられたとAIが誤解してしまうので、分離したいのですが。


左右の移動にのみ極小のペナルティを適用するためには、カスタム環境のstepメソッド内で報酬にペナルティを加える処理を追加する必要があります。以下は、CustomSpaceInvadersクラスを修正して、左右の移動に小さなペナルティを適用する方法を示したコードです。

移動アクションへのペナルティの適用

    import gym
    from gym.spaces import MultiBinary
    import numpy as np
    
    class CustomSpaceInvaders(gym.Wrapper):
        def __init__(self, env):
            super(CustomSpaceInvaders, self).__init__(env)
            # アクションスペースを MultiBinary に設定
            # 3つのアクション: [左移動, 右移動, 射撃]
            self.action_space = MultiBinary(3)
            self.move_penalty = -0.01  # 左右移動のペナルティ
    
        def step(self, action):
            # マルチバイナリアクションを元の環境のアクションに変換
            original_action = 0
            if action[0] == 1:  # 左移動
                original_action = 3
            if action[1] == 1:  # 右移動
                original_action = 2
            if action[2] == 1:  # 射撃
                original_action = 1
            if action[0] == 1 and action[2] == 1:  # 左移動 + 射撃
                original_action = 5
            if action[1] == 1 and action[2] == 1:  # 右移動 + 射撃
                original_action = 4
            
            # 環境を進める
            obs, reward, done, info = self.env.step(original_action)
    
            # 左または右に移動した場合にペナルティを適用
            if action[0] == 1 or action[1] == 1:
                reward += self.move_penalty
    
            return obs, reward, done, info
    
    # オリジナルの環境をラップ
    env = gym.make('SpaceInvaders-v0')
    custom_env = CustomSpaceInvaders(env)
    
    # ゲームを開始
    obs = custom_env.reset()
    done = False
    while not done:
        # ランダムなアクションを生成
        action = custom_env.action_space.sample()
        obs, reward, done, info = custom_env.step(action)
        print(f"Action: {action}, Reward: {reward}")
    
    custom_env.close()

コードの解説

  • ペナルティの設定:クラス内にmove_penalty属性を追加し、その値を左右の移動に適用しています。この値は負の小さな数で、移動するたびに報酬から差し引かれます。
  • 報酬の調整:左または右に移動するアクションが選択された場合、rewardにペナルティを加算します(負の値を加算するため、実際には報酬が減少します)。

このようにして、エージェントは左右に移動する際に小さなコストがかかることを学習し、可能であれば移動を避ける戦略をとるようになるかもしれません。ただし、ペナルティの値をどの程度に設定するかは、タスクの性質や学習の目標に応じて慎重に選ぶ必要があります。


左矢前のブログ 次のブログ右矢

Leave a Comment

Your email address will not be published.

You may use Markdown syntax. If you include an ad such as http://, it will be invalidated by our AI system.

Please enter the numbers as they are shown in the image above.