0.1 zweiter codeblock

1

Listing 1: Ein tolles floatentes Beispiel eines C++ Listings

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗

                     main .cpp − description

−

∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/

#ifdef  HAVE_CONFIG_H
#include  <config .h>
#endif
#include  <iostream .h>
#include  <stdlib .h>
#include  <stdio .h>
#include  <cmath >
#include  <cstring >
#include  <fstream >
/∗ eigene  Klassen  einbinden ∗/
#include  "debuginfo .h"
#include  "parameter .h"
#include  "genlib .h"
#include  "randomnumber  .h"
#include  "messwerte .h"
#include  "dataarray .h"
#include  "data .h"
#include  "fitness .h"
using  namespace  std;
int  MaxAnzahlDaten   = 2100;
int  DataArray ::MaxNumberOfData   = MaxAnzahlDaten  ;
int  Messwerte ::MaxNumberOfData   = MaxAnzahlDaten  ;
/∗∗ Wichtige  Parameter  für  den  GA ∗/
int  AnzahlParameter   = 3;
int  Populationsgroesse    = 50;
int  MaxGenerationen  =2000;
int  AnzahlFittest   = 30;
int  AnzahlMutanten   = 25;
int  AnzahlUeberlebende    = 1;
int  AnzahlKinder   = Populationsgroesse −AnzahlUeberlebende −
AnzahlMutanten  ;
int  Generation =1;
/∗∗ Temp  Variablen  und  Schleifenzähler   init ∗/
int  ii,jj,ij,ji,i=0,j=0;
double  d, dd, tmp1 =0,  tmp2 , tmp3 , x, y, fx, i0;
int  AnzMesswerte  =0;
/∗∗ Misc  Opts ∗/
/∗∗ ID Nr. für  Parameter  initialisieren ∗/
int  Parameter ::ID=0;
/∗∗ 1.  Aufruf  des  RNG ∗/
bool  RandomNumber  ::FirstRandom  =true ;
int  main (int  argc , char ∗argv [])

{

double  mutSchrittweite  [3] = {1.50 , 1.50 , 1.50};

cout  << endl ;
cout  << "−␣Genfit ␣Programm ␣Version ␣0.02␣( beta ␣release
     )␣−" << endl ;
cout  << "" << endl  << endl ;
/∗∗ Ab hier  geht  so richtiger  Programmcode   los ∗/
cout  << endl ;
double  p[AnzahlParameter  ];
DataArray  ExpDaten ;
Messwerte  MwExpDaten ;
/∗∗ Objekt  für  abspeichern   der  Fitness ∗/
Data ∗FitnessSave  ;
FitnessSave   = new  Data (MaxGenerationen  );
/∗∗ Objekt  für  Startwerte   der  Evolution ∗/
Data ∗StartValue ;
StartValue   = new  Data (AnzahlParameter  );
/∗∗ Daten  aus  File  einlesen  und  in ExpDaten  speichern ∗/
char  file [160]= "/home /torsten /Docs /Studienarbeit  /Daten /File1
     .dat";
char  FitnessFile  [160]= "/home /torsten /Docs /Studienarbeit  /
     Daten /Fit.dat";
char  ParameterFile  [160]= "/home /torsten /Docs /Studienarbeit  /
     Daten /P1.dat";
MwExpDaten .setFileName  (file );
MwExpDaten .ReadData ();
ExpDaten .setNumberOfData  (MwExpDaten .getNumberOfData  ());
AnzMesswerte   =  MwExpDaten .getNumberOfData  ();
/∗∗ Falls  Datenfile  zu groß − Warnung  und  Abbruch ∗/
if (AnzMesswerte   > MaxAnzahlDaten  ){
cout  << "Zu␣viele ␣Daten ␣im␣File ␣!!"  << endl ;
         return (0);

}

int  cntr1 =0;
for(i=1;i<=AnzMesswerte  ;i++){
         ExpDaten .setXValue (i , MwExpDaten .getFeldValue  (cntr1

              ));

         cntr1 ++;
         ExpDaten .setYValue (i , MwExpDaten .getFeldValue  (cntr1

              ));

         cntr1 ++;

}

/∗∗ Aktuelle  Parameter  ausgeben ∗/
cout  << "\tMaxNumberOfData  :\t" << MaxAnzahlDaten   << endl ;
cout  << "\tFileName :\t\t" << file  << endl ;
cout  << "\tFitnessFile  :\t\t" << FitnessFile   << endl ;
cout  << "\tParameterFile  :\t\t" << ParameterFile   << endl ;
cout  << "\tNumberOfData  :\t\t" << AnzMesswerte   << endl ;
cout  << "\tMaxGenerationen  :\t" << MaxGenerationen   << endl ;
cout  << "\tAnzahlParameter  :\t" << AnzahlParameter   << endl ;
cout  << "\tPopulationsgröße  :\t" << Populationsgroesse    <<
     endl ;
