Я только что закончил тетрис ТД, который создает в игре 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