Add trivial mutation

This commit is contained in:
Pascal Serrarens 2026-08-12 12:15:06 +02:00
parent 1f7c3ef7e8
commit 8cb6b979bf
2 changed files with 39 additions and 0 deletions

View File

@ -401,6 +401,21 @@ namespace NanoBrain {
}
}
public void GaussianAdditiveMutation(float sigma) {
foreach (Nucleus nucleus in this.nuclei) {
if (nucleus is Neuron neuron) {
foreach (Synapse synapse in neuron.synapses) {
if (synapse.trainable) {
synapse.GaussianAdditiveMutation(sigma);
//synapse.weight = (float)randomGenerator.NextDouble() * 2.0f - 1.0f;
Debug.Log($"{neuron.name}-{synapse.neuron.name} weight = {synapse.weight}");
}
}
}
}
}
#endregion Init
#region Cluster Array

View File

@ -110,6 +110,30 @@ namespace NanoBrain {
// Check if the angle between the vectors is > 90 degrees
return Vector3.Dot(a, b) < 0f;
}
public void GaussianAdditiveMutation(float sigma) {
if (this.trainable == false)
return;
float deltaWeight = NormalDistribution.Sample(sigma);
this.weight += deltaWeight;
}
}
public static class NormalDistribution {
private static readonly System.Random rng = new();
// Returns a single sample from N(0, sigma^2)
public static float Sample(float sigma) {
// u1 must be > 0 to avoid log(0)
float u1 = 1.0f - (float)rng.NextDouble(); // in (0,1]
float u2 = (float) rng.NextDouble(); // in [0,1)
float stdNormal =
Mathf.Sqrt(-2.0f * Mathf.Log(u1)) * Mathf.Cos(2.0f * Mathf.PI * u2);
return sigma * stdNormal;
}
}
[Serializable]