c++ - 我每次都在不同的行收到此代码的段错误。 C++

标签 c++ segmentation-fault genetic-algorithm

我正在编写一个遗传算法程序。我使用 Linux(操作系统)、c++(语言)和 g++(编译器)。 以下代码生成段错误。问题是它有时会运行 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);
    }

}

变量值: 人口 = 20; n 基因 = 3;交叉点 = 1;

可能性是根据 parent 的健康水平选择 parent 的可能性。 pg 是父基因。 [人口][nGenes]。

提前致谢。

最佳答案

查看您提供的值,您对 tmp 的索引似乎没问题。如果您看到段错误的行是

tmp[ k ][ p ] = parents[ parent1 ][ p ];
tmp[ k + 1 ][ p ] = parents[ parent2 ][ p ];

这一定是因为使用 [parentN][p]parents 进行了索引。 parents 的尺寸是多少? getParent(...) 是否保证返回到 parents 的有效索引?

关于c++ - 我每次都在不同的行收到此代码的段错误。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16347554/

相关文章:

c++ - 当使用超过 1 个逻辑核心时,TBB 减少会导致段错误

c++ - 简单策略模式中的错误

algorithm - 最小延迟图算法

algorithm - 遗传算法-子集和问题

c++ - 将 float 保存在文本文件中并从文本文件中加载它们(OpenGL 和 C++)

C++机票费用计算项目

C++按字母顺序对结构 vector 进行排序

c++ - 注入(inject)的类名作为类型

创建头文件并在 C 中测试它

java - 使用JGAp(遗传算法库)和复制的染色体