예제 #1
0
 public NeatGenome(NeatGenome copyFromGenome, bool init = false)
 {
     nodeGenes       = new NodeGeneSequence();
     connectionGenes = new ConnectionGeneSequence();
     foreach (NodeGene gene in copyFromGenome.nodeGenes)
     {
         if (gene.type == NodeType.Sensor)
         {
             nodeGenes.Add(new SensorNodeGene(((SensorNodeGene)gene)));
         }
         else if (gene.type == NodeType.Hidden)
         {
             nodeGenes.Add(new HiddenNodeGene(((HiddenNodeGene)gene)));
         }
         else if (gene.type == NodeType.Output)
         {
             nodeGenes.Add(new OutputNodeGene(((OutputNodeGene)gene)));
         }
     }
     foreach (ConnectionGene gene in copyFromGenome.connectionGenes)
     {
         if (init)
         {
             connectionGenes.Add(new ConnectionGene(gene, newWeight: true));
         }
         else
         {
             connectionGenes.Add(new ConnectionGene(gene));
         }
     }
     hasMutated = false;
 }
예제 #2
0
 private static void HandleExcessGenes(ConnectionGeneSequence connsLong, List <int> InvolvedNodes, int geneIndex, NeatGenome childGenome)
 {
     for (int i = geneIndex; i < connsLong.Count; i++)
     {
         InvolvedNodes = AddInvolvedConnNodes(InvolvedNodes, connsLong[i]);
         childGenome.connectionGenes.Add(connsLong[i]);
     }
 }
예제 #3
0
 public static bool Contains(this ConnectionGeneSequence connGenes, int fromID, int toID)
 {
     foreach (var gene in connGenes)
     {
         if (gene.fromNodeID == fromID && gene.toNodeID == toID)
         {
             return(true);
         }
     }
     return(false);
 }
예제 #4
0
 private static List <int> AddExcessGenes(NeatGenome childGenome, ConnectionGeneSequence conns1, ConnectionGeneSequence conns2, List <int> InvolvedNodes, int geneIndex)
 {
     if (geneIndex == conns1.Count)
     {
         HandleExcessGenes(conns2, InvolvedNodes, geneIndex, childGenome);
     }
     else if (geneIndex == conns2.Count)
     {
         HandleExcessGenes(conns1, InvolvedNodes, geneIndex, childGenome);
     }
     else
     {
         throw new Exception("genIndex did not catch up to either parent genome!");
     }
     return(InvolvedNodes);
 }
예제 #5
0
        private void SetupConnections(ConnectionGeneSequence connectionGenes)
        {
            foreach (ConnectionGene gene in connectionGenes)
            {
                if (gene.isEnabled)
                {
                    bool contains = hiddenNodes.ContainsKey(gene.toNodeID);
                    var  toDict   = contains ? hiddenNodes : outputNodes;
                    var  toNode   = toDict[gene.toNodeID];
                    toNode.AddInputConnection(gene.fromNodeID, gene.connectionWeight);

                    if (inputNodes.ContainsKey(gene.fromNodeID))
                    {
                        inputNodes[gene.fromNodeID].AddOutConnection(toDict[gene.toNodeID]);
                    }

                    else if (hiddenNodes.ContainsKey(gene.fromNodeID))
                    {
                        ((InternalNetworkNode)hiddenNodes[gene.fromNodeID]).AddOutConnection(toDict[gene.toNodeID]);
                    }
                }
            }
        }
예제 #6
0
        private static List <int> HandleMatchingAndDisjointConnectionGenes(NeatGenome childGenome, NeatGenome mostFitGenome, ConnectionGeneSequence conns1, ConnectionGeneSequence conns2, bool equalFitness, List <int> InvolvedNodes, int geneIndex)
        {
            ConnectionGene gene1, gene2;

            gene1 = conns1[geneIndex];
            gene2 = conns2[geneIndex];
            bool equalID = gene1.geneID == gene2.geneID;

            if (equalID)
            {
                var gene = Neat.random.NextBoolean() ? gene1 : gene2;
                InvolvedNodes = AddInvolvedConnNodes(InvolvedNodes, gene);
                childGenome.connectionGenes.Add(gene);
            }
            else
            {
                if (equalFitness)
                {
                    var gene = Neat.random.NextBoolean() ? gene1 : gene2;
                    InvolvedNodes = AddInvolvedConnNodes(InvolvedNodes, gene);
                    childGenome.connectionGenes.Add(gene);
                }
                else
                {
                    var gene = mostFitGenome.connectionGenes[geneIndex];
                    InvolvedNodes = AddInvolvedConnNodes(InvolvedNodes, gene);
                    childGenome.connectionGenes.Add(gene);
                }
            }
            InvolvedNodes.Sort();
            return(InvolvedNodes);
        }
예제 #7
0
 public NeatGenome()
 {
     nodeGenes       = new NodeGeneSequence();
     connectionGenes = new ConnectionGeneSequence();
     hasMutated      = false;
 }