import classifier.*; import classifier.gp.*; public class BinaryClassifierFitness implements FitnessFunction{ public BinaryClassifierFitness(Object kind,TrainingSetSV ts) { this.ts = (TrainingSetSVConcrete) ts; this.kind = (Long)kind; } public TrainingSet getTrainingSet() { return this.ts; } public void evaluate(Population pop) { LongBox input_red = new LongBox(); double sumOfAdjustedFitnesses = 0.0; DataReaderTarghe drt = (DataReaderTarghe) ts.getDataReader(); long pos = drt.getOccurencies(kind); long neg = ts.getNum() - pos; long ratio = neg/pos; for(int i=0; i < pop.getPopulationSize(); i++) { Individual ind = (Individual) pop.getIndividual(i); for(int j=0; j < ts.getNum(); j++) { long result; input_red = (LongBox) ts.getInput(j); result = ((GProgram) ind.getProgram()).eval(input_red.long_value); long ex_output = ((LongBox) ts.getOutput(j)).long_value; if(ex_output == kind.longValue()) { if (result == 0) ind.setFN( ind.getFN()+1 ); } else if (result == 1) ind.setFP( ind.getFP()+1 ); } ind.setStandardizedFitness(1 - Math.sqrt((Math.pow(ind.getFN()*ratio,2)+Math.pow(ind.getFP(),2))/(Math.pow(pos*ratio,2) + Math.pow(neg,2)))); ind.setAdjustedFitness(1.0 / (ind.getStandardizedFitness() + 1.0)); sumOfAdjustedFitnesses += ind.getAdjustedFitness(); } for(int i = 0; i < pop.getPopulationSize(); i++) { Individual ind = (Individual) pop.getIndividual(i); ind.setNormalizedFitness(ind.getAdjustedFitness() / sumOfAdjustedFitnesses); } } protected Object getKind(){ return kind; } private TrainingSetSVConcrete ts; private Long kind; }