тетрис AI улучшение скорости в python ноутбуке - PullRequest
0 голосов
/ 28 марта 2020

Я только что закончил тетрис ТД, который создает в игре 2 разных ИИ (1 руководствуется, а другой - мной). Все работает, но я хочу сравнить результаты с большим количеством игр и долгих игр, и это занимает так много времени! Я использовал линейный профилировщик, чтобы увидеть, какая часть кода отстает по времени, но именно тогда игра запускается (это двойное значение для l oop), например,

def play_tetris_better(params, horizon=1000, repeat=1, render=False):    
    # Initialization
    params = np.atleast_2d(params)
    batch  = params.shape[0]

    # Function to play the game
    def rollout(seed, w):
        policy = TetrisAI_better()
        tetris = TetrisEnv()
        tetris.seed(42+seed)
        score = 0
        for _ in range(repeat):
            state = tetris.reset()
            for _ in range(horizon):
                action = policy(state, w)
                state, reward, done = tetris.step(action)
                score += reward / repeat
                if render: tetris.render()  
                if done: break
        tetris.close()
        return score

    # Play several games in parallel
    n_jobs = 8
    scores = joblib.Parallel(n_jobs)(joblib.delayed(rollout)(i, w) for i, w in enumerate(params))

    return np.array(scores).squeeze()

params - это вес состояние функции подсчета содержит 2 объекта доски, представленных матрицей

Данный класс тетриса работает так, чтобы просто воспроизводить произвольную позицию:

env.reset()
for _ in range(100):
    env.render()
    action = np.random.randint(5)
    state, reward, done = env.step(action)
env.close()

Я не знаю, как улучшить эту функцию быть быстрее, когда мы ищем лучшие параметры методом кросс-энтропии. Я думал о том, чтобы избежать l oop с массивами numpy, но нам нужно последнее состояние значения, чтобы найти следующее, так что это невозможно, верно?

Любые советы? Все необходимые файлы находятся здесь: https://github.com/VasgoTheTotoroo/TetrisAI

...