00001 #include "SIGEL_GP/SIG_GPSimpleFitnessFunction.h"
00002
00003 #include "SIGEL_Simulation/SIG_Simulation.h"
00004 #include "SIGEL_Tools/SIG_IO.h"
00005 #include "SIGEL_GP/SIG_GPSimpleRecorder.h"
00006 #include "SIGEL_Tools/SIG_Exception.h"
00007
00008 #include <qdatetime.h>
00009
00010 SIGEL_GP::SIG_GPSimpleFitnessFunction::SIG_GPSimpleFitnessFunction(SIGEL_Program::SIG_Program & program,
00011 SIGEL_Robot::SIG_Robot & rob,
00012 SIGEL_Environment::SIG_Environment & environment,
00013 SIGEL_Simulation::SIG_SimulationParameters & simparameter)
00014 : SIG_GPFitnessFunction(program,
00015 rob,
00016 environment,
00017 simparameter,
00018 "SimpleFitnessFunction")
00019 { };
00020
00021 SIGEL_GP::SIG_GPSimpleFitnessFunction::~SIG_GPSimpleFitnessFunction()
00022 { };
00023
00024 double SIGEL_GP::SIG_GPSimpleFitnessFunction::evalFitness()
00025 {
00026
00027 SIGEL_GP::SIG_GPSimpleRecorder recorder;
00028
00029 SIGEL_Simulation::SIG_Simulation *simulation = new SIGEL_Simulation::SIG_Simulation( rob,
00030 environment,
00031 program,
00032 simparameter,
00033 recorder );
00034
00035 double fitness = 0;
00036
00037 try
00038 {
00039 simulation->start();
00040 }
00041 catch (SIGEL_Tools::SIG_Exception &e)
00042 { };
00043
00044
00045
00046 DL_vector startPosition = normalizeRobotPosition( recorder.start,
00047 recorder.startRotation );
00048
00049 DL_vector endPosition = normalizeRobotPosition( recorder.end,
00050 recorder.endRotation );
00051
00052 if (isValid( endPosition.x ) && isValid( endPosition.y ) && isValid( endPosition.z ))
00053 {
00054 DL_vector distanceVector = endPosition;
00055
00056 distanceVector.minusis( &startPosition );
00057
00058 double distance = distanceVector.norm();
00059
00060 int simulatedSeconds = QTime().secsTo( simparameter.getTimeToSimulate() );
00061
00062 fitness = distance / simulatedSeconds;
00063 }
00064 else
00065 fitness = 0;
00066
00067 return fitness;
00068 };