HalfAndHalf.java

package progen.kernel.tree;

import progen.context.MalformedPercentSuboptionException;
import progen.context.ProGenContext;
import progen.kernel.grammar.Grammar;

/**
 * Clase que implementa la forma más común de inicialización de los árboles en
 * programación genética, que es una mezcla de inicialización Full y Grow, de
 * forma que se elegirá un método u otro en función de la probabilidad
 * especificada en la propiedad 'progen.population.init-mode'
 * 
 * @author jirsis
 * 
 * @see progen.kernel.tree.Full
 * @see progen.kernel.tree.Grow
 * 
 * @since 2.0
 */
public class HalfAndHalf implements InitializeTreeMethod {
  private static final double DEFAULT_PROBABILITY = 0.5;
  private static final String PROGEN_POPULATION_INIT_MODE_PROPERTY = "progen.population.init-mode";
  private static final long serialVersionUID = 1140024727404110598L;
  /** Inicializador tipo Full */
  private InitializeTreeMethod full;
  /** Inicializador tipo Grow */
  private InitializeTreeMethod grow;
  /** Probabilidad de usar el inicializador Full */
  private double percentFull;

  /**
   * Constructor genérico de la clase, en la que se inicializan las
   * probabilidades de uso de los inicializadores y se comprueba que sumen 100%
   * En caso de no haber definido las probabilidades particulares de alguno de
   * los inicializadores, se asumirá que la probabilidad de los dos es del 50%.
   */
  public HalfAndHalf() {
    full = new Full();
    grow = new Grow();
    percentFull = ProGenContext.getSuboptionPercent(PROGEN_POPULATION_INIT_MODE_PROPERTY, "full", DEFAULT_PROBABILITY);
    final double percentGrow = ProGenContext.getSuboptionPercent(PROGEN_POPULATION_INIT_MODE_PROPERTY, "grow", DEFAULT_PROBABILITY);
    if (percentFull + percentGrow != 1) {
      throw new MalformedPercentSuboptionException(PROGEN_POPULATION_INIT_MODE_PROPERTY);
    }
  }

  @Override
  public void generate(Grammar grammar, Node root) {
    if (Math.random() >= percentFull) {
      full.generate(grammar, root);
    } else {
      grow.generate(grammar, root);
    }
  }

  @Override
  public void updateMaximunDepth() {
    full.updateMaximunDepth();
    grow.updateMaximunDepth();
  }

  @Override
  public void updateMaximunNodes() {
    full.updateMaximunNodes();
    grow.updateMaximunNodes();
  }

  @Override
  public void updateMinimunDepth() {
    full.updateMinimunDepth();
    full.updateMinimunDepth();
  }
}