colgreen / sharpneat

SharpNEAT - Evolution of Neural Networks. A C# .NET Framework.
https://sharpneat.sourceforge.io/
Other
372 stars 95 forks source link

New Mutation Type #35

Closed robertvo closed 5 years ago

robertvo commented 5 years ago

Hi Colin, I wrote a new mutation method that disconnects one input and reconnects it to another input. Works ok, but I'm getting "CorrelationResults failed integrity check" assertion error. What do I need to do?

    private void Mutate_ReconnectInputs()
    {

        NeuronGene new_source = _neuronGeneList[_genomeFactory.Rng.Next(_genomeFactory.InputNeuronCount)];

        //try to find source and target suitable for reconnecting 10 times max
        for (int i = 0; i < 10; i++) 
        {
            ConnectionGene con = _connectionGeneList[_genomeFactory.Rng.Next(_connectionGeneList.Count)];

            if (con.SourceNodeId < _genomeFactory.InputNeuronCount && con.SourceNodeId != new_source.Id)
            {
                NeuronGene old_source = _neuronGeneList.GetNeuronById(con.SourceNodeId);
                NeuronGene old_target = _neuronGeneList.GetNeuronById(con.TargetNodeId);

                if (old_target.SourceNeurons.Contains(new_source.Id)) continue;
                if (new_source.TargetNeurons.Contains(old_target.Id)) continue;

                old_source.TargetNeurons.Remove(old_target.Id);
                old_target.SourceNeurons.Remove(old_source.Id);

                new_source.TargetNeurons.Add(old_target.Id);
                old_target.SourceNeurons.Add(new_source.Id);

                con.IsMutated = true;
                con.SourceNodeId = new_source.Id;
                con.TargetNodeId = old_target.Id;

                break;
            }
        }

    }
robertvo commented 5 years ago

solved