private long[][] selection() { switch (SelectionType) { case SelectionType.PROPORTIONAL: { long[] f = new long[this.IndividualCount]; long fSum = 0; for (int i = 0; i < this.IndividualCount; i++) { f[i] = _fitnessFunction.run(_parentPopulation[i]); fSum += f[i]; } double[] fDeals = new double[IndividualCount]; double[] fN = new double[IndividualCount]; int[] numberOfIndividual = new int[IndividualCount]; int secondaryArraySize = 0; for (int i = 0; i < this.IndividualCount; i++) { fDeals[i] = f[i] / fSum; fN[i] = fDeals[i] * IndividualCount; numberOfIndividual[i] = (int)Math.Floor(fN[i]); double randomValue = random.NextDouble(); if (randomValue <= fN[i] - numberOfIndividual[i]) { numberOfIndividual[i]++; } secondaryArraySize += numberOfIndividual[i]; } long[][] secondaryArray = new long[secondaryArraySize][]; int k = 0; for (int i = 0; i < IndividualCount; i++) { for (int j = 0; j < numberOfIndividual[i]; j++) { secondaryArray[k] = _parentPopulation[i]; k++; } } return(secondaryArray); } case SelectionType.TOURNEY: { for (int i = 0; i < this.IndividualCount; i++) { int index1 = random.Next(IndividualCount); int index2 = random.Next(IndividualCount); //long ffTime = System.currentTimeMillis(); // time long fr1 = this.getFitnessFunctionResult(index1); long fr2 = this.getFitnessFunctionResult(index2); //this.timeToFF += (System.currentTimeMillis() - ffTime); // time this._childPopulation[i] = fr1 > fr2 ? (long[])this._parentPopulation[index1].Clone() : (long[])this._parentPopulation[index2].Clone(); } break; } default: throw new NotImplementedException(); } }