// -------------------------------------gags.cc------------------------------- // Program generated automagically by gags.pl // gags.pl (c) JJ Merelo, 1994 #include "gensgav.hpp" #include "popsgar.hpp" #include "scanfile.hpp" #include "gstream.hpp" #include "ezsample.hpp" float fitness ( genSGAv & myGen , ezSample< float > & sample ) { // calcular las distancias float dist = 0; for ( unsigned i = 0; i < sample.getSize(); i ++ ) { float dist1 = (sample[i][0] - myGen[0]); float dist2 = (sample[i][1] - myGen[1]); dist += sqrt( dist1*dist1 + dist2*dist2); } return 1/dist; } main( int argc, char ** argv ) { const unsigned genSize = 2; float rangeStart[genSize], rangeEnd[genSize]; char inputFile[40]; unsigned popSize, generations, locusSize; double mutRate; enum reprodMode thisRepMode; unsigned uArgRepMode; float fArgRepMode; // both arguments for reproduction mode if ( argc > 1 ) scanFile(rangeStart, rangeEnd, argv[1], inputFile, popSize, mutRate, generations, locusSize, thisRepMode, uArgRepMode, fArgRepMode, genSize ); else { cout << "Usage: " << argv[0] << " .ini "; exit(1); } mysrand(); ezSample sample( inputFile, genSize ); popSGAr > myPop(popSize, mutRate, genSize, locusSize,rangeStart,rangeEnd); gstream gout(""); cout << "Starting genetic algorithm"; for ( unsigned g= 0; g < generations ; g++ ) { // Evaluate population fitness for ( unsigned p = 0; p < myPop.getPopSize(); p ++ ) myPop.setFitness( p, fitness( *(myPop[p]), sample )); // now really apply GA switch ( thisRepMode ) { case ELITE: myPop.newGeneration( thisRepMode, fArgRepMode ); break; case TOURNAMENT: case ROULWHEEL: // argument is not used in ROULWHEEL myPop.newGeneration( thisRepMode, uArgRepMode ); break; } cout << myPop.bestIndiv() << endl; cout << myPop.bestFitness() << endl; gout << myPop.bestFitness(); } return 0; }