hi! Я только что сделал свою первую модель в стабильных Baselines3, используя Pygame в Python. Игра посвящена мячу, достигающему самой высокой платформы из трех, размещенных в небе. < /P>
Мне удалось заставить модель научиться туда добраться. Но затем, достигнув третьей платформы, она падает и остается на земле. Я хотел обучить новую модель, которая решила бы эту проблему, но, к моему удивлению, увеличивая Total_timesteps до 500_000, полностью не снят тест - мяч просто прыгает в одном месте, тогда как модель с гораздо меньшим количеством - 150_000 добралась до самой высокой платформы!
Почему это? Вот моя функция вызова < /p>
@edit
Я подумал, что иногда модель узнает, как туда добраться даже с меньшим количеством времени ~ = 15_000.
может быть это Из -за чистой удачи + энтропия?
И если да, то какие гиперпараметры/лучшая система вознаграждения я могу реализовать для мяча?
Это моя функция вознаграждения: < Br />
Код: Выделить всё
reward = -1 # Default reward
# Reward for moving towards the goal platform
dist_reward = int((1/self.goal_distance) * 10000)
reward += dist_reward
# Reward for being airborne
if self.y_acc != 0 and self.ball.player_pos.y < GROUND_Y:
reward += 10
# Reward for moving right/left
if self.x_velocity != 0 :
reward += 1
if (collision_plat0 is not None and collision_plat0["top"]):
# Negative reward for hitting the floor
reward -= 50
if(collision_plat1 is not None and collision_plat1["top"]):
# Reward for reaching the first platform
reward += 2
elif(collision_plat2 is not None and collision_plat2["top"]):
# Reward for reaching the second platform
reward += 3
elif(collision_plat3 is not None and collision_plat3["top"]):
# Reward for reaching the third platform
reward += 30000000
< /code>
есть код моего движения, если он может прийти полезным: < /p>
if action is not None:
# Handle movement
if action == 0: # Move left
self.ball.player_pos.x -= 5
self.x_velocity = -5
#reward = 0.001
elif action == 1: # Move right
self.ball.player_pos.x += 5
self.x_velocity = 5
#reward = 0.001
collision_top = False
for i, platform in enumerate(self.platforms):
collision = check_collision_ball_rect(self.ball, platform)
if collision:
if collision["top"]:
collision_top = True
self.y_acc = 0
if action == 2:
self.y_acc = 20
else:
self.ball.player_pos.y = platform.top - self.ball.radius
if collision["bottom"]:
self.ball.player_pos.y = platform.bottom + self.ball.radius
if collision["left"] and action == 1:
self.ball.player_pos.x = platform.left - self.ball.radius
self.x_velocity = 0
if collision["right"] and action == 0:
self.ball.player_pos.x = platform.right + self.ball.radius
self.x_velocity = 0
if self.y_acc > 0 or not collision_top:
self.y_acc -= 1
# Apply gravity
self.ball.player_pos.y += GRAVITY - self.y_acc
Подробнее здесь: https://stackoverflow.com/questions/794 ... model-fail