Чтобы ознакомиться с обучением с подкреплением, я реализую базовый алгоритм RL для игры Flappy Bird . У меня все настроено, единственная проблема, с которой я сталкиваюсь - это реализация функции вознаграждения. Я хочу иметь возможность обрабатывать экран и узнавать, была ли набрана точка или птица погибла.
Обработка экрана выполняется с использованием mss и opencv, которая возвращает составной массив numpy . Затем функция вознаграждения должна назначить вознаграждение предоставленному массиву, но я понятия не имею, как это сделать.
Вот так выглядит одно обработанное изображение:

У меня была идея реализовать функцию вознаграждения: если фон перестанет двигаться, птица погибнет. И что если птица находится в промежутке между двумя трубами, агент набрал очко. Любые идеи о том, как я могу выразить это в NumPy расчетов?
def _calculate_reward(self, state):
""""
calculate the reward of the state. Flappy is dead when the screen has stopped moving, so when two consecutive frames
are equal. A point is scored when an obstacle is above flappy, and before it wasn't. An object is above Flappy when
there are two white pixels in the first 50 pixels on the first row.
:param state: np.array shape = (1, height, width, 4) - > four consecutive processed frames
:return reward: int representing the reward if a point is scored or if flappy has died.
"""
if np.sum((state[0,:,:,3] - state[0,:,:,2])) == 0 and np.sum((state[0,:,:,2] - state[0,:,:,1])) == 0:
print("flappy is dead")
return -1000
elif sum(state[0,0,:50,3]) == 510 and sum(state[0,0,:50,2]) == 510 and sum(state[0,0,:50,1]) != 510 and sum(state[0,0,:50,0]) != 510:
print("point!")
return 1000
else:
return 0