目的:
了解遗传算法,并解决如下问题。已知N个向量,他们属于同一个类,寻找描述此类的"特点向量"P = ( y1,y2,y3,y4,y5 ),使之满足如下目标:累计N个绝对值的cos<Xi,P>最小。(这两天没写题是在搞这个╮(╯▽╰)╭)
遗传算法模拟了自然选择的过程,其一般步骤:
开始循环:
1.评估每条染色体所对应个体的适应度。
2.遵照适应度越高,选择概率越大的原则,从种群中选择两个个体作为父方和母方。
3.抽取父母双方的染色体,进行交叉,产生子代。
4.对子代的染色体进行变异。
5.重复2,3,4步骤,直到新种群的产生。
结束循环。
由此构建代码,代码如下:
1 #include<cstdio> 2 #include<cmath> 3 #include<ctime> 4 #include<algorithm> 5 #include<cstring> 6 #define EPS 1e-8 7 #define MAX_X 200 8 #define SAVE 0.25 /*保留比例*/ 9 #define MAX_Y 400 /*种群数量*/ 10 #define MAX_GENS 50000 /*最大代数*/ 11 #define PXCOVER 0.8 /*交叉概率*/ 12 #define PMUTATION 0.05 /*变异概率*/ 13 #define PA 0.01 /*交叉因子*/ 14 #define PM 0.8 /*变异因子*/ 15 #define N 6 /*向量维度*/ 16 using namespace std; 17 struct Xvector{ /*向量x*/ 18 double vec[N]; 19 double mod; 20 }; 21 struct Yvector{ /*向量y*/ 22 double vec[N]; 23 double mod; 24 double fitness; 25 double fitsum; /*存储转盘选择值*/ 26 }; 27 Xvector x[MAX_X]; /*已知n个向量x*/ 28 Yvector y[MAX_Y]; 29 Yvector newy[MAX_Y]; 30 Yvector fity; /*适应度最大的y*/ 31 bool index[MAX_Y]; 32 int n; /*向量x的个数*/ 33 int generation; /*代数*/ 34 double lower[N],upper[N]; 35 void inputX(); 36 void inputY(); 37 double randval(double lower,double upper);/*给定上下限给出随机值*/ 38 void evaluate(); /*评价*/ 39 void select(); /*选择*/ 40 void xcover(); /*交叉*/ 41 void mutate(); /*变异*/ 42 void copyy(); /*复制*/ 43 void findmaxfit(); /*寻找适应度最大的y*/ 44 bool compare(Yvector a,Yvector b); 45 int main(void){ 46 srand(time(NULL)); 47 freopen("input.txt","r",stdin); 48 freopen("output.txt","w",stdout); 49 inputX(); 50 inputY(); 51 evaluate(); 52 while(generation<=MAX_GENS){ 53 select(); 54 copyy(); 55 xcover(); 56 mutate(); 57 evaluate(); 58 findmaxfit(); 59 } 60 printf("种群数量: %d\n",MAX_Y); 61 printf("经历年代: %d\n",MAX_GENS); 62 printf("保留比例: %.2lf\n",SAVE); 63 printf("交叉概率: %.2lf\n",PXCOVER); 64 printf("变异概率: %.2lf\n",PMUTATION); 65 printf("交叉因子: %.2lf\n",PA); 66 printf("变异因子: %.2lf\n",PM); 67 printf("Y = (%lf,%lf,%lf,%lf,%lf,%lf)\n",fity.vec[0],fity.vec[1],fity.vec[2],fity.vec[3],fity.vec[4],fity.vec[5]); 68 printf("fitness = %lf\n",fity.fitness); 69 printf("f(x) = %lf\n",1.0/fity.fitness); 70 fclose(stdin); 71 fclose(stdout); 72 return 0; 73 } 74 void inputX(){ 75 scanf("%d",&n); 76 for(int i=0;i<n;++i){ 77 double mod=0; 78 for(int j=0;j<N;++j){ 79 scanf("%lf",&x[i].vec[j]); 80 mod+=x[i].vec[j]*x[i].vec[j]; 81 } 82 x[i].mod=sqrt(mod); 83 } 84 } 85 void inputY(){ 86 for(int i=0;i<N;++i){ 87 scanf("%lf%lf",&lower[i],&upper[i]); 88 for(int j=0;j<MAX_Y;++j){ 89 y[j].vec[i]=randval(lower[i],upper[i]); 90 } 91 } 92 } 93 double randval(double lower,double upper){ 94 return lower+1.0*rand()/RAND_MAX*(upper-lower); 95 } 96 void evaluate(){ 97 for(int i=0;i<MAX_Y;++i){ 98 double mod=0; 99 for(int j=0;j<N;++j){ 100 mod+=y[i].vec[j]*y[i].vec[j]; 101 } 102 y[i].mod=sqrt(mod); 103 } 104 double fit=0; 105 for(int i=0;i<MAX_Y;++i){ 106 double temp=0; 107 for(int j=0;j<n;++j){ 108 double xy=0; 109 for(int k=0;k<N;++k){ 110 xy+=y[i].vec[k]*x[j].vec[k]; 111 } 112 temp+=fabs((y[i].mod*x[j].mod)/xy); 113 } 114 fit+=temp; 115 y[i].fitness=temp; 116 } 117 sort(y,y+MAX_Y,compare); 118 double temp=0; 119 for(int i=0;i<MAX_Y;++i){ 120 temp+=y[i].fitness; 121 y[i].fitsum=temp/fit; 122 } 123 } 124 void select(){ 125 for(int i=0;i<MAX_Y*SAVE;++i){ 126 newy[i]=y[i]; 127 } 128 for(int i=MAX_Y*SAVE;i<MAX_Y;++i){ 129 double rand=randval(0,1); 130 for(int j=0;j<MAX_Y;++j){ 131 if(y[j].fitsum>rand||fabs(y[j].fitness-rand)<=EPS){ 132 newy[i]=y[j]; 133 break; 134 } 135 } 136 } 137 copyy(); 138 generation++; 139 /* 140 printf("******************************************************************\n"); 141 printf("\tgeneration: %d\n",generation); 142 for(int i=0;i<MAX_Y;++i){ 143 for(int j=0;j<N;++j){ 144 printf("%10lf ",y[i].vec[j]); 145 } 146 printf("\n"); 147 } 148 printf("******************************************************************\n"); 149 */ 150 } 151 void copyy(){ 152 memset(y,0,sizeof(y)); 153 for(int i=0;i<MAX_Y;++i){ 154 for(int j=0;j<N;++j){ 155 y[i].vec[j]=newy[i].vec[j]; 156 } 157 } 158 } 159 void xcover(){ 160 memset(index,0,sizeof(index)); 161 for(int i=0;i<MAX_Y;++i){ 162 int temp; 163 do{ 164 temp=rand()%MAX_Y; 165 }while(index[temp]); 166 index[temp]=1; 167 double p=1.0*rand()/RAND_MAX; 168 if(p<PXCOVER||fabs(p-PXCOVER)<=EPS){ 169 for(int j=0;j<N;++j){ 170 double t=y[i].vec[j]; 171 y[i].vec[j]=(1-PA)*y[i].vec[j]+PA*y[temp].vec[j]; 172 y[temp].vec[j]=(1-PA)*y[temp].vec[j]+PA*t; 173 } 174 } 175 } 176 } 177 void mutate(){ 178 for(int i=0;i<MAX_Y;i++){ 179 double p=1.0*rand()/RAND_MAX; 180 if(p<PMUTATION||fabs(p-PMUTATION)<=EPS){ 181 int temp=rand()%2; 182 if(temp){ 183 for(int j=0;j<N;++j){ 184 y[i].vec[j]=y[i].vec[j]+PM*(upper[j]-y[i].vec[j])*(1.0*rand()/RAND_MAX); 185 } 186 }else{ 187 for(int j=0;j<N;++j){ 188 y[i].vec[j]=y[i].vec[j]-PM*(y[i].vec[j]-lower[j])*(1.0*rand()/RAND_MAX); 189 } 190 } 191 } 192 } 193 } 194 void findmaxfit(){ 195 if(y[0].fitness>fity.fitness||fabs(y[0].fitness-fity.fitness)<=EPS) 196 fity=y[0]; 197 } 198 bool compare(Yvector a,Yvector b){ 199 return a.fitness>b.fitness; 200 }
时间: 2024-12-15 01:37:26