cout  << "\tÜberlebende  :\t\t" << AnzahlUeberlebende    << endl ;
cout  << "\tAnzahl ␣Fittest :\t\t" << AnzahlFittest   << endl ;
cout  << "\tAnzahl ␣Mutanten :\t" << AnzahlMutanten   << endl ;
cout  << "\tPopulationsgröße  :\t" << Populationsgroesse    <<
     endl ;
cout  << "\tmutSchrittweite  :\t" << mutSchrittweite   << endl ;
cout  << "\tModell :\t\t\t" << "Transient ␣Fit␣(2nd␣order )" <<
     endl ;
cout  << endl ;
/∗∗ Array  mit  Parameter −Objekten  erzeugen ∗/
cout  << "\t2␣Arrays ␣mit␣Parameter −Objekten ␣erzeugen ␣..."  <<
     endl ;
Parameter ∗parameter [AnzahlParameter  +1][ Populationsgroesse

     +1];

for(i=1;i<=AnzahlParameter  ;i++){
for(j=1;j<=Populationsgroesse   ;j++){
                  parameter [i][j]= new  Parameter ;

         }
}

Parameter ∗parameter_neu  [AnzahlParameter  +1][
     Populationsgroesse   +1];
for(i=1;i<=AnzahlParameter  ;i++){
for(j=1;j<=Populationsgroesse   ;j++){
                  parameter_neu  [i][j]= new  Parameter ;

         }
}

/∗∗ Zufallszahlen  (Objekt ) erzeugen ∗/
cout  << "\tZufallszahlen  (Objekt )␣erzeugen ␣..."  << endl ;
RandomNumber   r;
dd = r.EqualRandom  ();
/∗∗ Parameterobjekte   mit  default −Start −werten  initialisieren
      und  mutieren ∗/
cout  << "\tParameterobjekte  ␣initialisieren  ␣und␣mutieren ␣.."
     << endl ;
StartValue −>setValue (1 , 50.0);
StartValue −>setValue (2 , 140.0);
StartValue −>setValue (3 , 80.0); /∗
StartValue −>setValue (4 , 1.0);
StartValue −>setValue (5 , 1.1);
StartValue −>setValue (6 , 1.0);
StartValue −>setValue (7 , 1.0);
StartValue −>setValue (8 , 30.0);
StartValue −>setValue (9 , 140.0);
StartValue −>setValue (10 , 70.0); ∗/

for(i=1;i<=AnzahlParameter  ;i++){
         for(j=1;j<=Populationsgroesse   ;j++){
                  parameter [i][j]−>setValue (StartValue −>
                       getValue (i));
                  parameter [i][j]−>mutateValue  (r.
                       NormalDoubleRandom   (mutSchrittweite  [i
                       −1]));

         }
}

/∗∗ Fitness  Objekt  erzeugen ∗/
cout  << "\tFitness ␣Objekt ␣erzeugen ␣..."  << endl ;
ii = Populationsgroesse   ;
Fitness  _Fitness (ii);
/∗∗ Paarungs −array  erzeugen ∗/
cout  << "\tPaarungs ␣Objekt ␣erzeugen ␣..."  << endl ;
int  Paarungen [2][ AnzahlKinder  +1];
/∗∗ Fittness  der  einzelnen  Parameter  berechnen ∗/
cout  << "\tAnpassung ␣läuft ,␣bitte ␣warten ␣..."  << endl  <<
     endl ;
/∗∗ Dunkelstrom   i0 aus  letzen  3 Messwerten   berechnen ∗/
i0 =(ExpDaten .getYValue (AnzMesswerte  )
+ ExpDaten .getYValue (AnzMesswerte −2) + ExpDaten .getYValue (
     AnzMesswerte −2))/3;
