28 |
Pongと強化学習 (92) |
これだと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