package nl.ru.ai.projects.parrot.ea.fitness;
import java.util.ArrayList;
import nl.ru.ai.projects.parrot.ea.evolve.EAConfiguration;
import nl.ru.ai.projects.parrot.ea.evolve.EASetup;
import nl.ru.ai.projects.parrot.tools.PositionLogger;
import org.jgap.IChromosome;
private static final long serialVersionUID = 1L;
super(config);
}
@Override
protected double evaluate(IChromosome aSubject) {
if ( EASetup.interrupt )
return 0.00;
try {
PositionLogger.resetPositions();
setupEA(aSubject);
} catch (InterruptedException e) {
System.err.println("Interrupted");
EASetup.interrupt = true;
return 0.00;
}
ArrayList<double[]> coords = PositionLogger.getPositions();
double fitness = 0.0;
double pole1 = 5.0, pole2 = -5.0;
double threshold = 0.01;
int caseCounter = 0;
for ( int i=0; i<coords.size(); i++ ) {
double[] coord = coords.get(i);
if(i > 0)
{
if(Math.abs(coord[0] - coords.get(i-1)[0]) > threshold )
fitness += 0.001;
}
switch( caseCounter ) {
case 0:
if ( coord[1] > 0 && coord[0] > pole1 ) {
fitness++;
caseCounter++;
}
break;
case 1:
if ( coord[1] < 0 && coord[0] < pole1 ) {
fitness++;
caseCounter++;
}
break;
case 2:
if ( coord[1] > 0 && coord[0] < pole2 ) {
fitness++;
caseCounter++;
}
break;
case 3:
if ( coord[1] < 0 && coord[0] > pole2 ) {
fitness++;
caseCounter = 0;
}
break;
default:
caseCounter = 0;
}
}
System.out.print(".");
return fitness;
}
}