C++ 我每次都会在不同的一行代码中发现一个分段错误。C++;
我正在写一个遗传算法程序。我使用Linux(OS),C++(语言)和G++(编译器)。 以下代码生成seg故障。问题是,它有时运行50多次,有时一次也没有。加上错误发生在任何tmp[k][p]或tmp[k+1][p]赋值行中。我是不是遗漏了什么C++ 我每次都会在不同的一行代码中发现一个分段错误。C++;,c++,segmentation-fault,genetic-algorithm,C++,Segmentation Fault,Genetic Algorithm,我正在写一个遗传算法程序。我使用Linux(OS),C++(语言)和G++(编译器)。 以下代码生成seg故障。问题是,它有时运行50多次,有时一次也没有。加上错误发生在任何tmp[k][p]或tmp[k+1][p]赋值行中。我是不是遗漏了什么 int** GeneticAlgorythm::newGeneration( int** parents ) { int** tmp = new int*[ population ]; int p = 0; for( int k
int** GeneticAlgorythm::newGeneration( int** parents )
{
int** tmp = new int*[ population ];
int p = 0;
for( int k = 0; k < population; k += 2 )
{
tmp[ k ] = new int[ nGenes ];
tmp[ k + 1 ] = new int[ nGenes ];
setLikelihood( parents );
int parent1 = getParent( likelyhood );
int parent2 = getParent( likelyhood );
while( parent1 == parent2 )
{
parent2 = getParent( likelyhood );
}
for( p = 0; p < crossOverPoint; p++ )
{
tmp[ k ][ p ] = parents[ parent1 ][ p ];
tmp[ k + 1 ][ p ] = parents[ parent2 ][ p ];
}
for( p = crossOverPoint; p < nGenes; p++ )
{
tmp[ k ][ p ] = parents[ parent2 ][ p ];
tmp[ k + 1 ][ p ] = parents[ parent1 ][ p ];
}
}
currGeneration++;
return tmp;
}
int GeneticAlgorythm::getParent( double* lh )
{
int randVal = rand( ) % 100;
int* choose = new int[ 100 ];
int counter = 0;
for( int k = 0; k < population; k++ )
{
for( int j = 0; j < (int)likelyhood[ k ]; j++ )
{
choose[ counter++ ] = j;
}
}
counter = choose[ randVal ];
delete[] choose;
return counter;
}
void GeneticAlgorythm::setLikelihood( int** pg )
{
multipleInverse = 0;
double one = 1.00;
for( int mi = 0; mi < population; mi++ )
{
multipleInverse += one/checkFitness( pg[ mi ] );
}
for( int lh = 0; lh < population; lh++ )
{
likelyhood[ lh ] = round(((one/checkFitness( pg[ lh ] ))/multipleInverse) * 100);
}
}
int**geneticalgorithm::新一代(int**parents)
{
int**tmp=新int*[人口];
int p=0;
对于(int k=0;k
变量值:
人口=20;nGenes=3;交叉重叠点=1
可能性是指根据父母的健康水平选择父母的可能性。
pg为亲本基因。[人口][nGenes]
提前感谢。您的
tmp[k+1]
可能会越界。假设总体=3。在第二次循环运行时,您得到了i=2
,您得到了tmp[i+1]
,这是tmp[3],这超出了界限,可能会导致未定义的行为,因为您正在修改缓冲区空间之外的内存
除非你确信人口
总是一个偶数。你的tmp[k+1]
可能会越界。假设总体=3。在第二次循环运行时,您得到了i=2
,您得到了tmp[i+1]
,这是tmp[3],这超出了界限,可能会导致未定义的行为,因为您正在修改缓冲区空间之外的内存
除非您确定人口
始终为偶数。在此代码中:
int** tmp = new int* [population];
for (int k = 0; k < population; k += 2)
{
tmp[k] = new int[nGenes];
tmp[k + 1] = new int[nGenes];
...
}
int**tmp=newint*[population];
对于(int k=0;k
当population
为奇数时,tmp[k+1]
在上一次迭代中访问超出其边界的数组,这会产生未定义的行为。您很幸运地观察到由于分段错误导致的程序崩溃,否则此错误可能一直隐藏着。在此代码中:
int** tmp = new int* [population];
for (int k = 0; k < population; k += 2)
{
tmp[k] = new int[nGenes];
tmp[k + 1] = new int[nGenes];
...
}
int**tmp=newint*[population];
对于(int k=0;k
当population
为奇数时,tmp[k+1]
在上一次迭代中访问超出其边界的数组,这会产生未定义的行为。您很幸运地观察到由于分段错误导致的程序崩溃,否则此错误可能一直隐藏着。查看您提供的值,您对tmp
的索引似乎没有问题。如果你看到的断层线是
tmp[ k ][ p ] = parents[ parent1 ][ p ];
tmp[ k + 1 ][ p ] = parents[ parent2 ][ p ];
这必须是因为使用[parentN][p]
索引到父项中。
父母的维度是什么?getParent(…)
是否保证将有效索引返回到parents
中?查看您提供的值,您在tmp
中的索引似乎正常。如果你看到的断层线是
tmp[ k ][ p ] = parents[ parent1 ][ p ];
tmp[ k + 1 ][ p ] = parents[ parent2 ][ p ];
这必须是因为使用[parentN][p]
索引到父项中。
父母的维度是什么?getParent(…)
是否保证将有效索引返回到parents
?@Sarien您是对的,我没有注意到给定的变量值。哎呀,你总是试着用人口=20吗?我不知道还有什么会变坏。现在是20,直到我把问题解决为止。但我肯定会看看那些不均匀的值。我不知道为什么会出现seg错误,根据我的说法,代码应该可以正常工作。@Sarien你说得对,我没有注意到给出的变量值。哎呀,你总是试着用人口=20吗?我不知道还有什么会变坏。现在是20,直到我把问题解决为止。但我肯定会看看那些不均匀的值。我不知道为什么它会出现seg错误,根据我的说法,代码应该可以正常工作。setlikelibility()
做什么?父母的维度是什么?getParent(…)
是否保证返回有效的索引?setlikelion()为每个父级提供一个选择为父级的可能性(百分比)。适合度越高,进行断言的可能性越高(p<0.05)
另外,您需要知道错误是否发生在tmp[k][p]