2016-06-05 33 views
-6

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.

+7

Bitte einen Beitrag [Minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve). –

+0

besser? Mit diesen Codes passiert der Fehler. – Dekonunes

+2

Post etwas, das ausgeführt werden kann, hat eine Main, enthält die richtigen Header und zeigt das Problem beim Ausführen ... –

Antwort

0

Es gibt nicht genug Code, um das Problem wirklich zu analysieren. Bitte posten Sie die Klassendefinition für IndividuoBinario.

Von dem, was Sie hier gepostet haben, würde ich denken, dass es ein Problem mit dem Kopierkonstruktor oder der Kopierzuweisung für IndividuoBinario gibt. Cromossimo scheint korrumpiert zu sein.

Sie verwenden nicht memcpy, um diese Zeichenfolgen zu kopieren?

Btw, der Grund, dass es für kleine Strings nicht abstürzt, kann auf kleine String-Optimierung zurückzuführen sein, wo der Wert im Objekt statt auf dem Heap gespeichert wird (siehe Meaning of acronym SSO in the context of std::string). Aber deine Zeichenfolge ist in jedem Fall beschädigt.

1

Ein offensichtliches Problem ist, dass Sie, in rollet() definieren

int individuoParaCross[1]; 

so ein C-Stil-Array der Größe 1, und verwenden Sie es als eine Array o Größe 2

individuoParaCross[loop] = var; // with loop in [0,2[ 
// ... 
newIndivuos = crossoverUniforme(individuoParaCross[0], individuoParaCross[1]);