背景
前回の続き。今回の結果に納得が行かない、、と一見思ったものの、データを個別に見て表現方法の検討が必要と思った、、
前提
前回の設定にちょっと条件を追加
6. 最善のポリシーを決める際に、進行方向を勘案せずに集計
(進行方向を勘案して表現しないと解釈しずらかった)
ポリシー反復法?
動的計画法で各セルの状態価値関数が求めた(つもり)
各セルで次の行動を決めるときに、どの方向が一番勝ちが高くなるか?を求めるのがポリシー反復法という理解で良い、、のか?
今の設定だと以下のような感じで環境を表現している
((x, y, 進行方向), 次のアクション)
進行方向を勘案してベストの次のアクションを求めるのが良いとは思うものの、表現が難しそうなのと、とりあえず結果を見てみたいので進行方向を考えずにベストの次のアクションを求めるようにした
def policy_update(air_space,gamma=0.99):
update=False
for s in air_space.states:
q_max = -10**10
a_best = None
for a in air_space.actions:
# いったん進行方向は考えずに処理を進める
results = air_space.move(s,a)
# print(results)
q = 0
# 確率により次の状態が変化することはないのでp=1で計算
r=results[0]
s_new=results[1]
p=1
q += p * (r + gamma * air_space.value[s_new])
if q > q_max:
q_max = q
a_best = a
if air_space.policy[(s,a_best)]!=1:
update=True
for a in air_space.actions:
air_space.policy[(s,a)] = 0
air_space.policy[(s,a_best)] = 1
print('a_best : ',a_best)
return update
表現のためにx,y単位でベストの次のアクションを求める(もっと要領の良い方法があるはず,,)
pre_result = np.zeros([air_space.size,air_space.size,6])
result=np.zeros([air_space.size,air_space.size])
for state_policy in air_space.policy:
pre_result[state_policy[0][0]][state_policy[0][1]][state_policy[1]]+=air_space.policy[(state_policy[0],state_policy[1])]
for x in range(9):
for y in range(9):
result[x][y] = max(pre_result[x][y])-1
結果
でた!が、直感と全く一致しない、、ほぼ全てのセルで南東に進むのがベストのアクションになっている、、なぜだ、、
個別のデータを見てみる
一番左下のセルで進行方向が北東のとき、ベストなアクションは北東
status: (-4,-4,0)
action:value
(0 : 1), 1 : 0, 2 : 0, 3 : 0, 4 : 0, 5 : 0
一番右上のセルで進行方向が南東のとき、ベストのアクションは南西
status: (4,4,2)
0 : 0, 1 : 0, 2 : 0, (3 : 1), 4 : 0, 5 : 0
個別に見ると直感と一致する。
進行方向ごとにベストのアクションを表示してみると概ね直観にあっている
このあと
前回の物に足したり引いたり
なぜこうなったのかもう少し考える、、(新)進行方向を考慮した表現もなんとかしたい(新)できればベストの方向を表示させたい- もっと強化学習っぽいアルゴリズムを試してみる(新規)
- サーマルエリアに4回以上滞空出来たらゴールとしたい(サーマルエリアを突っ切って出てしまわないように
- いつの日か実際の距離感に合わせてみたい
- そしてさらにいつの日か携帯デバイスとして飛びながらベストな方向を教えてくれるようにしたい
参考
引き続き同じ書籍をもとに色々試行錯誤
ITエンジニアのための強化学習理論入門
理論もコードも丁寧に解説されていて素敵