Ich stieß auf ein seltsames Problem. Ich entwickle einen genetischen Algorithmus.segmentation fault wenn string 16 oder mehr Elemente haben
Ich habe eine Klasse IndividuoBinario
mit eigenen string cromossomo;
in construtor dieser Klasse setzte namens this->cromossomo = "1111111111111111";
mit 16 Elementen, wenn eine dieser Klasse wie IndividuoBinario newIndividuo;
funktionieren nennen, aber wenn ich mit fuction Paaren wie pair<IndividuoBinario, IndividuoBinario> newIndividuosCrossover;
rufen Sie einen Segmentierungsfehler passieren. Aber das Merkwürdige ist, dass, wenn ich this->cromossomo = "111111111111111";
mit weniger als 16 Elemente arbeiten gut funktioniert.
Resume: wenn eine Klasse von function Paar aufrufen und mehr als 16 Elemente in Zeichenfolge setzen passieren eine Segmentierung Fehler.
Einige wichtige Hinweise:
void main() {
PopulacaoBinario pop;
pop = pop.rollet();
}
const PopulacaoBinario PopulacaoBinario::rollet() {
static mt19937 mt(time(NULL));
pair<IndividuoBinario, IndividuoBinario> newIndivuos;
static PopulacaoBinario newPop;
newPop.populacao.clear();
int var, valorDaRollet = 0, individuoParaCross[1] { 0 }, auxInsertIndv = 0;
double valorTotalFitness = 0.0, valorAcumuladoFitness = 0.0;
for (var = 0; var < this->qtdIndividuos; ++var) {
if (this->fitnessEscalonado)
valorTotalFitness += calculoFitnessEscalonado(this->populacao[var].getFitness());
else
valorTotalFitness += this->populacao[var].getFitness();
}
for (int loopNovosIndiv = 0; loopNovosIndiv < (this->qtdIndividuos * this->gap)/2;
++loopNovosIndiv) {
for (int loop = 0; loop < 2; ++loop) {
static uniform_int_distribution<int> numeroRandom(0, 100);
valorDaRollet = numeroRandom(mt);
for (var = 0; var < this->qtdIndividuos - 1; ++var) {
if (this->fitnessEscalonado)
valorAcumuladoFitness += ((double) calculoFitnessEscalonado(
this->populacao[var].getFitness())/valorTotalFitness) * 100;
else
valorAcumuladoFitness += ((double) this->populacao[var].getFitness()
/valorTotalFitness) * 100;
if (valorDaRollet < valorAcumuladoFitness)
break;
}
valorAcumuladoFitness = 0;
individuoParaCross[loop] = var;
}
newIndivuos = crossoverUniforme(individuoParaCross[0], individuoParaCross[1]);
newPop.insertIndividuo(newIndivuos.first);
newPop.insertIndividuo(newIndivuos.second);
}
for (int count = newPop.getQtdIndividuos(); count < this->qtdIndividuos; ++count)
newPop.insertIndividuo(this->populacao[count]);
return newPop;
}
const pair<IndividuoBinario, IndividuoBinario> PopulacaoBinario::crossoverUniforme(int individuo1,
int individuo2) {
static mt19937 mt(time(NULL));
static uniform_int_distribution<int> bit(1, 99);
int var, a = bit(mt);
int qtdBits = this->populacao[individuo1].getCromossomo().size();
cout << "Before pair" << endl;
pair<IndividuoBinario, IndividuoBinario> newIndividuosCrossover;
cout << "not enough in this line" << endl;
IndividuoBinario newIndividuo1 = this->populacao[individuo1];
IndividuoBinario newIndividuo2 = this->populacao[individuo2];
if (this->chanceCrossover > a) {
string cromossomoNewInviduio1 = this->populacao[individuo1].getCromossomo();
string cromossomoNewInviduio2 = this->populacao[individuo2].getCromossomo();
for (int var = 0; var < this->populacao[individuo1].getCromossomo().size(); ++var) {
static uniform_int_distribution<int> numRandon(0, 1);
a = numRandon(mt);
if (a == 1) {
cromossomoNewInviduio1[var] = this->populacao[individuo2].getCromossomo()[var];
cromossomoNewInviduio2[var] = this->populacao[individuo1].getCromossomo()[var];
}
}
newIndividuo1.setCromossomo(cromossomoNewInviduio1);
newIndividuo2.setCromossomo(cromossomoNewInviduio2);
}
newIndividuosCrossover = make_pair(newIndividuo1, newIndividuo2);
return newIndividuosCrossover;
}
IndividuoBinario::IndividuoBinario() {
this->cromossomo = "1111111111111111"; //segmentation fault
this->cromossomo = "111111111111111"; //normal
cout << this->cromossomo << endl;
}
Leider von der schlechten Englisch.
Bitte einen Beitrag [Minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve). –
besser? Mit diesen Codes passiert der Fehler. – Dekonunes
Post etwas, das ausgeführt werden kann, hat eine Main, enthält die richtigen Header und zeigt das Problem beim Ausführen ... –