c语言编程没错提示错误,c语言编程出错,求大神指导

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

这是基本的遗传算法示例,这个程序是照着书上抄的,能运行但是没有任何输出,求指导,哪里出错了

#include

#include

#include

#define POPSIZE 50

#define MAXGENS 1000

#define NVARS 3

#define PXOVER 0.8

#define PMUTATION 0.15

#define TRUE 1

#define FALSE 0

int generation;

int cur_best;

FILE *galog;

struct genotype

{

double gene[NVARS];

double fitness;

double upper[NVARS];

double lower[NVARS];

double rfitness;

double cfitness;

};

struct genotype population[POPSIZE+1];

struct genotype newpopulation[POPSIZE+1];

void initialize(void);

double randval(double,double);

void evaluate(void);

void keep_the_best(void);

void elitist(void);

void select(void);

void crossover(void);

void Xover(int,int);

void swap(double *,double *);

void mutate(void);

void report(void);

void initialize(void)

{

FILE *infile;

int i,j;

double lbound,ubound;

if((infile=fopen("gadata.txt","r"))==NULL)

{

fprintf(galog,"\nCannot open input file! \n");

exit(1);

}

for(i=0;i

{

fscanf(infile,"%if",&lbound);

fscanf(infile,"%if",&ubound);

for (j=0;j

{

population[j].fitness=0;

population[j].rfitness=0;

population[j].cfitness=0;

population[j].lower[i]=lbound;

population[j].upper[i]=ubound;

population[j].gene[i]=randval(population[j].lower[i],

population[j].upper[i]);

}

}

fclose(infile);

}

double randval(double low,double high)

{

double val;

val=((double)(rand()%1000)/1000.0)*(high-low)+low;

return(val);

}

void evaluate(void)

{

int mem;

int i;

double x[NVARS+1];

for(mem=0;mem

{

for(i=0;i

x[i+1]=population[mem].gene[i];

population[mem].fitness=(x[1]*x[1])-(x[1]*x[2])+x[3];

}

}

void keep_the_best()

{

int mem;

int i;

cur_best=0;

for(mem=0;mem

{

if(population[mem].fitness>population[POPSIZE].fitness)

{

cur_best=mem;

population[POPSIZE].fitness=population[mem].fitness;

}

}

for(i=0;i

population[POPSIZE].gene[i]=population[cur_best].gene[i];

}

void elitist()

{

int i;

double best,worst;

int best_mem,worst_mem;

best=population[0].fitness;

worst=population[0].fitness;

for(i=0;i

{

if(population[i].fitness>population[i+1].fitness)

{

if(population[i].fitness>=best)

{

best=population[i].fitness;

best_mem=i;

}

if(population[i+1].fitness<=worst)

{

worst=population[i+1].fitness;

worst_mem=i+1;

}

}

else

{

if(population[i].fitness<=worst)

{

worst=population[i].fitness;

worst_mem=i;

}

if(population[i+1].fitness>=best)

{

best=population[i+1].fitness;

best_mem=i+1;

}

}

}

if(best>=population[POPSIZE].fitness)

{

for(i=0;i

population[POPSIZE].gene[i]=population[best_mem].gene[i];

population[POPSIZE].fitness=population[best_mem].fitness;

}

else

{

for(i=0;i

population[worst_mem].gene[i]=population[POPSIZE].gene[i];

population[worst_mem].fitness=population[POPSIZE].fitness;

}

}

void select(void)

{

int mem,i,j,k;

double sum=0;

double p;

for(mem=0;mem

{

sum+=population[mem].fitness;

}

for(mem=0;mem

{

population[mem].rfitness=population[mem].fitness/sum;

}

population[0].cfitness=population[0].rfitness;

for(mem=1;mem

{

population[mem].cfitness=population[mem-1].cfitness+population[mem].rfitness;

}

for(i=0;i

{

p=rand()%1000/1000.0;

if(p

newpopulation[i]=population[0];

else

{

for(j=0;j

if(p>=population[j].cfitness&&p

newpopulation[i]=population[j+1];

}

}

for(i=0;i

population[i]=newpopulation[i];

}

void crossover(void)

{

int i,mem,one;

int first=0;

double x;

for(mem=0;mem

{

x=rand()%1000/1000.0;

if(x

{

++first;

if(first%2==0)

Xover(one,mem);

else

one=mem;

}

}

}

void Xover(int one,int two)

{

int i;

int point;

if(NVARS>1)

{

if(NVARS==2)

point=1;

else

point=(rand()%(NVARS-1))+1;

for(i=0;i

swap(&population[one].gene[i],&population[two].gene[i]);

}

}

void swap(double *x,double *y)

{

double temp;

temp=*x;

*x=*y;

*y=temp;

}

void mutate(void)

{

int i,j;

double lbound,hbound;

double x;

for(i=0;i

for(j=0;j

{

x=rand()%1000/1000.0;

if(x

{

lbound=population[i].lower[j];

hbound=population[i].upper[j];

population[i].gene[j]=randval(lbound,hbound);

}

}

}

void report(void)

{

int i;

double best_val;

double avg;

double stddev;

double sum_square;

double square_sum;

double sum;

sum=0.0;

sum_square=0.0;

for(i=0;i

{

sum+=population[i].fitness;

sum_square+=population[i].fitness*population[i].fitness;

}

avg=sum/(double)POPSIZE;

square_sum=avg*avg*POPSIZE;

stddev=sqrt((sum_square-square_sum)/(POPSIZE-1));

best_val=population[POPSIZE].fitness;

fprintf(galog,"\n%5d,%6.3f,%6.3f,%6.3f\n\n",generation,

best_val,avg,stddev);

}

void main(void)

{

int i;

if((galog=fopen("galog.txt","w"))==NULL)

{

exit(1);

}

generation=0;

fprintf(galog,"\n generation best average standard \n");

fprintf(galog,"number value fitness deviation \n");

initialize();

evaluate();

keep_the_best();

while(generation

{

generation++;

select();

crossover();

mutate();

report();

evaluate();

elitist();

}

fprintf(galog,"\n\n Simulation completed\n");

fprintf(galog,"\n Best member:\n");

for(i=0;i

{

fprintf(galog,"\n var(%d)=%3.3f",i,population[POPSIZE].gene[i]);

}

fprintf(galog,"\n\n Best fitness=%3.3f",population[POPSIZE].fitness);

fclose(galog);

printf("Success\n");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值