package ec.app.hiff; 

import ec.*; 
import ec.util.*; 
import ec.vector.*;
import ec.simple.*;

/** 
    HIFF implements the Hierarchical If-And-Only-If problem developed by Watson, Hornby and Pollack.
    See The HIFF Generator for more information
    and papers.

    

Parameters

base.p
int >= 0
(number of blocks at each level)
base.k
int >= 0
(number of hierarchical levels)
base.rc
double
(ratio of block contributions)
@author Keith Sullivan @version 1.0 */ public class HIFF extends Problem implements SimpleProblemForm { public static final String P_K = "k"; public static final String P_P = "p"; public static final String P_RC = "rc"; int K, P, Rc; public void setup(EvolutionState state, Parameter base) { super.setup(state, base); K = state.parameters.getInt(base.push(P_K), null, 0); if (K < 0) state.output.fatal("k must be > 0", base.push(P_K)); P = state.parameters.getInt(base.push(P_P), null, 0); if (P < 0) state.output.fatal("p must be > 0", base.push(P_P)); Rc = state.parameters.getInt(base.push(P_RC), null, 0); if (Rc < 0) state.output.fatal("rc must be > 0", base.push(P_RC)); } public void evaluate(final EvolutionState state, final Individual ind, final int subpopulation, final int threadnum) { BitVectorIndividual ind2 = (BitVectorIndividual) ind; double genes[] = new double[ind2.genome.length]; for (int i=0; i < genes.length; i++) genes[i] = ((ind2.genome[i]) ? 1 : 0); double fitness = H(genes); ((SimpleFitness)(ind2.fitness)).setFitness( state, fitness, false); ind2.evaluated = true; } double H(double genes[]) { double bonus=1, F=0; int last = genes.length; for (int i=0; i < last; i++) F += f(genes[i]) ; for (int i=1; i <= P; i++) { last /= K; bonus *= Rc; for (int j=0; j < last; j++) { genes[j] = t(genes, j*K); F += f(genes[j]) * bonus; } } return F; } double t(double transform[], int first) { int s=0; for (int i=first+1; i < first+K; i++) { if (transform[first] == transform[i]) s++; } if (s == (K-1)) return transform[first]; return -1; } double f(double b) { if (b != -1) return 1; return 0; } }

Ads help maintain this website.