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()
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))