CI / build-test (push) Successful in 1m28s
A small AI helper computing how well a value matches a preferred optimum: a Gaussian bell in [0,1], 1 at the optimum, e^-0.5 one tolerance away, over an arbitrary input scale (unlike ResponseCurve's monotonic [0,1] shaping). The building block for environment-suitability growth. Covered by tests. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
52 lines
1.3 KiB
C#
52 lines
1.3 KiB
C#
using MrGameEng.AI;
|
|
using Xunit;
|
|
|
|
namespace MrGameEng.AI.Tests;
|
|
|
|
public class SuitabilityTests
|
|
{
|
|
[Fact]
|
|
public void Gaussian_PeaksAtOptimum()
|
|
{
|
|
Assert.Equal(1f, Suitability.Gaussian(18f, optimum: 18f, tolerance: 5f), 5);
|
|
}
|
|
|
|
[Fact]
|
|
public void Gaussian_IsSymmetricAroundOptimum()
|
|
{
|
|
var below = Suitability.Gaussian(13f, optimum: 18f, tolerance: 5f);
|
|
var above = Suitability.Gaussian(23f, optimum: 18f, tolerance: 5f);
|
|
Assert.Equal(below, above, 5);
|
|
}
|
|
|
|
[Fact]
|
|
public void Gaussian_AtOneToleranceAway_IsAboutPoint607()
|
|
{
|
|
Assert.Equal(MathF.Exp(-0.5f), Suitability.Gaussian(23f, 18f, 5f), 5);
|
|
}
|
|
|
|
[Fact]
|
|
public void Gaussian_FallsOffWithDistance()
|
|
{
|
|
var near = Suitability.Gaussian(20f, 18f, 5f);
|
|
var far = Suitability.Gaussian(30f, 18f, 5f);
|
|
Assert.True(far < near && far > 0f);
|
|
}
|
|
|
|
[Fact]
|
|
public void Gaussian_StaysWithinUnitRange()
|
|
{
|
|
for (var v = -50f; v <= 50f; v += 1f)
|
|
{
|
|
Assert.InRange(Suitability.Gaussian(v, 0f, 7f), 0f, 1f);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Gaussian_NonPositiveTolerance_IsExactMatch()
|
|
{
|
|
Assert.Equal(1f, Suitability.Gaussian(5f, 5f, 0f));
|
|
Assert.Equal(0f, Suitability.Gaussian(6f, 5f, 0f));
|
|
}
|
|
}
|