⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2005052119294741264.c

📁 遗传算法,网络故障的源代码!值得学习!欢迎下载!
💻 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 + -