fix(gamecli): wrap angle in reward to prevent unbounded spin penalty
This commit is contained in:
@@ -3,8 +3,10 @@ namespace GameCli;
|
||||
/// <summary>
|
||||
/// Reward = -distance_to_target
|
||||
/// - λ_v · speed
|
||||
/// - λ_θ · |angle|
|
||||
/// - λ_θ · |wrap(angle)|
|
||||
/// - λ_fuel · engine_on
|
||||
/// The angle is wrapped to [-π, π] so a ship that has completed N revolutions
|
||||
/// gets the same upright-penalty as a physically identical pose that hasn't.
|
||||
/// Coefficients are public so training scripts can log/inspect them.
|
||||
/// </summary>
|
||||
public static class Reward
|
||||
@@ -19,11 +21,12 @@ public static class Reward
|
||||
float dy = target.Y - s.Y;
|
||||
float distance = MathF.Sqrt(dx * dx + dy * dy);
|
||||
float speed = MathF.Sqrt(s.VX * s.VX + s.VY * s.VY);
|
||||
float wrapped = MathF.Atan2(MathF.Sin(s.Angle), MathF.Cos(s.Angle));
|
||||
float engineOn = action == Physics.ActionNoop ? 0f : 1f;
|
||||
|
||||
return -distance
|
||||
- LambdaVelocity * speed
|
||||
- LambdaAngle * MathF.Abs(s.Angle)
|
||||
- LambdaAngle * MathF.Abs(wrapped)
|
||||
- LambdaFuel * engineOn;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user