gym-super-mario-bros 1-1を1歩ずつ5歩先のrewardを計算してクリアする

前回の続きです。 akiyah.hatenablog.com

backupした状態までresetで戻れるようになったので、それを使ってマリオの1-1をクリアしてみました。

行動は「走る(["right", "B"])」か「走りながらジャンプ(["right", "B", "A"])」の2通りです。5歩先までマリオを進めて、その時のrewardを記録し、resetして戻ります。25=32パターンのうちで一番大きいrewardに繋がる1歩目を採用して進み、そこでbackupします。

複数パターンに分裂するマリオのイメージ

この手順をゴールするかゲームオーバーまで繰り返します。20分ほどの計算で、見事ゴールしてくれました!

1-1をゴールするマリオ

「走る」と「走りながらジャンプ」のうち、「走る」の方を優先しているロジックになっているからか、低いジャンプで進んでいることがわかりますね。

Google Colaboratoryも貼っておきます。 colab.research.google.com

ちなみに、1歩=4フレームです。1フレームごとに操作できるので、1フレームごとに次の行動を計算してもいいのですが、計算が多くなるので1歩=4フレームくらいが良さそうです。

クリアした後にソースコードを少し変更したりして試してみたのですが、どうもこのクリアは偶然らしくて、ちょっといじるとゴールできなかったりします。どう操作しても5歩先でゲームオーバーになってしまうような状況におちいってしまうことがあるようです。ジャンプしてしまって10歩先くらいでガケに落ちるような。(行動が「走る」か「走りながらジャンプ」だけでやっているのでブレーキとかかけられないんですよね)

5歩先ではなく10歩先、あるいはもっと先までを計算対象にしたらいいのでしょうが、そうすると計算量が爆発的に増えてしまうので、何かいい方法がないか考えてみようと思っています。