/*
  Copyright 2012 by James McDermott
  Licensed under the Academic Free License version 3.0
  See the file "LICENSE" for more information
*/


package ec.app.ordertree;
import ec.app.ordertree.func.*;
import ec.util.*;
import ec.*;
import ec.gp.*;
import ec.gp.koza.*;
import ec.simple.*;
import java.io.*;
import javax.imageio.stream.*;

/*
 * OrderTree.java
 *
 */

/**
 * OrderTree implements the OrderTree problem of Hoang et al. See the
 * README.txt.  Note that although this is a tunable problem, tuning
 * is achieved by setting the function and terminal sets. No need for
 * a size parameter.
 *
 

Parameters

base.data
classname, inherits or == ec.app.ordertree.OrderTreeData
(the class for the prototypical GPData object for the OrderTree problem)
base.contribution-type
Integer specifying the amount of nonlinearity in fitness contributions 0: add unit; 1: add node value; 2: add node value squared; 3: add 3^node value

Parameter bases

base.data species (the GPData object)
* * @author James McDermott * @version 1.0 */ public class OrderTree extends GPProblem implements SimpleProblemForm { double fitness; static final String P_CONTRIBUTION_TYPE = "contribution-type"; final static int CONTRIBUTION_UNIT = 0; final static int CONTRIBUTION_VALUE = 1; final static int CONTRIBUTION_SQUARE = 2; final static int CONTRIBUTION_EXPONENTIAL = 3; int fitnessContributionType; public void setup(final EvolutionState state, final Parameter base) { // very important, remember this super.setup(state,base); fitnessContributionType = state.parameters.getInt(base.push(P_CONTRIBUTION_TYPE),null,1); if (fitnessContributionType < CONTRIBUTION_UNIT || fitnessContributionType > CONTRIBUTION_EXPONENTIAL) state.output.fatal("Fitness Contribution Type must be an integer greater than 0 and less th an 4", base.push(P_CONTRIBUTION_TYPE)); state.output.exitIfErrors(); } public void evaluate(final EvolutionState state, final Individual ind, final int subpopulation, final int threadnum) { if (!ind.evaluated) // don't bother reevaluating { // trees[0].child is the root fitness = 0.0; nodeCal(((GPIndividual) ind).trees[0].child, state); SimpleFitness f = ((SimpleFitness) ind.fitness); f.setFitness(state, fitness, false); ind.evaluated = true; } } double fitnessContribution(double value, EvolutionState state) { switch (fitnessContributionType) { case CONTRIBUTION_UNIT: return 1.0; case CONTRIBUTION_VALUE: return value; case CONTRIBUTION_SQUARE: return value * value; case CONTRIBUTION_EXPONENTIAL: return Math.pow(3.0, value); default: state.output.fatal("Unexpected fitness contribution type."); return -1.0; } } void nodeCal(GPNode p, EvolutionState state) { int pval = ((OrderTreeNode) p).value(); for (int i = 0; i < p.children.length; i++) { GPNode c = p.children[i]; int cval = ((OrderTreeNode) c).value(); if (pval < cval) { // direct fitness contribution fitness += fitnessContribution(cval, state); nodeCal(c, state); } else if (pval == cval) { // neutral-left-walk boolean found = false; while (c.children.length > 0 && cval == pval && !found) { c = c.children[0]; cval = ((OrderTreeNode) c).value(); if (pval < cval) { found = true; } } if (found) { fitness += fitnessContribution(cval, state); nodeCal(c, state); } } } return; } }

Ads help maintain this website.