package com.ewjordan.util.objectWrap;
import java.util.Random;
import org.apache.commons.math.genetics.Chromosome;
public class WrappedObjectChromosome extends Chromosome {
static private Random rand = new Random();
private WrappedObject wrappedObject;
public WrappedObject getWrappedObject() {
return wrappedObject;
}
public void setWrappedObject(WrappedObject wrappedObject) {
this.wrappedObject = wrappedObject;
}
public WrappedObjectChromosome(WrappedObject obj) {
super();
this.wrappedObject = obj;
}
public int size() {
return wrappedObject.getNumberOfMembers();
}
public static WrappedObjectChromosome cross( WrappedObjectChromosome wrappedFirst,
WrappedObjectChromosome wrappedSecond,
int crossPoint ) {
WrappedObject o1 = wrappedFirst.getWrappedObject();
WrappedObject o2 = wrappedSecond.getWrappedObject();
WrappedObject result = new WrappedObject(o1);
double[] resultVals = result.getValues();
double[] crossVals = o2.getValues();
System.arraycopy(crossVals, crossPoint, resultVals, crossPoint, resultVals.length-crossPoint);
return new WrappedObjectChromosome(result);
}
public static WrappedObjectChromosome mutate(WrappedObjectChromosome original) {
WrappedObject obj = original.getWrappedObject();
int nMembers = obj.getNumberOfMembers();
int memberToMutate = rand.nextInt(nMembers);
PrimitiveReference ref = obj.getReferenceAt(memberToMutate);
//mutate, while respecting the stated range of each reference
double min = ref.getMinValue();
double max = ref.getMaxValue();
double dev = ref.getStandardDeviationScale();
double newVal = constrainedRandomValue(obj.getValue(memberToMutate),min, max, dev);
WrappedObject newObj = new WrappedObject(obj);
newObj.setValue(memberToMutate, newVal);
WrappedObjectChromosome mutated = new WrappedObjectChromosome(newObj);
return mutated;
}
/**
* An arbitrary constrained random walk step. Works by taking a random walk from the
* current location, and then applying the constraints.
*/
static private double constrainedRandomValue(double current, double min, double max, double stdDev) {
double randGaussian = rand.nextGaussian() * stdDev;
double newVal = current + randGaussian;
if (newVal < min) {
newVal = min;
} else if (newVal > max) {
newVal = max;
}
return newVal;
}
@Override
public double fitness() {
// TODO Auto-generated method stub
return 0;
}
}