Getting Started - 交通流の強化学習ツール highway-env
強化学習におけるOpenAI Gymを拡張させたツールに、交通流を扱うhighway-envがある。その解説ページにあるGetting Startedについて説明する。
以下は2023/2時点での情報である。
取り合えずGoogle Colabで動かす
Getting Startedとあるので簡単に動きそうに見えるが、残念ながら研究用ツールなのでそう簡単ではない。Google Colabで動かす場合、最初にツールのインストール作業が必要である。
##### 修正点、追加 !apt update !apt install xvfb !pip install pyvirtualdisplay !pip install highway-env !pip install gym-notebook-wrapper
上記の「修正点」は私がソースを修正した箇所である。このページに書いてあるソースは、上から順に実行すると2023/1時点のColabで動作するようになっている。
次に前処理を行う。
##### 修正点、追加 import highway_env from IPython import display from pyvirtualdisplay import Display import matplotlib.pyplot as plt d = Display() d.start()
最後にGetting Startedのソースを実行すると、車線の画像が表示される。車の位置は毎回変わる。envという変数が強化学習の実行環境を示す。highway-envは環境を作成するツールである。画像・動画作成はOpenAI Gymが持つ機能である。
import gym
from matplotlib import pyplot as plt
%matplotlib inline
env = gym.make('highway-v0')
env.reset()
for _ in range(3):
action = env.action_type.actions_indexes["IDLE"]
obs, reward, done, truncated, info = env.step(action)
env.render()
plt.imshow(env.render(mode="rgb_array"))
plt.show()
なお、Training an agentの項は実質的には別のサンプルなので、別のページで説明する
環境の中身を見る
envの中に環境の情報が記載されている。"highway-v0"以外にも様々な環境がhighway-envで構築できる。
import pprint
env = gym.make("highway-v0")
pprint.pprint(env.config)
{'action': {'type': 'DiscreteMetaAction'},
'centering_position': [0.3, 0.5],
'collision_reward': -1,
'controlled_vehicles': 1,
'duration': 40,
'ego_spacing': 2,
'high_speed_reward': 0.4,
'initial_lane_id': None,
'lane_change_reward': 0,
'lanes_count': 4,
'manual_control': False,
'normalize_reward': True,
'observation': {'type': 'Kinematics'},
'offroad_terminal': False,
'offscreen_rendering': False,
'other_vehicles_type': 'highway_env.vehicle.behavior.IDMVehicle',
'policy_frequency': 1,
'real_time_rendering': False,
'render_agent': True,
'reward_speed_range': [20, 30],
'right_lane_reward': 0.1,
'scaling': 5.5,
'screen_height': 150,
'screen_width': 600,
'show_trajectories': False,
'simulation_frequency': 15,
'vehicles_count': 50,
'vehicles_density': 1}
envの内容を変えると環境が変わる。
env.config["lanes_count"] = 2 env.reset() plt.imshow(env.render(mode="rgb_array")) plt.show()
画像の連続表示
OpenAI Gymは動画作成機能を持ち、実行結果の確認として重要である。しかし互換性などの問題でうまく動かない事が多い。一応画像を連続表示すれば動画的になるので、以下にその方法を記載しておく。これはGetting Startedにはない内容である。動画作成した場合と内容は同じだが、動画に比べると見にくく、結果ファイルも扱いにくい。
車の挙動はランダムになるようにしてある。何回か動かすと事故になるのが確認できる。
##### 修正点、追加、ランダム挙動
o = env.reset()
img = plt.imshow(env.render('rgb_array'))
for _ in range(5):
o, r, d, t, i = env.step(env.action_space.sample())
display.clear_output(wait=True)
img.set_data(env.render('rgb_array'))
plt.axis('off')
display.display(plt.gcf())
if d:
env.reset()
目次
Getting Started
AsaHP