protected override void PerformMutation(IGraphChromosome graph, float probability) { if (RandomizationProvider.Current.GetDouble() >= probability) { return; } // No edges to add if (graph.EdgeCount == graph.VertexCount * graph.VertexCount) { return; } // Shuffle var allIDs = graph.Vertices.Select(v => v.ID); uint[] fromVerts = MutationService.Shuffle(allIDs, RandomizationProvider.Current).ToArray(); uint[] toVerts = MutationService.Shuffle(allIDs, RandomizationProvider.Current).ToArray(); // Find the first that does not exist foreach (var v1 in fromVerts) { foreach (var v2 in toVerts) { if (!graph.ContainsEdge(v1, v2)) { graph.AddEdge(v1, v2, graph.CreateNewEdge()); return; } } } }
public override double Evaluate(IBlackBox net) { if (net.InputCount != 2 || net.OutputCount != 1) { throw new IndexOutOfRangeException(); } var inputs = MutationService.Shuffle(Inputs, RandomizationProvider.Current); double error = 0; foreach (var ins in inputs) { net.Reset(); net.SetInputs(ins); net.Activate(3); double output = net.GetOutput(0); double expected = (ins[0] == ins[1]) ? 0 : 1; double diff = output - expected; error += (diff >= 0) ? diff : -diff; } return(4 - error); }