Package ec.gp.koza

# Class HalfBuilder

java.lang.Object
ec.gp.GPNodeBuilder
ec.gp.koza.KozaBuilder
ec.gp.koza.HalfBuilder

All Implemented Interfaces:
  `Prototype`, `Setup`, `Serializable`, `Cloneable`

public class HalfBuilder extends KozaBuilder
HalfBuilder is a GPNodeBuilder which implements the RAMPED HALF-AND-HALF tree building method described in Koza I/II.

RAMPED HALF-AND-HALF works by choosing a random integer d between minDepth and maxDepth, inclusive. It then grows a tree of depth 1 to d inclusive. (1-pickGrowProbability) of the time (by default, 0.5) it grows a tree using the FULL method, which generates full trees of exactly depth d. (pickGrowProbability) of the time, it grows a tree using the GROW method, which may generate trees of any size between 1 and d inclusive.

Actually, claiming to implement the Koza I/II approach is a bit of a fib -- Koza's original code is somewhat ad-hoc. In the Koza approach, d is chosen in a kind of round-robin fashion rather than at random, if RAMPED HALF/HALF is used. Also, for all three algorithms (RAMPED HALF/HALF, GROW, FULL), the algorithm will not generate a tree consisting of a single terminal, unless forced to.

This implementation instead follows lil-gp's approach, which is to choose d at random from between minDepth and maxDepth, inclusive, and to allow trees consisting of single terminals.

Determining what various algorithms do is a little confusing, mostly because the source code for lil-gp and Koza don't actually quite do what they claim. The table below lists the depth values actually used (counting nodes, rather than edges, for depth). It's probably not what you had expected!

| Koza I Min | Koza I Max | Koza II Min | Koza II Max | lil-gp Min | lil-gp Max | ECJ Min | ECJ Max
GROW (mut) | 5 | 5 | 5 | 5 |  |  | 5 | 5
GROW (new) | 7 | 7 | 6? 7? | 6? 7? | 3 | 7 | 5 | 5
FULL (new) | 7 | 7 | 6? 7? | 6? 7? | 3 | 7 |  |
HALF (new) | 2 | 6 | 2 | 5? 6? | 3 | 7 | 2 | 6

The table cell is empty when that parameter is not defined by the system by default. Koza II has two values each because of a possible typo in the text -- while page 656 gives one maximum, page 671 gives another. Note the odd fact that in Koza I/II GROW and FULL have effectively one-deeper tree values than HALF does, even though they use the same code parameters! This is because of a quirk in Koza's code.

This algorithm ignores `requestedSize`, so no pipelines can ask it to grow a tree of a specific fixed size. The algorithm also ignores any user-provided size distributions.

Parameters

base.`growp` 0.0 <= double <= 1.0 | (the likelihood of choosing GROW (as opposed to FULL)>
base.`min-depth` int >= 1 | (smallest "maximum" depth the builder may use for building a tree. 2 is the default.)
base.`max-depth` int >= base.`min-depth` | (largest "maximum" depth the builder may use for building a tree. 6 is the default.)

Default Base
gp.koza.half

See Also:
  - Serialized Form

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `static final String`
  `P_HALFBUILDER`
  `static final String`
  `P_PICKGROWPROBABILITY`
  `double`
  `pickGrowProbability`
  The likelihood of using GROW over FULL.

  ### Fields inherited from class ec.gp.koza.KozaBuilder

  `maxDepth, minDepth, P_MAXDEPTH, P_MINDEPTH`

  ### Fields inherited from class ec.gp.GPNodeBuilder

  `CHECK_BOUNDARY, maxSize, minSize, NOSIZEGIVEN, P_MAXSIZE, P_MINSIZE, P_NUMSIZES, P_SIZE, sizeDistribution`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `HalfBuilder()`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `Parameter`
  `defaultBase()`
  Returns the default base for this prototype.
  `GPNode`
  `newRootedTree(EvolutionState state, GPType type, int thread, GPNodeParent parent, GPFunctionSet set, int argposition, int requestedSize)`
  `void`
  `setup(EvolutionState state, Parameter base)`
  Sets up the object by reading it from the parameters stored in state, built off of the parameter base base.

  ### Methods inherited from class ec.gp.koza.KozaBuilder

  `fullNode, growNode`

  ### Methods inherited from class ec.gp.GPNodeBuilder

  `canPick, clone, errorAboutNoNodeWithType, pickSize, warnAboutNonterminal, warnAboutNonTerminalWithType, warnAboutNoTerminalWithType`

  ### Methods inherited from class java.lang.Object

  `equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Field Details

  - ### P_HALFBUILDER

    public static final String P_HALFBUILDER
    See Also:
      - Constant Field Values

  - ### P_PICKGROWPROBABILITY

    public static final String P_PICKGROWPROBABILITY
    See Also:
      - Constant Field Values

  - ### pickGrowProbability

    public double pickGrowProbability
    The likelihood of using GROW over FULL.

- ## Constructor Details

  - ### HalfBuilder

    public HalfBuilder()

- ## Method Details

  - ### defaultBase

    public Parameter defaultBase()
    Description copied from interface: `Prototype`
    Returns the default base for this prototype. This should generally be implemented by building off of the static base() method on the DefaultsForm object for the prototype's package. This should be callable during setup(...).

  - ### setup

    public void setup(EvolutionState state, Parameter base)
    Description copied from interface: `Prototype`
    Sets up the object by reading it from the parameters stored in state, built off of the parameter base base. If an ancestor implements this method, be sure to call super.setup(state,base); before you do anything else.

    For prototypes, setup(...) is typically called once for the prototype instance; cloned instances do not receive the setup(...) call. setup(...) may be called more than once; the only guarantee is that it will get called at least once on an instance or some "parent" object from which it was ultimately cloned.

    Specified by:
      `setup` in interface `Prototype`
    Specified by:
      `setup` in interface `Setup`
    Overrides:
      `setup` in class `KozaBuilder`

  - ### newRootedTree

    public GPNode newRootedTree(EvolutionState state, GPType type, int thread, GPNodeParent parent, GPFunctionSet set, int argposition, int requestedSize)
    Specified by:
      `newRootedTree` in class `GPNodeBuilder`