while  (Generation   <= MaxGenerationen  ) {
         for(j=1;j<=Populationsgroesse   ;j++){
         tmp1  = 0;
         for(i=1;i<=AnzMesswerte  ;i++){
                  x =  ExpDaten .getXValue (i);
                  y =  ExpDaten .getYValue (i);
                  for  (jj=1;jj<=AnzahlParameter  ;jj++){
                           p[jj] = parameter [jj][j]−>getValue

                                ();
                  }

                  fx = p[1]∗ exp(−(x−p[2])∗( x−p[2])/(2∗ p[3]∗ p

                       [3]));

                  dd = (y − fx)∗(y − fx);
                  tmp1  = tmp1  + dd;

         }

         _Fitness .setValue (j,j,tmp1 );

}

/∗∗ Fittness  sortieren  ... ∗/
_Fitness .do_sort ();
/∗∗ beste  Fittnes  abspeichern ∗/
FitnessSave −>setValue (Generation , _Fitness .getValue (1));
/∗∗ Paarungen  zwischen  den  besten  Individuen   festlegen ∗/
for  (i=1;i<=AnzahlKinder  ;i++){
Paarungen [1][ i] = r.EqualUnsignedRandom   (AnzahlFittest  );
         Paarungen [2][ i] = r.EqualUnsignedRandom   (
              AnzahlFittest  );

}

/∗∗ Ueberlebende   in neue  Population   uebernehmen ∗/
for  (j=1;j<=AnzahlUeberlebende   ;j++){
         for  (i=1;i<=AnzahlParameter  ;i++){
                  ii = _Fitness .getParameterID  (j);
                  dd = parameter [i][ii]−>getValue ();
                  parameter_neu  [i][j]−>setValue (dd);

         }
}

/∗∗ Nachkommen   erzeugen  durch  Mittelwertbildung ∗/
for  (i=1;  i<=AnzahlKinder  ; i++){
                  ii = _Fitness .getParameterID  (Paarungen [1][ i

                       ]);

                  ij = _Fitness .getParameterID  (Paarungen [2][ i

                       ]);

                  for  (j=1;j<=AnzahlParameter  ;j++){
                           d  = r.StdEqualRandom  ();
                  dd = ( d∗parameter [j][ii]−>getValue () + (1− d
                       )∗parameter [j][ij]−>getValue () );
                           parameter_neu  [j][i+
                                AnzahlUeberlebende  ]−>setValue (dd

                                );
                  }
         }

/∗∗ Nachkommen   erzeugen  durch  Vertauschung ∗/

/∗∗

for  (i=1;  i<=AnzahlKinder  ; i++){
ii = _Fitness .getParameterID  (Paarungen [1][ i]);
         ij = _Fitness .getParameterID  (Paarungen [2][ i]);
for  (j=1;j<=AnzahlParameter  ;j++){
d = r.StdEqualRandom  (); //  Zufallszahl   zw. [0,1]
                  if (d<=0.5) {
                           dd = parameter [j][ii]−>getValue ();
                           parameter_neu  [j][i+
                                AnzahlUeberlebende  ]−>setValue (dd

                                );
                  }

                  else  {
dd = parameter [j][ij]−>getValue ();
                           parameter_neu  [j][i+
                                AnzahlUeberlebende  ]−>setValue (dd

                                );
                  }
         }

} ∗/
/∗∗ Nachkommen   erzeugen  durch  Mutation ∗/
for  (i=1;i<=AnzahlMutanten  ;i++){
ii = _Fitness .getParameterID  (i);
         for  (j=1;j<=AnzahlParameter  ;j++){
                  parameter [j][ii]−>mutateValue  (r.
                       NormalDoubleRandom   (mutSchrittweite  [j
                       −1]));
                  dd =     parameter [j][ii]−>getValue ();
                  parameter_neu  [j][i+AnzahlUeberlebende   +
                       AnzahlKinder  ]−>setValue (dd);

         }
}

/∗∗ Alte  Population   mit  neuer  überschreiben ∗/
for  (i=1;i<=Populationsgroesse   ;i++){
for  (j=1;j<=AnzahlParameter  ;j++){
                  dd = parameter_neu  [j][i]−>getValue ();
                  parameter [j][i]−>setValue (dd);

         }
}

Generation ++;
cout  << "\tFitness :\t" << _Fitness .getValue (1) <<  "\t\
     tGeneration  :\t" <<
Generation   << "\r" << flush ;

}

/∗∗ Ergebniss  ausgeben ∗/
cout  << endl  << endl  << "Ergebniss :" << endl ;
cout  << "I0:" << "\t" << i0 << endl ;
ii = _Fitness .getParameterID  (1);
for  (i=1;i<=AnzahlParameter  ;i++){
cout  << "P" << i << ":"  << "\t" << parameter [i][ii]−>
     getValue () <<  endl ;
         StartValue −>setValue (i,parameter [i][ii]−>getValue

              ());
}

cout  << endl  << "Fitness ␣und␣ermittelte ␣Parameter ␣
     abspeichern  ␣...␣"  << endl ;
FitnessSave −>SaveData (FitnessFile  );
StartValue −>SaveData (ParameterFile  );
cout  << "\a" << flush ;
/∗∗ Programm  ende ∗/
return  EXIT_SUCCESS  ;

}

2