码迷,mamicode.com
首页 > 编程语言 > 详细

智能算法-遗传算法

时间:2016-06-08 06:51:44      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:

目的:

了解遗传算法,并解决如下问题。已知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 }

 

智能算法-遗传算法

标签:

原文地址:http://www.cnblogs.com/barrier/p/5568846.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!