【发布时间】:2016-10-04 22:22:48
【问题描述】:
我遇到了一个奇怪的问题。我正在开发一种遗传算法。
我有一个名为IndividuoBinario 的类和私有string cromossomo; 在这个类的构造器中放置this->cromossomo = "1111111111111111"; 和16 个元素,当调用像IndividuoBinario newIndividuo; 这样的类时工作正常,但是当我用像@ 这样的函数对调用时987654326@ 发生分段错误。但奇怪的是,当我使用少于 16 个元素的 this->cromossomo = "111111111111111"; 时工作正常。
恢复:当函数对调用一个类并在字符串中放入超过 16 个元素时会发生分段错误。
一些重要的代码:
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;
}
抱歉,英语不好。
【问题讨论】:
-
更好?有了这个代码,就会发生错误。
-
发布可以运行的东西,有一个主要的,包括正确的标题并在运行时显示问题......
-
不想做 Complete 和 Verifiable 部分是吗?
-
您在遇到错误的地方发布了代码。但我们需要的是实际导致它的代码。我们需要一些可以在我们的机器上编译和运行的东西,否则我们无法为您提供帮助。
标签: c++ string segmentation-fault bits