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;
                    }
                }
            }
        }
Exemple #2
0
        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);
        }