Я создаю модель обучения с подкреплением (DQN) для бейсбольной игры Gameboy старой школы. Сосредоточившись сначала на нападении, когда агент находится в бите, агент должен выбрать между двумя простыми действиями - A (Размахивать битой) или Нет (Подождите) .
У меня возникли некоторые проблемы с внедрением; а именно, сама анимация свинга занимает много времени; может быть около 80-90 кадров или около того. Таким образом, если агент решает раскачать летучую мышь, он иногда продолжает пытаться размахивать летучей мышью снова (например, он выбирает A снова и снова) , в то время как летучая мышь все еще качается с первого A-нажатия. В настоящее время я делаю что-то вроде следующего для реализации пропуска кадра:
# Main loop
for e in range(episodes):
state = env.reset()
...
while True:
# Run agent
action = agent.run(state=state)
# 0 = SWING, 1 = WAIT
# If we have a frame-skip, force the action to be WAIT and decrement
if frame_skip != 0:
action = 1
frame_skip -= 1
# If the action is a swing, set the frame skip
if action = 0:
frame_skip = 90
# Perform action
next_state, reward, done, info = env.step(action=action)
...
Однако я беспокоюсь о том, что то, что я делаю, является нечетким и, вероятно, испортит модель. Фактически, действие, возвращаемое agent.run()
, которое использует модель DQN для выбора случайного действия или действия, основанного на политике, эффективно игнорируется, когда происходит пропуск кадра.
Есть ли способ обойти это?