Hallo Gemeinde,
es geht um ein Projekt zu einem genetischen Algorithmus.
Und zwar habe ich zu diesem Zweck eine Klasse "Indi" erstellt, die sämtliche Angaben zum einzelnen Individuum enthält:
Meine Probleme liegen beim Verständis darin, dass man die Größe eines Arrays ausserhalb einer Klasse mit einer Variable bestimmen kann, innerhalb aber nicht ?
Ich habe auch keine Ahnung wieso er im obigen Beispiel die Variable "gendezwert" beliebig ändert.
Und genauso frag ich mich, warum in der Memberfkt. Draw(), wenn das Genom 4 Zeichen lang ist, die Variable "gendezwert" immer 0 ist, obwohl bei Länge 3 die Zufallswerte drinstehen?
Wenn ihr mir weiterhelfen könntet, wäre ich euch richtig dankbar, denn ich weiß nichmehr weiter ..
Um das Phänomen besser nachzuvollziehen, hier nochmal der komplette Quelltext zum selberkompilieren:
Vielen Dank!
es geht um ein Projekt zu einem genetischen Algorithmus.
Und zwar habe ich zu diesem Zweck eine Klasse "Indi" erstellt, die sämtliche Angaben zum einzelnen Individuum enthält:
PHP:
//globale Variablen
int SIZE(5);
int Gnummer(1);
long fit_summe(0);
class Indi
{
private:
int nummer;
char bin[*/ Warum kann ich hier die Größe nicht mit Variable SIZE definieren? */];
int gendezwert;
int const_genwert;
int fitness;
public:
Indi();
void Draw();
};
Indi::Indi()
{
int obergrenze(0);
nummer=Gnummer++;
obergrenze = bin_stellen_wertigkeit(SIZE);
gendezwert = random(obergrenze,nummer);
// Funktion random() gibt an gendezwert z.B.17 zurück
const_genwert=gendezwert;
dez_bin(const_genwert,SIZE,bin);
// Paradoxerweise: ab hier ist gendezwert = 3204342 o.ä.
fitness= fitnessfkt(const_genwert);
fit_summe = fit_summe + fitness;
}
void Indi::Draw()
{
cout<<setw(6)<<nummer<<setw(6);
for(int i=0;i<=SIZE;i++){cout<<bin[i];};
cout<<setw(8)<<const_genwert<<setw(6)<<fitness<<"\n";
}
Meine Probleme liegen beim Verständis darin, dass man die Größe eines Arrays ausserhalb einer Klasse mit einer Variable bestimmen kann, innerhalb aber nicht ?
Ich habe auch keine Ahnung wieso er im obigen Beispiel die Variable "gendezwert" beliebig ändert.
Und genauso frag ich mich, warum in der Memberfkt. Draw(), wenn das Genom 4 Zeichen lang ist, die Variable "gendezwert" immer 0 ist, obwohl bei Länge 3 die Zufallswerte drinstehen?
Wenn ihr mir weiterhelfen könntet, wäre ich euch richtig dankbar, denn ich weiß nichmehr weiter ..
Um das Phänomen besser nachzuvollziehen, hier nochmal der komplette Quelltext zum selberkompilieren:
PHP:
#include <time.h>
#include <iostream>
#include <iomanip>
#include <string>
#include <stdlib.h>
#include <cmath>
#include <cstdlib>
using std::cout;
using std::endl;
using std::string;
using namespace std;
//ermittelt Obergrenze der darstellbaren Zahl des Binärtrings-> an random übergeben
int bin_stellen_wertigkeit(int stellen)
{
int erg(1);
for(int i = 0;i < stellen;i++) {erg = erg*2;}
erg--;
cout << "aus Werigkeitsfkt: "<< erg << endl;
return erg;
}
//erstellt eine zufällige Zahl für den späteren Binärcode-> an dez_bin übergeben
int random(int obergrenz,int nummer)
{
nummer++;
int x(1),y(1),z(1),z2(1);
int t1 = time(0)*nummer;
int t2 = (time(0)+56789)*nummer;
srand(t1);
x = (rand()%10);
srand(t2);
y = (rand()%20);
z = (x*y*nummer);
srand(z);
z2 = (rand()%obergrenz)+1;
cout<<"z2="<<z2<<"\n";
return z2;
}
//übergebene dezimalzahl als binärstring in array bin[]
void dez_bin(int dez, int stellen, char bin[])
{
int r(0);
char temp[stellen];
bin[0] = '\0';
while(dez > 0)
{ r = dez%2;
(r==0) ? strcpy(temp,"0") : strcpy(temp,"1");
strcat(temp,bin);
strcpy(bin,temp);
dez /= 2;
}
int b = strlen(bin);
if(b<stellen)
{ int h = (stellen - b);
char zw[10000];
for(int m(0);m<stellen;m++)
{zw[m]='\0';
}//MIT NULLEN FÜLLEN
for(int j=0;j<h;j++)
{zw[j]='0';
}//REST DER BINÄRZAHL bin AN zw ANHÄNGEN UND INHALT VON zw IN bin ÜBERSCHREIBEN
strcat(zw,bin);
strcpy(bin,zw);
}
}
//-------------------------------------------------
int fitnessfkt(int x) {return (x*x);}
//-------------------------------------------------
void PrintTabellenkopf()
{
cout << "Nummer"<< setw(12)<<"Gen-String" << setw(8)<<"x-Wert" << setw(17)<<"Fitness f(x)=x*x" << setw(8)<<"W.keit" << setw(8)<<"E-Wert" << setw(18)<<"Rundung-neueAnz.\n";
cout << "------------------------------------------------------------------------------\n" ;
}
//globale Variablen
int SIZE(1);
int Gnummer(1);
long fit_summe(0);
// Klassendefinition
class Indi
{
private:
int nummer;
char bin[];
int gendezwert;
int const_genwert;
int fitness;
public:
Indi();
//~Indi();
void Draw();
};
// Definition der Memberfunktionen
// Konstruktor
Indi::Indi()
{
int obergrenze(0);
nummer=Gnummer++;
obergrenze = bin_stellen_wertigkeit(SIZE);
gendezwert = random(obergrenze,nummer);
const_genwert=gendezwert;
dez_bin(const_genwert,SIZE,bin);
fitness= fitnessfkt(const_genwert);
fit_summe = fit_summe + fitness;
}
void Indi::Draw()
{
cout<<setw(6)<<nummer<<setw(6);
for(int i=0;i<=SIZE;i++){cout<<bin[i];};
cout<<setw(8)<<const_genwert<<setw(6)<<fitness<<"\n";
}
// Destruktor
/*Indi::~Indi()
{ delete [] pIndArray;
}
*/
// Hauptprogramm
// =============
int main()
{
int anzahl(0);
cout<<"Wieviele Individuen?";
cin>>anzahl;
cout<<"Wieviele Gene?";
cin>>SIZE;
Indi *pIndArray = new Indi[anzahl];
PrintTabellenkopf();
//pIndArray[].Draw(anzahl);
for(int i=0;i<anzahl;i++){pIndArray[i].Draw();};
cout << fit_summe << endl;
// PrintTabellenfuss(pIndArray, anzahl);
system("PAUSE");
return 0;
}
Vielen Dank!