遺伝的アルゴリズムでスーパーマリオをクリアする


vcoptを使用した遺伝的アルゴリズムによるスーパーマリオの学習については
https://vigne-cla.com/9-3/
に記載されており、ここから学習したときのログを残す。

ここでエラーを回避するため、上記サイトのコードを以下のように変更している。

from nes_py.wrappers import BinarySpaceToDiscreteSpaceEnv

from nes_py.wrappers import JoypadSpace

env = BinarySpaceToDiscreteSpaceEnv(env, SIMPLE_MOVEMENT)

env = JoypadSpace(env, SIMPLE_MOVEMENT)

!pip install gym-super-mario-bros
!pip install vcopt

#マリオ関連のimport
from nes_py.wrappers import JoypadSpace
import gym_super_mario_bros
from gym_super_mario_bros.actions import SIMPLE_MOVEMENT
env = gym_super_mario_bros.make('SuperMarioBros-1-1-v0')
env = JoypadSpace(env, SIMPLE_MOVEMENT)

#プロット関連のimport
import matplotlib.pyplot as plt
from matplotlib import animation, rc

#vcopt関連のimport
import numpy as np
import numpy.random as nr
from vcopt import vcopt

#ゲーム環境のリセット
env.reset()

#動画の準備
fig = plt.figure()
ims = []

#繰り返し操作してimsに追加
for i in range(1000):
    #0:
    #1:→
    #2:→+ジャンプ
    #3:→→
    #4:→→+ジャンプ
    #5:ジャンプ
    #6:←
    command = nr.randint(1, 7)
    state, reward, done, info = env.step(command)

    #imsに追加
    im = plt.imshow(env.render(mode='rgb_array'))
    ims.append([im])

    if done == True:
        break


#imsを表示
ani = animation.ArtistAnimation(fig, ims, interval=15, blit=True)
rc('animation', html='jshtml')
ani

#保存用
#ani.save('mario.gif', writer='imagemagick')
#ani.save('mario.mp4', writer="ffmpeg")

上記でアニメーションが確認できます。

  • env = gym_super_mario_bros.make('SuperMarioBros-1-1-v0') でどのステージか設定できる。
  • for i in range(1000): の数字で試行回数が設定できる。

(記事作成中)