00001 #include "SIGEL_GP/SIG_GPIndividual.h"
00002 #include <iostream.h>
00003
00004
00005 SIGEL_GP::SIG_GPIndividual& SIGEL_GP::SIG_GPIndividual::operator =(SIG_GPIndividual& ind)
00006 {
00007 setAge(0);
00008 history=ind.getHistory();
00009 setName(ind.getName());
00010 setPoolPos(ind.getPoolPos());
00011 getProgramVar()=ind.getProgramVar();
00012 setFitness( ind.getFitness() );
00013 return *this;
00014 }
00015
00016
00017 SIGEL_GP::SIG_GPIndividual::SIG_GPIndividual(SIG_GPParameter& param,
00018 SIGEL_Tools::SIG_Randomizer& random,
00019 QString name, QDateTime birthtime,
00020 int poolpos)
00021 : prog()
00022 {
00023 setName(name);
00024 setPoolPos(poolpos);
00025 setFitness(-1);
00026 setAge(0);
00027
00028 QString nameTmp = "NAME : " + getName();
00029 QString str;
00030 QString poolposTmp = "Pool Position: " + str.number(getPoolPos(),10);
00031 QString birthdTmp = "Date of Birth: " + birthtime.toString();
00032 QString ageTmp = "Age : " + str.number(getAge(),10);
00033 QString fitTmp = "Fitness Value: " + str.number(getFitness(),'g',6);
00034
00035
00036 history.append("CREATED NEW INDIVIDUUM:\n=======================");
00037 history.append(nameTmp);
00038 history.append(birthdTmp);
00039 history.append(poolposTmp);
00040 history.append(ageTmp);
00041 history.append(fitTmp);
00042 };
00043
00044 SIGEL_GP::SIG_GPIndividual::SIG_GPIndividual( SIG_GPParameter const& param,
00045 QStringList const& hist,
00046 QString name,
00047 QDateTime birthtime,
00048 int poolpos )
00049 : prog()
00050 {
00051 setName( name );
00052 setPoolPos(poolpos);
00053 setHistory( hist );
00054 setFitness( -1 );
00055 setAge( 0 );
00056 };
00057
00058 SIGEL_GP::SIG_GPIndividual::SIG_GPIndividual( SIGEL_Program::SIG_Program const& prog,
00059 QString name1,
00060 QString name2,
00061 QString name3,
00062 QDateTime birthtime,
00063 int poolpos,
00064 QStringList const& hist )
00065 :prog()
00066 {
00067
00068 setName(name1);
00069 setPoolPos(poolpos);
00070 setHistory( hist );
00071 setFitness( -1 );
00072 setAge( 0 );
00073 };
00074
00075 SIGEL_GP::SIG_GPIndividual::SIG_GPIndividual():prog()
00076 {
00077 setName("<no name set>");
00078 setPoolPos(0);
00079 setFitness(-1);
00080 setAge(0);
00081 }
00082
00083 SIGEL_GP::SIG_GPIndividual::SIG_GPIndividual(SIGEL_Tools::SIG_Randomizer &random):
00084 prog()
00085 {
00086 setName("No Name");
00087 setFitness(-1);
00088 setAge(0);
00089 setPoolPos(0);
00090 QDateTime cdt = cdt.currentDateTime();
00091 QString nameTmp = "NAME : " + getName();
00092 QString str;
00093 QString poolposTmp = "Pool Position: " + str.number(getPoolPos(),10);
00094 QString birthdTmp = "Date of Birth: " + cdt.toString();
00095 QString ageTmp = "Age : " + str.number(getAge(),10);
00096 QString fitTmp = "Fitness Value: " + str.number(getFitness(),'g',6);
00097
00098 history.append("\nINDIVIDUAL WITH RANDOMLY GENERATED PROGRAM:
00099 \n===========================================");
00100 history.append(nameTmp);
00101 history.append(birthdTmp);
00102 history.append(poolposTmp);
00103 history.append(ageTmp);
00104 history.append(fitTmp);
00105
00106 }
00107
00108 SIGEL_GP::SIG_GPIndividual::SIG_GPIndividual(SIGEL_Tools::SIG_Randomizer &random,
00109 SIGEL_GP::SIG_GPParameter& param,
00110 SIGEL_Robot::SIG_LanguageParameters& languageP)
00111 :prog( param, languageP,random )
00112 {
00113 setName( "No name" );
00114 setFitness( -1 );
00115 setAge( 0 );
00116 setPoolPos( 0 );
00117
00118 QString str;
00119 QDateTime cdt = cdt.currentDateTime();
00120
00121 history.append( "INDIVIDUAL IS CREATED:\n====================" );
00122 history.append( "Date of Birth: " + cdt.toString() );
00123
00124 }
00125
00126 SIGEL_GP::SIG_GPIndividual::SIG_GPIndividual(QString data)
00127 {
00128 loadIndividual(data);
00129 };
00130
00131 SIGEL_GP::SIG_GPIndividual::~SIG_GPIndividual()
00132 {
00133 #ifdef SIG_DEBUG
00134
00135
00136
00137 #endif
00138 }
00139
00140
00141 void SIGEL_GP::SIG_GPIndividual::generateRandomIndividual(SIGEL_Tools::SIG_Randomizer& random,
00142 SIGEL_GP::SIG_GPParameter& param,
00143 SIGEL_Robot::SIG_LanguageParameters& languageP )
00144 {
00145 prog.generateRandomProgram(param,languageP,random);
00146 setName("No Name");
00147 setPoolPos(0);
00148 setFitness(-1);
00149 setAge(0);
00150 QDateTime cdt = cdt.currentDateTime();
00151 QString nameTmp = "NAME : " + getName();
00152 QString str;
00153 QString poolposTmp = "Pool Position: " + str.number(getPoolPos(),10);
00154 QString birthdTmp = "Date of Birth: " + cdt.toString();
00155 QString ageTmp = "Age : " + str.number(getAge(),10);
00156 QString fitTmp = "Fitness Value: " + str.number(getFitness(),'g',6);
00157
00158
00159 history.append("INDIVIDUUM IS GENERATED RANDOMLY:\n---------------------------------");
00160 history.append(nameTmp);
00161 history.append(birthdTmp);
00162 history.append(poolposTmp);
00163 history.append(ageTmp);
00164 history.append(fitTmp);
00165
00166 }
00167
00168 void SIGEL_GP::SIG_GPIndividual::increaseAge()
00169 {
00170 age++;
00171 };
00172
00173 void SIGEL_GP::SIG_GPIndividual::increaseAgeInfo()
00174 {
00175 QString str;
00176 history.append( "\nAGE IS INCREASED:\n-----------------");
00177 history.append( "New Age: " + str.number( getAge(), 10 ) );
00178 };
00179
00180 long SIGEL_GP::SIG_GPIndividual::getAge() const
00181 {
00182 return age;
00183 };
00184
00185 void SIGEL_GP::SIG_GPIndividual::importProgram(SIGEL_Program::SIG_Program& prog )
00186 {
00187 getProgramVar()=prog;
00188 };
00189
00190 void SIGEL_GP::SIG_GPIndividual::importProgram( QString& filename )
00191 {
00192 getProgramVar().importProgram( filename );
00193 addImportProgramInfo( QDateTime::currentDateTime() );
00194 }
00195
00196 void SIGEL_GP::SIG_GPIndividual::exportProgram( QString& filename )
00197 {
00198 getProgramVar().exportProgram( filename );
00199 }
00200
00201
00202 QString SIGEL_GP::SIG_GPIndividual::getName()
00203 {
00204 return indName;
00205 };
00206
00207 void SIGEL_GP::SIG_GPIndividual::loadIndividual(QString data)
00208 {
00209 readFromFile(data);
00210 };
00211
00212 QString SIGEL_GP::SIG_GPIndividual::saveIndividual()
00213 {
00214 QString str;
00215 QTextStream outputFile(&str, IO_WriteOnly);
00216
00217 writeToFile(outputFile);
00218
00219 return str;
00220 };
00221
00222 void SIGEL_GP::SIG_GPIndividual::copyIndividual(SIGEL_GP::SIG_GPIndividual& cInd,
00223 int poolPos)
00224 {
00225 *this=cInd;
00226 setPoolPos(poolPos);
00227 };
00228
00229 int SIGEL_GP::SIG_GPIndividual::getPoolPos() const
00230 {
00231 return poolPos;
00232 };
00233
00234 void SIGEL_GP::SIG_GPIndividual::setPoolPos(int pp)
00235 {
00236 poolPos=pp;
00237 };
00238
00239 void SIGEL_GP::SIG_GPIndividual::setPoolPosInfo()
00240 {
00241 QString str;
00242 history.append("\nINDIVIDUAL HAS A NEW POOL POSITION:\n-----------------------------------");
00243 history.append("New Pool Position: " + str.number(getPoolPos(),10));
00244 };
00245
00246 SIGEL_Program::SIG_Program const & SIGEL_GP::SIG_GPIndividual::getProgram() const
00247 {
00248 return prog;
00249 };
00250
00251 SIGEL_Program::SIG_Program& SIGEL_GP::SIG_GPIndividual::getProgramVar()
00252 {
00253 return prog;
00254 };
00255
00256 void SIGEL_GP::SIG_GPIndividual::setFitness(double fit)
00257 {
00258 fitnessValue=fit;
00259 };
00260
00261 void SIGEL_GP::SIG_GPIndividual::setFitnessInfo()
00262 {
00263 QString str;
00264 history.append( "\nNEW FITNESS VALUE SET:\n----------------------");
00265 history.append( "Evaluated fitness value: " + str.number( getFitness(), 'g', 6 ) );
00266
00267 };
00268
00269 double SIGEL_GP::SIG_GPIndividual::getFitness() const
00270 {
00271 return fitnessValue;
00272 };
00273
00274 QStringList SIGEL_GP::SIG_GPIndividual::getHistory() const
00275 {
00276 return history;
00277 };
00278
00279
00280 void SIGEL_GP::SIG_GPIndividual::addMutationInfo(QString name,
00281 QDateTime time,
00282 int mutpoint)
00283 {
00284 QString str;
00285 QString mutdTmp = "Date of Mutation: " + time.toString();
00286 QString ageTmp = "Current Age: " + str.number(getAge(),10);
00287 QString mpointTmp = "Mutation Point: " + str.number(mutpoint);
00288 QString fitTmp = "Fitness Value (before Mutation): " + str.number(getFitness(),'g',6);
00289 QString poolposTmp = "Current Pool Position: " + str.number(getPoolPos(),10);
00290
00291 history.append("\nMUTATION:\n---------");
00292 history.append("Father: " + name);
00293 history.append(mpointTmp);
00294 history.append(mutdTmp);
00295 history.append(poolposTmp);
00296 history.append(ageTmp);
00297 history.append(fitTmp);
00298 };
00299
00300 void SIGEL_GP::SIG_GPIndividual::addMutationInfo(QString name,
00301 QDateTime time,
00302 int mutpoint,
00303 double fit )
00304 {
00305 QString str;
00306 QString mutdTmp = "Date of Mutation: " + time.toString();
00307 QString ageTmp = "Current Age: " + str.number(getAge(),10);
00308 QString mpointTmp = "Mutation Point: " + str.number(mutpoint);
00309 QString fitTmp = "Fitness Value (before Mutation): " + str.number(fit,'g',6);
00310 QString poolposTmp = "Current Pool Position: " + str.number(getPoolPos(),10);
00311
00312 history.append("\nMUTATION:\n---------");
00313 history.append("Father: " + name);
00314 history.append(mpointTmp);
00315 history.append(mutdTmp);
00316 history.append(poolposTmp);
00317 history.append(ageTmp);
00318 history.append(fitTmp);
00319 };
00320
00321 void SIGEL_GP::SIG_GPIndividual::addCrossOverInfo(QString name1,
00322 QString name2,
00323 QDateTime time,
00324 int xoverpnt1,
00325 int xoverpnt2)
00326 {
00327 QString str;
00328 QString mutdTmp = "Date of CrossOver: " + time.toString();
00329 QString nameTmp = "Parents: " + name1 +" + "+name2;
00330 QString ageTmp = "Current Age: " + str.number(getAge(),10);
00331 QString cpointTmp = "Crossover Points: " + str.number(xoverpnt1) + " + " + str.number(xoverpnt2);
00332 QString fitTmp = "Fitness Value (before Crossover): " + str.number(getFitness(),'g',6);
00333 QString poolposTmp = "Current Pool Position: " + str.number(getPoolPos(),10);
00334
00335 history.append("\nCROSSOVER:\n----------");
00336 history.append(nameTmp);
00337 history.append(cpointTmp);
00338 history.append(mutdTmp);
00339 history.append(poolposTmp);
00340 history.append(ageTmp);
00341 history.append(fitTmp);
00342 };
00343
00344
00345 void SIGEL_GP::SIG_GPIndividual::addCrossOverInfo(QString name1,
00346 QString name2,
00347 QDateTime time,
00348 int xoverpnt1,
00349 int xoverpnt2,
00350 double fitness1,
00351 double fitness2 )
00352 {
00353 QString str;
00354 QString mutdTmp = "Date of CrossOver: " + time.toString();
00355 QString nameTmp = "Parents: " + name1 +" + "+name2;
00356 QString cpointTmp = "Crossover Points: " + str.number(xoverpnt1) + " + " + str.number(xoverpnt2);
00357 QString fitTmp1 = "Fitness (Elter 1): " + str.number(fitness1,'g',6);
00358 QString fitTmp2 = "Fitness (Elter 2): " + str.number(fitness2,'g',6);
00359 QString poolposTmp = "Current Pool Position: " + str.number(getPoolPos(),10);
00360
00361 history.append("\nCROSSOVER:\n----------");
00362 history.append(nameTmp);
00363 history.append(cpointTmp);
00364 history.append(mutdTmp);
00365 history.append(poolposTmp);
00366 history.append(fitTmp1);
00367 history.append(fitTmp2);
00368 };
00369
00370 void SIGEL_GP::SIG_GPIndividual::addReproductionInfo(QString name,
00371 QDateTime time)
00372 {
00373 QString str;
00374 QString reprdTmp = "Date of Reproduction: " + time.toString();
00375 QString ageTmp = "Current Age: " + str.number(getAge(),10);
00376 QString fitTmp = "Fitness Value: " + str.number(getFitness(),'g',6);
00377 QString poolposTmp = "Current Pool Position: " + str.number(getPoolPos(),10);
00378
00379 history.append("\nREPRODUCTION:\n-------------");
00380 history.append("Father: " + name);
00381 history.append(reprdTmp);
00382 history.append(poolposTmp);
00383 history.append(ageTmp);
00384 history.append(fitTmp);
00385 };
00386
00387
00388 void SIGEL_GP::SIG_GPIndividual::addPreparationOfHistoryInfo()
00389 {
00390 history.append( "\n-----------------------------" );
00391 history.append( " OLD INDIVIDUAL DATA DELETED" );
00392 history.append( " DATA OF IMPORTED INDIVIDUAL:" );
00393 history.append( "-----------------------------" );
00394 }
00395
00396 void SIGEL_GP::SIG_GPIndividual::addImportIndividualInfo(QDateTime time)
00397 {
00398 history.append( "\nINDIVIDUAL IMPORTED:\n--------------------" );
00399 history.append( "Date of Import: " + time.toString() );
00400 }
00401
00402 void SIGEL_GP::SIG_GPIndividual::addImportProgramInfo(QDateTime time)
00403 {
00404 history.append( "\nOLD PROGRAM DELETED\n" );
00405 history.append( "\nPROGRAM IMPORTED:\n-----------------" );
00406 history.append( "Date of Import: " + time.toString() );
00407 }
00408
00409 void SIGEL_GP::SIG_GPIndividual::addLengthIncreasedInfo( QDateTime time, long lgth )
00410 {
00411 history.append( "\nPROGRAM LENGTH INCREASED:\n-------------------------");
00412 history.append( "Date of action: " + time.toString() );
00413 QString str;
00414 history.append( "Added Length: " + str.number( lgth ) );
00415 }
00416
00417 void SIGEL_GP::SIG_GPIndividual::addLengthDecreasedInfo( QDateTime time, long lgth )
00418 {
00419 history.append( "\nPROGRAM LENGTH DECREASED:\n-------------------------");
00420 history.append( "Date of action: " + time.toString() );
00421 QString str;
00422 history.append( "Removed Length: " + str.number( lgth ) );
00423 }
00424
00425
00426 bool SIGEL_GP::SIG_GPIndividual::upToDate()const
00427 {
00428 return ( getFitness() != -1 );
00429 };
00430
00431
00432 void SIGEL_GP::SIG_GPIndividual::importIndividual( QString& filename )
00433 {
00434 QFile indFile( filename );
00435 QString indString;
00436
00437 if( indFile.open( IO_ReadOnly ) )
00438 {
00439 addPreparationOfHistoryInfo();
00440 QTextStream buffer( &indFile );
00441 indString = buffer.read();
00442 readFromFile( indString );
00443 indFile.close();
00444 addImportIndividualInfo( QDateTime::currentDateTime() );
00445 }
00446 else
00447 SIGEL_Tools::SIG_IO::cerr << "Could not import Individual from "
00448 << filename
00449 << "!\n";
00450 }
00451
00452
00453 void SIGEL_GP::SIG_GPIndividual::exportIndividual( QString& filename )
00454 {
00455 QFile indFile( filename );
00456
00457 if( indFile.open( IO_WriteOnly ) )
00458 {
00459 QTextStream buffer( &indFile );
00460 writeToFile( buffer );
00461 indFile.close();
00462 }
00463 else
00464 SIGEL_Tools::SIG_IO::cerr << "Could not export Individual to "
00465 << filename
00466 << "!\n";
00467 }
00468
00469
00470 SIGEL_Program::SIG_Program *SIGEL_GP::SIG_GPIndividual::getProgramPointer()
00471 {
00472 return &prog;
00473 };
00474
00475 void SIGEL_GP::SIG_GPIndividual::setAge(long a)
00476 {
00477 age=a;
00478 };
00479
00480 void SIGEL_GP::SIG_GPIndividual::setAgeInfo()
00481 {
00482 QString str;
00483 history.append( "*INDIVIDUAL HAS A NEW AGE*");
00484 history.append( "New Age: " + str.number( getAge(), 10 ) );
00485 };
00486
00487 void SIGEL_GP::SIG_GPIndividual::setName(QString n)
00488 {
00489 indName=n;
00490 };
00491
00492 void SIGEL_GP::SIG_GPIndividual::setNameInfo()
00493 {
00494 QString str;
00495 history.append( "\nINDIVIDUAL HAS A NEW NAME:\n--------------------------");
00496 history.append( "New Name: " + str.number( getAge(), 10 ) );
00497 };
00498
00499
00500 void SIGEL_GP::SIG_GPIndividual::print()
00501 {
00502 SIGEL_Tools::SIG_IO::cerr << "\nCurrent individual's data:\n--------------------------"
00503 << "\n- Name : "
00504 << getName()
00505 << "\n- Poolpos: "
00506 << getPoolPos()
00507 << "\n- Fitness: "
00508 << getFitness()
00509 << "\n- Age : "
00510 << getAge()
00511 << "\n- Program:\n\n";
00512
00513 getProgramVar().print();
00514
00515 }
00516
00517
00518 void SIGEL_GP::SIG_GPIndividual::writeToFile(QTextStream &file)
00519 {
00520
00521
00522 file<<"\n INDIVIDUAL BEGIN{ "<<"\n NAME='"<<getName()<<"';";
00523 file<<"\n POOLPOS="<<getPoolPos()<<";";
00524 file<<"\n FITNESS="<<getFitness()<<";";
00525 file<<"\n AGE="<<getAge()<<";";
00526 file<<"\n HISTORY BEGIN{";
00527 file<<history.join("\n");
00528 file<<"\n }HISTORY END;";
00529 file<<"\n PROGRAM BEGIN{"<<'\n';
00530
00531 getProgramPointer()->writeToFile(file);
00532
00533 file<<" }PROGRAM END;";
00534
00535 file<<"\n }INDIVIDUAL END";
00536 }
00537
00538 void SIGEL_GP::SIG_GPIndividual::setHistory( QStringList hist )
00539 {
00540 history = hist;
00541 }
00542
00543 void SIGEL_GP::SIG_GPIndividual::readFromFile(QString indStr)
00544 {
00545
00546 long pos;
00547
00548 QString prgStr;
00549 QString histStr;
00550 QTextStream outputFile(&prgStr, IO_WriteOnly);
00551 QTextStream inputFile(&prgStr, IO_ReadOnly);
00552
00553
00554
00555
00556
00557 if((pos=indStr.find("NAME='",0,false))!=-1)
00558 {
00559
00560 setName(indStr.mid(pos+6,indStr.find("'",pos+7,false)-pos-6));
00561 }
00562 else
00563 {
00564
00565 }
00566
00567 if((pos=indStr.find("POOLPOS=",0,false))!=-1)
00568 {
00569
00570 setPoolPos((indStr.mid(pos+8,indStr.find(";",pos+9,false)-pos-8)).toLong());
00571 }
00572 else
00573 {
00574
00575 }
00576
00577 if((pos=indStr.find("FITNESS=",0,false))!=-1)
00578 {
00579
00580 setFitness((indStr.mid(pos+8,indStr.find(";",pos+9,false)-pos-8)).toDouble());
00581 }
00582 else
00583 {
00584
00585 }
00586
00587 if((pos=indStr.find("AGE=",0,false))!=-1)
00588 {
00589
00590 setAge((indStr.mid(pos+4,indStr.find(";",pos+5,false)-pos-4)).toLong());
00591 }
00592 else
00593 {
00594
00595 }
00596
00597 if((pos=indStr.find("PROGRAM BEGIN{",0,false))!=-1)
00598 {
00599
00600 prgStr=indStr.mid(pos+15,indStr.find("}PROGRAM END",pos+16,false)-pos-14);
00601 getProgramPointer()->clear();
00602 getProgramPointer()->readFromFile(inputFile);
00603
00604
00605 }
00606 else
00607 {
00608
00609 }
00610
00611 if((pos=indStr.find("HISTORY BEGIN{",0,false))!=-1)
00612 {
00613
00614 histStr=indStr.mid(pos+14,indStr.find("}HISTORY END",pos+15,false)-pos-14);
00615 history.append(histStr);
00616 }
00617 else
00618 {
00619
00620
00621 }
00622
00623 }