fix(gamecli): wrap angle in reward to prevent unbounded spin penalty
This commit is contained in:
@@ -53,4 +53,19 @@ public class RewardTests
|
||||
Assert.True(rMain < rNoop, "firing main should be worse than noop");
|
||||
Assert.True(rLeft < rNoop, "firing left should be worse than noop");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AngleWrap_FullRevolutionsProduceSameReward()
|
||||
{
|
||||
// Physically identical poses (angle differs by 2π) must produce the same reward.
|
||||
// Otherwise a spinning ship accumulates unbounded angle penalty.
|
||||
var upright = new ShipState(0.5f, 0.5f, 0f, 0f, 0f, 0f);
|
||||
var oneSpin = new ShipState(0.5f, 0.5f, 0f, 0f, 2f * MathF.PI, 0f);
|
||||
var fiveSpins = new ShipState(0.5f, 0.5f, 0f, 0f, 10f * MathF.PI, 0f);
|
||||
float r0 = Reward.Compute(upright, target: (0.5f, 0.5f), action: 0);
|
||||
float r1 = Reward.Compute(oneSpin, target: (0.5f, 0.5f), action: 0);
|
||||
float r5 = Reward.Compute(fiveSpins, target: (0.5f, 0.5f), action: 0);
|
||||
Assert.Equal(r0, r1, precision: 4);
|
||||
Assert.Equal(r0, r5, precision: 4);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user