Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members  

SIG_GPIndividual.cpp

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   //history.append( "\n--- History of the Individual in the Generation Number: "+ str.number(getAge(),10) + " ---");
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    // getProgramVar()=prog;
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    //history.append( "Poolpos      : " + str.number(getPoolPos(),10) );
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   //   SIGEL_Tools::SIG_IO::cerr << "\nDestructor of INDIVIDUAL called!\n";
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    //history.append( "\n--- History of the Individual in the Generation Number: "+ str.number(getAge(),10) + " ---");
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   // HISTORY IS MISSING !!!!
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   // cout<<"Received string:\n"<<indStr<<"\n";  
00555   
00556 
00557   if((pos=indStr.find("NAME='",0,false))!=-1)
00558     {
00559       // cout<<indStr.mid(pos+6,indStr.find("'",pos+7,false)-pos-6);
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       //cout<<indStr.mid(pos+8,indStr.find(";",pos+9,false)-pos-8);
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       //cout<<indStr.mid(pos+8,indStr.find(";",pos+9,false)-pos-8);
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       //cout<<indStr.mid(pos+4,indStr.find(";",pos+5,false)-pos-4);
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       //cout<<indStr.mid(pos+14,indStr.find("}PROGRAM END",pos+15,false)-pos-14);
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        // history.clear();
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 }

Generated at Mon Sep 3 01:32:23 2001 for PG 368 - SIGEL by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000