📄 2005052119294741264.c
字号:
# include<time.h>
# include<stdio.h>
# include<stdlib.h>
# include<math.h>
# define CHROMLENGTH 15
# define POPSIZE 20
int max=150;
double pc=0.85;
double pm=0.001;
int pe[6][15]={{1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,},{1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,},{1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,},{1,0,0,0,0,1,0,0,1,0,0,0,0,0,0},{1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},{1,0,0,0,0,0,0,0,01,0,0,0,1,0}};
struct individual
{ int chrom[CHROMLENGTH];
double fitness;
};
int generation;
int best_index;
int worst_index;
struct individual bestindividual;
struct individual worstindividual;
struct individual currentbest;
struct individual population[POPSIZE];
void generateinitialpopulation (void);
void generatenextpopulation (void);
void evaluatepopulation (void);
void calculatefitnessvalue (void);
void findbestandworstindividual (void);
void performevolution (void);
void crossoveroperator (void);
void mutationoperator (void);
void outputtextreport (void);
void selectionoperator (void);
void main()
{int generation;
generation=0;
generateinitialpopulation();
evaluatepopulation();
while (generation<max)
{generation++;
generatenextpopulation();
evaluatepopulation();
performevolution();
outputtextreport();
}
}
void generateinitialpopulation (void)
{int i,j;
int n;
srand(time(NULL));
for(i=0;i<POPSIZE;i++)
{for(j=0;j<CHROMLENGTH;j++)
n=rand()%20;
{population[i].chrom[j]=(n<10)?0:1;}
}
}
void generatenextpopulation (void)
{selectionoperator();
crossoveroperator();
mutationoperator();
}
void evaluatepopulation (void)
{calculatefitnessvalue();
findbestandworstindividual();
}
void calculatefitnessvalue (void)
{float a,b,c,r;
int m,n,i;
for(i=0;i<POPSIZE;i++)
{r=0.0;
for(m=0;m<6;m++)
{a=0.0;
b=0.0;
c=0.0;
for(n=0;n<15;n++)
{a+=pe[m][n]*population[i].chrom[n];
b+=pe[m][n]*pe[m][n];
c+=population[i].chrom[n]*population[i].chrom[n];
}
r+=a/(b*c);
}
population[i].fitness=(1/15.0)*r/(2.0-(1/15.0)*r);
}
}
void findbestandworstindividual (void)
{int i;
double sum=0.0;
bestindividual=population[0];
worstindividual=population[0];
for(i=1;i<POPSIZE;i++)
{if(population[i].fitness>bestindividual.fitness)
{bestindividual=population[i];
best_index=i;
}
else if(population[i].fitness<worstindividual.fitness)
{worstindividual=population[i];
worst_index=i;
}
sum+=population[i].fitness;
}
if(generation==0)
{currentbest=bestindividual;
}
else
{if(bestindividual.fitness>currentbest.fitness)
currentbest=bestindividual;
}
}
void performevolution (void)
{if(bestindividual.fitness>currentbest.fitness)
{currentbest=population[best_index];
}
else
{population[worst_index]=currentbest;
}
}
void selectionoperator (void)
{ int i,j,index;
double p,sum=0.0;
double cfitness[POPSIZE];
struct individual newpopulation[POPSIZE];
for(i=0;i<POPSIZE;i++)
{ sum+=population[i].fitness;
}
for(i=0;i<POPSIZE;i++)
{cfitness[i]=population[i].fitness/sum;}
for(i=1;i<POPSIZE;i++)
{cfitness[i]=cfitness[i-1]+cfitness[i];
}
for(i=0;i<POPSIZE;i++)
{p=rand()%1000/1000.0;
index=0;
while(p>cfitness[index])
{index++;
}
newpopulation[i].fitness=population[index].fitness;
for(j=0;j<15;j++)
{newpopulation[i].chrom[j]=population[index].chrom[j];
}
}
for(i=0;i<POPSIZE;i++)
{population[i].fitness=newpopulation[i].fitness;
for(j=0;j<15;j++)
{population[i].chrom[j]=newpopulation[i].chrom[j];
}
}
}
void crossoveroperator (void)
{int i,j,m,d;
int index[POPSIZE];
int point,temp;
double p;
int ch;
for(i=0;i<POPSIZE;i++)
{d=rand()%(POPSIZE-i);
point=d;
temp=index[i];
index[i]=index[point+i];
index[point+i]=temp;
}
for(i=0;i<POPSIZE-1;i+=2)
{p=rand()%1000/1000.0;
if(p<pc)
{m=rand()%(CHROMLENGTH-1);
point=m;
for(j=point;j<CHROMLENGTH;j++)
{ch=population[index[i]].chrom[j];
population[index[i]].chrom[j]=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]=ch;
}
}
}
}
void mutationoperator (void)
{int i,j;
double p;
for(i=0;i<POPSIZE;i++)
{for(j=0;j<CHROMLENGTH;j++)
{p=rand()%1000/1000.0;
if(p<pm)
{population[i].chrom[j]=population[i].chrom[j]==0?1:0;
}
}
}
}
void outputtextreport (void)
{int i;
double sum;
double average;
sum=0.0;
for(i=0;i<POPSIZE;i++)
{sum+=population[i].fitness;
}
average=sum/POPSIZE;
printf("gen=%d,avg=%f,best=%f",generation,average,currentbest.fitness);
for(i=0;i<CHROMLENGTH;i++)
{printf("%d",currentbest.chrom[i]);
}
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -