docs: @Override
      public CrossoverResult crossover() {
          // select the parents
          double[][] parents = parentSelection.selectParents();
  
          double[] resultGenes = parents[0];
          boolean isModified = false;
  
          if (rng.nextDouble() < crossoverRate) {
              // Crossover
              resultGenes = new double[parents[0].length];
  
              for (int i = 0; i < resultGenes.length; ++i) {
                  resultGenes[i] = ((rng.nextDouble() < parentBiasFactor) ? parents[0] : parents[1])[i];
              }
              isModified = true;
          }
  
          return new CrossoverResult(isModified, resultGenes);
      }