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

#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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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