// ====== METHODS ================== //given two indiv A & B, this method will choose a random layer and a random neuron position in that layer and then do a crossover //by cuting A and B at this pos and mixing them together, and it will return a list containing the 2 mixed indivs public List<indiv> crossover(indiv A, indiv B) { int layer_num_Crossingover = rand.Next(1, A.getNbLayer()-1);//in the first layer all weigths are 1 and can't change so no need to crossover at this layer int Neuron_num_Crossingover = rand.Next(0, A.getNbNeuronAtLayer(layer_num_Crossingover)-1); List<Nn.Neuron> layer_CrossingoverA = new List<Nn.Neuron>(A.getLayer(layer_num_Crossingover).GetRange(0, Neuron_num_Crossingover)); layer_CrossingoverA.AddRange(B.getLayer(layer_num_Crossingover).GetRange(Neuron_num_Crossingover, B.getNbNeuronAtLayer(layer_num_Crossingover) - Neuron_num_Crossingover)); List<Nn.Neuron> layer_CrossingoverB = new List<Nn.Neuron>(B.getLayer(layer_num_Crossingover).GetRange(0, Neuron_num_Crossingover)); layer_CrossingoverB.AddRange(A.getLayer(layer_num_Crossingover).GetRange(Neuron_num_Crossingover, A.getNbNeuronAtLayer(layer_num_Crossingover) - Neuron_num_Crossingover)); List<List<Nn.Neuron>> NnA2 = new List<List<Nn.Neuron>>(A.getLayersRange(0, layer_num_Crossingover)); NnA2.Add(layer_CrossingoverA); NnA2.AddRange(B.getLayersRange(layer_num_Crossingover+1, B.getNbLayer())); List<List<Nn.Neuron>> NnB2 = new List<List<Nn.Neuron>>(B.getLayersRange(0, layer_num_Crossingover)); NnB2.Add(layer_CrossingoverB); NnB2.AddRange(A.getLayersRange(layer_num_Crossingover+1, A.getNbLayer())); indiv A2 = new indiv(NnA2); indiv B2 = new indiv(NnB2); List<indiv> newIndivs = new List<indiv>(); newIndivs.Add(A2); newIndivs.Add(B2); return newIndivs; }