protected void doCrossover(
      IChromosome firstMate,
      IChromosome secondMate,
      List a_candidateChromosomes,
      RandomGenerator generator) {
    Gene[] firstGenes = firstMate.getGenes();
    Gene[] secondGenes = secondMate.getGenes();
    int locus = generator.nextInt(firstGenes.length);
    // Swap the genes.
    // ---------------
    Gene gene1, gene11;
    Gene gene2, gene22;
    Integer firstAllele, firstAllele1;
    Integer secondAllele, secondAllele1;

    for (int j = locus; j < firstGenes.length; j++) {
      gene1 = firstGenes[j];
      gene2 = secondGenes[j];

      firstAllele = (Integer) gene1.getAllele();
      secondAllele = (Integer) gene2.getAllele();

      if (payload[firstAllele] != null && payload[secondAllele] != null) {
        if (!checkAlleles(firstMate, j, secondAllele)) gene1.setAllele(secondAllele);
        if (!checkAlleles(secondMate, j, firstAllele)) gene2.setAllele(firstAllele);
      }

      if (payload[firstAllele] == null && payload[secondAllele] == null) {

        if (payload[64 + firstAllele].getPair() != payload[64 + secondAllele].getPair()) continue;

        if (payload[64 + firstAllele].getPair() == 1) {
          if (!checkAlleles(firstMate, j, secondAllele)
              && !checkAlleles(secondMate, j, firstAllele)) {
            if (chkonepair(j) || chktwopair(j + 1)) {
              System.out.println("Crossover.. something wrong");
            }

            gene11 = firstGenes[j + 1];
            firstAllele1 = (Integer) gene11.getAllele();

            gene22 = secondGenes[j + 1];
            secondAllele1 = (Integer) gene22.getAllele();

            if (!checkAlleles(firstMate, j + 1, secondAllele1)) {
              gene1.setAllele(secondAllele);
              gene11.setAllele(secondAllele1);
            }

            if (!checkAlleles(secondMate, j + 1, firstAllele1)) {
              gene2.setAllele(firstAllele);
              gene22.setAllele(firstAllele1);
            }
          }
        } else if (payload[64 + firstAllele].getPair() == 2) {

          if (!checkAlleles(firstMate, j, secondAllele)
              && !checkAlleles(secondMate, j, firstAllele)) {

            gene11 = firstGenes[j - 1];
            firstAllele1 = (Integer) gene11.getAllele();

            gene22 = secondGenes[j - 1];
            secondAllele1 = (Integer) gene22.getAllele();

            if (!checkAlleles(firstMate, j - 1, secondAllele1)) {
              gene1.setAllele(secondAllele);
              gene11.setAllele(secondAllele1);
            }

            if (!checkAlleles(secondMate, j - 1, firstAllele1)) {
              gene2.setAllele(firstAllele);
              gene22.setAllele(firstAllele1);
            }
          }
        } else {
          System.out.println("...Invalid Configuration Exception...");
        }
      }
    }
    // Add the modified chromosomes to the candidate pool so that
    // they'll be considered for natural selection during the next
    // phase of evolution.
    // -----------------------------------------------------------
    a_candidateChromosomes.add(firstMate);
    a_candidateChromosomes.add(secondMate);
  }