public DoubleVectorIndividual createIndividual(
      final EvolutionState state, int subpop, int index, int thread) {
    Individual[] inds = state.population.subpops[subpop].individuals;

    DoubleVectorIndividual v =
        (DoubleVectorIndividual)
            (state.population.subpops[subpop].species.newIndividual(state, thread));
    int retry = -1;
    do {
      retry++;

      // select three indexes different from each other and from that of the current parent
      int r0, r1, r2;
      // do
      {
        r0 = bestSoFarIndex[subpop];
      }
      // while( r0 == index );
      do {
        r1 = state.random[thread].nextInt(inds.length);
      } while (r1 == r0 || r1 == index);
      do {
        r2 = state.random[thread].nextInt(inds.length);
      } while (r2 == r1 || r2 == r0 || r2 == index);

      DoubleVectorIndividual g0 = (DoubleVectorIndividual) (inds[r0]);
      DoubleVectorIndividual g1 = (DoubleVectorIndividual) (inds[r1]);
      DoubleVectorIndividual g2 = (DoubleVectorIndividual) (inds[r2]);

      for (int i = 0; i < v.genome.length; i++)
        v.genome[i] =
            g0.genome[i]
                + (F + state.random[thread].nextDouble() * F_NOISE - (F_NOISE / 2.0))
                    * (g1.genome[i] - g2.genome[i]);
    } while (!valid(v) && retry < retries);
    if (retry >= retries && !valid(v)) // we reached our maximum
    {
      // completely reset and be done with it
      v.reset(state, thread);
    }

    return crossover(state, (DoubleVectorIndividual) (inds[index]), v, thread);
  }
 /** Make a copy of the BitVectorIndividual. */
 public Object clone() {
   DoubleVectorIndividual tmp = (DoubleVectorIndividual) (super.clone());
   tmp.genome = (double[]) genome.clone();
   tmp.genome_size = genome_size;
   return tmp;
 }