/**
  * @param a_population the population of chromosomes from the current evolution prior to exposure
  *     to any genetic operators. Chromosomes in this array should not be modified. Please, notice,
  *     that the call in Genotype.evolve() to the implementations of GeneticOperator overgoes this
  *     due to performance issues
  * @param a_candidateChromosomes the pool of chromosomes that have been selected for the next
  *     evolved population
  * @author Audrius Meskauskas
  * @author Klaus Meffert
  * @since 3.3.2
  */
 public void operate(final Population a_population, List a_candidateChromosomes) {
   // this was a private variable, now it is local reference.
   final IUniversalRateCalculator m_mutationRateCalc = getMutationRateCalc();
   // If the mutation rate is set to zero and dynamic mutation rate is
   // disabled, then we don't perform any mutation.
   // ----------------------------------------------------------------
   if (getMutationRate() == 0 && m_mutationRateCalc == null) {
     return;
   }
   // Determine the mutation rate. If dynamic rate is enabled, then
   // calculate it based upon the number of genes in the chromosome.
   // Otherwise, go with the mutation rate set upon construction.
   // --------------------------------------------------------------
   int currentRate;
   if (m_mutationRateCalc != null) {
     currentRate = m_mutationRateCalc.calculateCurrentRate();
   } else {
     currentRate = getMutationRate();
   }
   RandomGenerator generator = getConfiguration().getRandomGenerator();
   // It would be inefficient to create copies of each Chromosome just
   // to decide whether to mutate them. Instead, we only make a copy
   // once we've positively decided to perform a mutation.
   // ----------------------------------------------------------------
   int size = a_population.size();
   for (int i = 0; i < size; i++) {
     IChromosome x = a_population.getChromosome(i);
     // This returns null if not mutated:
     IChromosome xm = operate(x, currentRate, generator);
     if (xm != null) {
       a_candidateChromosomes.add(xm);
     }
   }
 }
 /**
  * Marshall a Genotype instance into an XML Element representation, including its population of
  * Chromosome instances as sub-elements. This may be useful in scenarios where representation as
  * an entire Document is undesirable, such as when the representation of this Genotype is to be
  * combined with other elements in a single Document.
  *
  * @param a_subject the genotype to represent as an XML element
  * @param a_xmlDocument a Document instance that will be used to create the Element instance. Note
  *     that the element will NOT be added to the document by this method
  * @return an Element object representing the given Genotype
  * @author Neil Rotstan
  * @since 1.0
  * @deprecated use XMLDocumentBuilder instead
  */
 public static Element representGenotypeAsElement(
     final Genotype a_subject, final Document a_xmlDocument) {
   Population population = a_subject.getPopulation();
   // Start by creating the genotype element and its size attribute,
   // which represents the number of chromosomes present in the
   // genotype.
   // --------------------------------------------------------------
   Element genotypeTag = a_xmlDocument.createElement(GENOTYPE_TAG);
   genotypeTag.setAttribute(SIZE_ATTRIBUTE, Integer.toString(population.size()));
   // Next, add nested elements for each of the chromosomes in the
   // genotype.
   // ------------------------------------------------------------
   for (int i = 0; i < population.size(); i++) {
     Element chromosomeElement =
         representChromosomeAsElement(population.getChromosome(i), a_xmlDocument);
     genotypeTag.appendChild(chromosomeElement);
   }
   return genotypeTag;
 }
  public boolean needsToRun(Run run, int generation) {
    Population pop = getPopulationFor(run, generation);
    int count = run.getIntProperty(GenetikConstants.POPULATION, Integer.MAX_VALUE, true);
    int scoreCount = 0;

    for (int i = 0, max = pop.size(); i < max; i++) {
      Individual ind = pop.get(i);

      if (ind.hasFitness() && ind.hasScores()) {
        scoreCount++;
      }
    }

    return scoreCount != count;
  }