1、遗传算法求解 f(x)=xcosx+2 的最大值其中在尺度变换部分应用到了类似模拟退火算法部分,所有变量均使用汉语拼音很好懂/中国电子科技集团公司 /第一研究室 /呼文韬 /hu_ /随机初始种群 /编码方式为格雷码 /选择方法为随机遍历 /采用了精英保存策略 /采用了自适应的交叉率和变异率 /采用了与模拟退火算法相结合的尺度变换 /采用了均匀交叉法 #include #include #include #include #include #include #include #define IM1 2147483563 #define IM2 2147483399 #define AM (1.
2、0/IM1) #define IMM1 (IM1-1) #define IA1 40014 #define IA2 40692 #define IQ1 53668 #define IQ2 52774 #define IR1 12211 #define IR2 3791 #define NTAB 32 #define NDIV (1+IMM1/NTAB) #define EPS 1.2e-7 #define RNMX (1.0-EPS) #define zhizhenjuli 0.005 #define PI 3.14159265358 #define T0 100000/温度要取得很高才行。
3、#define zhongqunshu1 200 #define zuobianjie -2000 #define youbianjie 2000 unsigned int seed=0; /seed 为种子,要设为全局变量 void mysrand(long int i) /初始化种子 seed = -i; long a1; /double hundun; /double c=4; /设置全局变量 struct individual unsigned *chrom; /染色体; double geti;/变量值 double shiyingdu; /目标函数的值; double fitnes
4、s; /变换后的适应度值; ; individual *zuiyougeti;/精英保存策略 int zhongqunshu; /种群大小 individual *nowpop;/当前代 individual *newpop;/新一代 double sumfitness;/当代的总适应度 fitness double sumshiyingdu;/当代的总适应度 shiyingdu double maxfitness;/最大适应度 double avefitness;/平均适应度 double maxshiyingdu;/最大适应度 double avgshiyingdu;/平均适应度 floa
5、t pc;/交叉概率 float pm;/变异概率 int lchrom;/染色体长度 int maxgen;/最大遗传代数 int gen;/遗传代数 /函数 int flipc(double ,double );/判断是否交叉 int flipm(double );/判断是否变异 int rnd(int low,int high);/产生 low 与 high 之间的任意数 void initialize();/遗传算法初始化 void preselectfitness(); /计算 sumfiness,avefitness,maxfitness void generation(); do
6、uble suijibianli();/产生随机遍历指针 int fuzhi(float );/选择要复制的个体 void crossover(individual ,individual ,individual /交叉 void bianyi(individual /变异 void mubiaohanshu(individual /计算适应度 void chidubianhuan(individual /对 shiyingdu 进行尺度变换赋给 fitness double ran1(long *);/随机数初始 void bianma(double bianliang,unsigned *
7、p);/编码 double yima(unsigned *p); void guanjiancanshujisuan();/计算 shiyingdu,根据 shiyingdu 计算sumshiyingdu,对 shiyingdu 进行尺度变换变成 fitness,根据 fitness 计算sumfitness, avefitness,maxfitness void jingyingbaoliu(); void glp(int n,int s,int *,int (*)1,float (*)1);/glp 生成函数 BOOL Exist(int Val, int Num, int *Array)
8、;/判断一个数在前面是否出现过 int cmpfitness(const void *p1,const void *p2) float i=(individual *)p1)-shiyingdu;/现在是按照“适应度“排序,改成“ 个体“的话就是按照“个体“ 排序 float j=(individual *)p2)-shiyingdu; return igetishiyingdugetishiyingdu)geti=0; zuiyougeti-fitness=0; zuiyougeti-shiyingdu=0; / glp(zhongqunshu,s,h,q,xx); /for(int i=0
9、;ishiyingduzuiyougeti-shiyingdu) *zuiyougeti=zuiyougetiguoduzhongqunshu1-1;/如果最优个体的 fitness 比当代最大的 fitness 小则用当代的代替之 /coutgeti0;j+) pj=qw; w-; /cout=0;j-) k=(*idum)/IQ1; *idum=IA1*(*idum-k*IQ1)-k*IR1; if (*idum RNMX) return RNMX; else return temp; double suijibianli()/随机遍历 double i=ran1(a); while(iz
10、hizhenjuli) i=ran1(a); /cout= high) i = low; else i =(int)(ran1(a) * (high - low + 1) + low); if(i high) i = high; return(i); int flipc(double p,double q)/判断是否交叉 double pc1=0.9,pc2=0.6; if(p-q)0) if(p=avefitness) pc=pc1-(pc1-pc2)*(p-avefitness)/(maxfitness-avefitness); else pc=pc1; else if(q=avefitn
11、ess) pc=pc1-(pc1-pc2)*(q-avefitness)/(maxfitness-avefitness); else pc=pc1; if(ran1(a)=avefitness) pm=(pm1-(pm1-pm2)*(maxfitness-p)/(maxfitness-avefitness); else pm=pm1; if(ran1(a)=pm) return(1); else return(0); void glp(int n,int s,int *h,int (*q)1,float (*xx)1)/glp int i=0,j=0; /求解 q for(i=0;in;i+)
12、 for(j=0;js;j+) *(*(q+i)+j)=(i+1)*(*(h+j)%n; i=n-1; for(j=0;js;j+) *(*(q+i)+j)=n; /求解 x for(i=0;in;i+) for(j=0;js;j+) *(*(xx+i)+j)=(float)(2*(*(*(q+i)+j)-1)/(2*n); BOOL Exist(int Val, int Num, int *Array)/判断一个数是否在一个数组的前 Num个数中 BOOL FLAG = FALSE; int i; for (i=0; iNum; i+) if (Val = *(Array + i) FLAG = TRUE; break; return FLAG;