package ec.app.nk; 

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

/**
   NK implmements the NK-landscape developed by Stuart Kauffman (in the book The Origins of
   Order: Self-Organization and Selection in Evolution).  In the NK model, the fitness 
   contribution of each allele depends on how that allele interacts with K other alleles.  Based on 
   this interaction, each gene contributes a random number between 0 and 1.  The individual's 
   fitness is the average of these N random numbers.  

   

Parameters

base.k
int >= 0 && < 31
(number of interacting alleles)
base.adjacent
boolean
(should interacting alleles be adjacent to the given allele)
@author Keith Sullivan @version 1.0 */ public class NK extends Problem implements SimpleProblemForm { public static final String P_N = "n"; public static final String P_K = "k"; public static final String P_ADJACENT="adjacent"; int k; boolean adjacentNeighborhoods; HashMap oldValues; public void setup(final EvolutionState state, final Parameter base) { super.setup(state, base); k = state.parameters.getInt(base.push(P_K), null, 1); if ((k < 0) || (k > 31)) state.output.fatal("Value of k must be between 0 and 31", base.push(P_K)); adjacentNeighborhoods = state.parameters.getBoolean(base.push(P_ADJACENT), null, true); oldValues = new HashMap(); } public void evaluate(final EvolutionState state, final Individual ind, final int subpopulation, final int threadnum) { BitVectorIndividual ind2 = (BitVectorIndividual) ind; double fitness =0; int n = ind2.genome.length; for (int i=0; i < n; i++) { boolean tmpInd[] = new boolean[k+1]; tmpInd[0] = ind2.genome[i]; double val=0; if (adjacentNeighborhoods) { int offset = n - k/2; for (int j=0; j < k; j++) { tmpInd[j+1] = ind2.genome[(j+i + offset) % n]; } } else { int j; for (int l=0; l < k; l++) { while ((j = state.random[0].nextInt(k)) == i); tmpInd[l+1] = ind2.genome[j]; } } if (oldValues.containsKey(tmpInd)) val = ((Double)oldValues.get(tmpInd)).doubleValue(); else { double tmp=0; for (int j=0; j < tmpInd.length; j++) if (tmpInd[j]) tmp += 1 << j; val = tmp / Integer.MAX_VALUE; oldValues.put(tmpInd, new Double(val)); } fitness += val; } fitness /= n; ((SimpleFitness)(ind2.fitness)).setFitness( state, fitness, false); ind2.evaluated = true; } }

Ads help maintain this website.