コード例 #1
0
             explorer=explorer,
             replay_start_size=500,
             update_interval=1,
             target_update_interval=100,
             phi=phi)

#エピソード(試行)の数
n_episodes = 2000
#1時間ステップに行う試行数
max_episode_len = 200

#====学習フェーズ====
for i in range(1, n_episodes + 1):
    env.reset()
    obs, reward, done, _ = env.step(env.action_space.sample())
    R = 0  # return (sum of rewards)
    t = 0  # time step
    #1時間ステップに最大200回Q関数を試行する。
    #もし、倒れたらそのステップは終了
    #doneは終了判定
    while not done and t < max_episode_len:
        #action=0or1
        env.render()
        action = agent.act_and_train(obs, reward)
        obs, reward, done, _ = env.step(action)
        R += reward
        t += 1
    if i % 10 == 0:
        print('episode:', i, 'R:', R, 'statistics:', agent.get_statistics())
agent.stop_episode_and_train(obs, reward, done)
env.close()
コード例 #2
0
def main():

    # 強化学習のパラメータ
    gamma = 0.995
    num_episodes = 100  #総試行回数

    # DDPGセットアップ
    q_func = QFunction()  # Q関数
    policy = PolicyNetwork()  # ポリシーネットワーク
    model = DDPGModel(q_func=q_func, policy=policy)
    optimizer_p = chainer.optimizers.Adam(alpha=1e-4)
    optimizer_q = chainer.optimizers.Adam(alpha=1e-3)
    optimizer_p.setup(model['policy'])
    optimizer_q.setup(model['q_function'])

    explorer = chainerrl.explorers.AdditiveOU(sigma=1.0)  # sigmaで付与するノイズの強さを設定
    replay_buffer = chainerrl.replay_buffer.ReplayBuffer(capacity=10**6)
    phi = lambda x: x.astype(np.float32, copy=False)

    agent = DDPG(model,
                 optimizer_p,
                 optimizer_q,
                 replay_buffer,
                 gamma=gamma,
                 explorer=explorer,
                 replay_start_size=1000,
                 target_update_method='soft',
                 target_update_interval=1,
                 update_interval=4,
                 soft_update_tau=0.01,
                 n_times_update=1,
                 phi=phi,
                 gpu=-1,
                 minibatch_size=200)

    def reward_filter(r):  # 報酬値を小さくする(0〜1の範囲になるようにする)
        return r * 0.01

    outdir = 'result'
    chainerrl.misc.set_random_seed(0)
    env = gym.make('SpaceInvaders-v0')  #スペースインベーダーの環境呼び出し
    env.seed(0)
    chainerrl.misc.env_modifiers.make_reward_filtered(env, reward_filter)
    env = gym.wrappers.Monitor(env, outdir)  # 動画を保存

    # エピソードの試行&強化学習スタート
    for episode in range(1, num_episodes + 1):  #試行数分繰り返す
        done = False
        reward = 0
        n_steps = 0
        total_reward = 0
        obs = env.reset()
        obs = np.asarray(obs.transpose(2, 0, 1), dtype=np.float32)
        while not done:
            action = agent.act_and_train(obs, reward)  # actionは連続値
            action = F.argmax(action).data  # 出力値が最大の行動を選択
            obs, reward, done, info = env.step(action)  # actionを実行
            total_reward += reward
            n_steps += 1
            obs = np.asarray(obs.transpose(2, 0, 1), dtype=np.float32)
            print('{0:4d}: action {1}, reward {2}, done? {3}, {4}'.format(
                n_steps, action, reward, done, info))
        agent.stop_episode_and_train(obs, reward, done)
        print('Episode {0:4d}: total reward {1}, n_steps {2}, statistics: {3}'.
              format(episode, total_reward, n_steps, agent.get_statistics()))
        if episode % 10 == 0:
            agent.save('agent_DDPG_spaceinvaders_' + str(episode))