einen wunderschönen guten tag,
folgende funktion soll aus einen vector p, der elemente der klasse individual beinhaltet, elemente der anzahl size auswählen und in einen neuen vector i speichern. damit keine elemente doppelt ausgewählt werden können, werden diese aus dem vector gelöscht. dies geschieht mit einen iterator it und der funktion erase() und genau dort ist das problem. im iterator wird das richtige element hinterlegt, beim aufruf der funktion p.erase(it) stürzt das programm ab. beim compilieren konnte kein fehler gefunden werden.
hier die funktion:
hier noch die klasse individual:
und die mutter-klasse fitness mit der verwendeten funktion get_rang():
gruss
mizi
folgende funktion soll aus einen vector p, der elemente der klasse individual beinhaltet, elemente der anzahl size auswählen und in einen neuen vector i speichern. damit keine elemente doppelt ausgewählt werden können, werden diese aus dem vector gelöscht. dies geschieht mit einen iterator it und der funktion erase() und genau dort ist das problem. im iterator wird das richtige element hinterlegt, beim aufruf der funktion p.erase(it) stürzt das programm ab. beim compilieren konnte kein fehler gefunden werden.
hier die funktion:
C++:
vector<individual> selectionParetoWtkfDel(vector<individual> p, int size) {
const int ANZCONTESTANTS = 5;
int z;
int bestIndex;
float bestRang;
vector<individual> e;
vector<individual>::iterator it;
e.reserve(size);
// Bilden des neuen Vectors
for(int i=size; i<size; i++) {
bestIndex = 0;
bestRang = 100000;
// Auswahl des Elements
for(int j=0; j<ANZCONTESTANTS; j++) {
z = rand()%a.size();
if(p[z].get_rang() < bestRang) {
bestIndex = z;
bestRang = p[z].get_rang();
}
}
e.push_back(p[bestIndex]);
it = p.begin()+bestIndex; // Klappt noch, mit richtigen Element
p.erase(it); // Klappt nicht, führt zu Absturz, kein Compilierfehler
}
return e;
}
hier noch die klasse individual:
C++:
class individual : public arguments, public values, public fitness { // Klasse für Lösungskandidat
public:
individual(const individual &indi); // Copy-Konstruktor für Klasse individual
individual(string *initAtt, // Konstruktor für Klasse individual
string *initArg,
string *initCon,
string *initVal,
string &initFit);
~individual(); // Destruktor für Klasse individual
void valuation(void); // Bewertung des Lösungskandidaten
void print(void); // Ausgabe auf Bildschrim
void print(string file); // Ausgabe in Datei
};
und die mutter-klasse fitness mit der verwendeten funktion get_rang():
C++:
class fitness { // Klasse für Fitnesswerte
protected:
int anzFit; // Anzahl der zu optimierenden Ziele (im Sinne des Optimierungsproblems)
float* fit; // Fitnessvektor
float* sharing; // Sharingwert
int rang; // Rang
void set_fitness(values &val); // Funktion zur Berechnung der Fitness
public:
fitness(const fitness &f); // Copy-Konstruktor für Fitness
fitness(string &initFit); // Konstruktor für die Klasse fitness
~fitness(); // Destruktor für die Klasse fitness
int get_anzFitness(void) { return anzFit; } // Funktion zum Abrufen der Anzahl der Fitnesskriterien
float get_fitness(int index) const { return fit[index]; } // Funktion zum Abrufen der Fitness
float get_sharing(int index) { return sharing[index]; } // Funktion zum Abrufen des Sharingswerts
int get_rang(void) const { return rang; } // Funktion zum Abrufen des Rangs
void set_fitness(int index, float fitn) {fit[index] = fitn; } // Funktion zum Speichern der Fitness
void set_sharing(int index, float share) { sharing[index] = share; } // Funktion zum Speichern des Sharingswerts
void set_rang(int r) { rang = r; } // Funktion zum Speichern des Rangs
};
gruss
mizi