基因算法实现中的奇怪现象

#include <stdio.h>#include <stdlib.h>#include <time.h>#define SIZE 8#define POP 8int answers[SIZE] = {5,3,1,7,4,6,0,2};int getRand(int mod){    if (mod==0) return 0;    else return random()%mod;}void printArray(int array[]){    int i;    for(i=0; i<SIZE-1; i++) printf("(%i,%i),",i,array[i]);    printf("(%i,%i)",SIZE-1,array[SIZE-1]);    printf("\n");}int getWeight(int array[]){    int weight = 28;    int queen;    for(queen=0;queen<SIZE;queen++){ //for each queen        int nextqueen;        for(nextqueen=queen+1;nextqueen<SIZE;nextqueen++){ //for each of the other queens (nextqueen = queen to avoid counting pairs twice)            if(array[queen] == array[nextqueen] || abs(queen-nextqueen)==abs(array[queen]-array[nextqueen])){ //if conflict                weight--;            }        }    }    return weight;}void geneticAlgorithm(){    int population[POP][SIZE];    int children[POP][SIZE];    int weightProb[] = {};    int wpl = 0; //weightProb[] length    float mutProb = 0.05;    int done = 0;    int i;    for(i=0;i<POP;i++) for(int j=0;j<SIZE;j++) population[i][j] = getRand(SIZE);    while(done == 0){        for(i=0;i<POP;i++){            if(getWeight(children[i]) == 28){                printf("solution: ");                printArray(children[i]);                done = 1;            }        }        for(i=0;i<wpl;i++) weightProb[i] = (int)NULL; //clear weightprob        wpl=0;        //weighted probability distribution        for(i=0;i<POP;i++){            int w = getWeight(population[i]);            for(int j=0;j<w;j++){                weightProb[wpl] = i; //fill array with member number w times                wpl++;            }        }        //reproduce        for(i=0;i<POP;i+=2){            int par1 = weightProb[getRand(wpl)];            int par2 = weightProb[getRand(wpl)];            int split = getRand(SIZE);            //crossover            for(int j=0;j<split;j++){                children[i][j] = population[par1][j];                children[i+1][j] = population[par2][j];            }            for(int j=split;j<SIZE;j++){                children[i][j] = population[par2][j];                children[i+1][j] = population[par1][j];            }            //mutation            if(getRand(1000000)<=mutProb*1000000){                int child=getRand(2);                if(child == 0) children[i][getRand(SIZE)] = getRand(SIZE);                else children[i+1][getRand(SIZE)] = getRand(SIZE);            }        }        for(i=0;i<POP;i++) for(int j=0;j<SIZE;j++) population[i][j] = children[i][j];        wpl = 0;    }}int main(int argc, const char * argv[]){    srandom((unsigned int)time(NULL)); //seed random    geneticAlgorithm();    return 0;}

在填充weightProb[]时,人口随机变化。我使用打印语句调试过,当wpl++被注释掉时它会停止,但这是必需的(wpl是weightProb数组的长度)。这是怎么发生的?


回答:

这个声明:

int weightProb[] = {};

声明了一个数组。这意味着每次你写入一个元素时,你都在数组边界之外写入,这样会发生不好的事情。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注