Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我每次都会在不同的一行代码中发现一个分段错误。C++;_C++_Segmentation Fault_Genetic Algorithm - Fatal编程技术网

C++ 我每次都会在不同的一行代码中发现一个分段错误。C++;

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

我正在写一个遗传算法程序。我使用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 = 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]