• keyWkey
    了解作者
  • C/C++
    开发工具
  • 2KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 0
    下载次数
  • 2020-04-24 22:59
    上传日期
主要用于表达式子求最值,多维函数情况下的表达式,可求其最优解(遗传算法)。
Ga.zip
  • Ga
  • Ga.cpp
    7.5KB
内容介绍
#include <iostream> #include <time.h> #include <stdlib.h> #include <cmath> using namespace std; const int M = 50; //染色体的数目,群体的大小 const int T = 1000; //终止代数 const double pc = 0.9; //交叉概率 const double pm = 0.03; //变异概率 const double pi = 3.1415926; const int E = 10; struct Population { int g[33]; //将x,y的取值区间分为(2^15-1 2^18-1)份,用33位二进制位表示份数 double x,y; double fit; //适应函数值 double nfit; double sumfit; //适应值总和 //int flag=0; }; class gaModel{ public: int rand01() const; //随机生成01 double randab(double,double) const; //随即生成[a,b)的一个数 void initial(Population *); // 初始化函数 void evalueFitness(Population *); // 计算适应度 void select(Population *); // 选择复制函数 void crossover(Population *); // 交叉函数 void mutation(Population *); // 变异函数 void decoding(Population *); // 解码函数 void print(Population *); // 显示函数 Population p[M]; }; //编写0,1的随机数生成器 int gaModel::rand01() const{ int r = 0; double q = 0.0; q = rand()/(RAND_MAX + 0.0); if(q < 0.5) r = 0; else r = 1; return r; } //产生一个属于【a,b)的数 double gaModel::randab(double a,double b) const{ double c,r; c = b - a; r = a + c * rand()/(RAND_MAX+1.0); return r; } //初始化群体,对染色体33位进行初始化 void gaModel::initial(Population *t){ Population *po; srand(time(0)); for(po = t; po < t + M; po++) //初始化群体 for(int j = 0; j < 33; j++) (*po).g[j] = rand01(); } //计算适应度值 void gaModel::evalueFitness(Population *t){ double f,xx,yy,temp = 0.0; Population *po1,*po2; double fmax = 0,fmin = 9999999999; for(po1 = t; po1 < t + M; po1++){ //计算每个的适应值 xx = (*po1).x; yy = (*po1).y; f = 21.5+yy * sin(4*pi*yy) + xx * sin(20 *pi* xx);//优化函数 (*po1).fit = f; //cout << (*po1).fit << "测试" << endl; } for(po1 = t; po1 < t + M-E; po1++){ //进化迭代过程 if((*po1).fit > fmax) fmax = (*po1).fit; if((*po1).fit < fmin) fmin = (*po1).fit; } /* for(po1 = t; po1 < t + M-2; po1++){ //用以得出“概率”,评估适应度 (*po1).nfit = ((*po1).fit - fmin) / (fmax - fmin + 1); } for(po1 = t; po1 < t + M-2; po1++){ //计算累计适应值,为的是之后的轮盘赌模型 for(po2 = t; po2 <= po1; po2++) temp = temp + (*po2).nfit; (*po1).sumfit = temp; temp = 0.0; } */ double sum=0.0; for(po1 = t; po1 < t + M; po1++){ //用以得出“概率”,评估适应度 sum+= (*po1).fit; } for(po1 = t; po1 < t + M; po1++){ //用以得出“概率”,评估适应度 (*po1).nfit = (*po1).fit / sum; } for(po1 = t; po1 < t + M; po1++){ //计算累计适应值,为的是之后的轮盘赌模型 for(po2 = t; po2 <= po1; po2++) temp = temp + (*po2).nfit; (*po1).sumfit = temp; temp = 0.0; } } //轮盘赌模型 void gaModel::select(Population *t){ //轮盘赌选择 int i = 0; Population pt[M],*po; double s; srand(time(0)); while(i < M-E){ // s = randab((*t).sumfit,(*(t + M -1-E)).sumfit); s=rand()/ (RAND_MAX + 0.0); for(po = t; po < t + M;po++){ if((*po).sumfit >= s){ pt[i] = (*po); break; } else continue; } i++; } for(i = 0; i < M-E; i++) for(int j = 0; j < 33; j++) t[i].g[j] = pt[i].g[j]; } //交叉感染 void gaModel::crossover(Population *t){ //交叉函数 Population *po; double q; //存放一个0到1的随机数,判定是否交叉 int d,e,tem[33]; //d存放一个从0到32的一个随机整数,用来确定交叉的位置 int k = 0,rpo[5] = {99,99,99,99,99};//e存放从0到M的一个随机且与当前t[i]中i不同的整数,用来确定交叉的对象 bool tf = true; //rpo存放每次的e,确保所有的染色体都会交叉 srand(time(0)); for(po = t; po < t + M; ){ int min,max; int d1,d2; q = rand() / (RAND_MAX + 0.0); if(q < pc){ d1 = 1 + rand() % 33; d2 = 1 + rand()%33; //确定交叉位置 min=d1>d2?d2:d1; max=d1>d2?d1:d2; for(int i = min; i <=max; i++){//完成交换(交叉) tem[i] = (*po).g[i]; (*po).g[i] = (*(po+1)).g[i]; (*(po+1)).g[i] = tem[i]; } } // rpo[k] = e; k++; po=po+2; } } //变异过程 void gaModel::mutation(Population *t){ //变异函数 double q; Population *po; srand(time(0)); for(po = t; po < t + M; po++){ int i = 0; while(i < 33){ q = rand() / (RAND_MAX + 0.0); if(q < pm) (*po).g[i] = 1 - (*po).g[i]; i++; } } } // void gaModel::decoding(Population *t){ //解码函数 Population *po; int temp,s1 = 0, s2 = 0; float m,n,dit; n = ldexp(1.0,15); dit = (5.8 - 4.1) / (n - 1); double n2=0.0,dit2=0.0; n2 = ldexp(1.0,18); dit2 = (12.1 - (-3.0)) / (n2 - 1); for(po = t; po < t + M; po++){ for(int i = 0; i < 15; i++){ temp = ldexp((*po).g[i]*1.0,i); s1 = s1 + temp; } m = (4.1) + s1 * dit; (*po).x = m; s1 = 0; for(int j = 15; j < 33; j++){ temp = ldexp((*po).g[j]*1.0,j-15); s2 = s2 + temp; } m = (-3.0) + s2 * dit2; (*po).y = m; s2 = 0; } } //显示函数实现 void gaModel::print(Population *t){ //显示函数 Population *po; for(po = t; po < t + M; po++){ for(int j = 0; j < 33; j++){ cout << (*po).g[j]; if((j+1)%5 == 0) cout << ' '; } cout << endl; cout << "x=" << (*po).x << ' ' << "y=" << (*po).y << ' ' << "fit=" << (*po).fit << ' ' << "nfit=" << (*po).nfit << ' ' << "sumfit=" << (*po).sumfit << endl; } } int main(){ int kkk = 0; int gen = 0; gaModel g1; g1.initial(&(g1.p[0])); //g1.print(&(g1.p[0])); cout << endl; g1.decoding(&(g1.p[0])); // g1.print(&(g1.p[0])); cout << endl; g1.evalueFitness(&(g1.p[0])); g1.print(&(g1.p[0])); while(gen < T){ cout << "gen=" << gen + 1 << endl; //排序保留精英 gaModel g2=g1; for(int i=0;i<M;i++){ for(int j=i;j<M;j++){ Population test; if( (g2.p[i].fit)>g2.p[j].fit){ test=g2.p[i]; g2.p[i]=g2.p[j]; g2.p[j]=test; } } } // if(gen==T)g2.print(&(g2.p[0])); g1.select(&(g1.p[0])); for(int i=0;i<E;i++)g1.p[M-i-1]=g2.p[M-i-1]; g1.decoding(&(g1.p[0])); g1.evalueFitness(&(g1.p[0])); cout << "selected!" << endl; g1.print(&(g1.p[0])); g1.crossover(&(g1.p[0])); g1.decoding(&(g1.p[0])); g1.evalueFitness(&(g1.p[0])); cout << "crossovered!" << endl; // g1.print(&(g1.p[0])); g1.mutation(&(g1.p[0])); g1.decoding(&(g1.p[0])); g1.evalueFitness(&(g1.p[0])); cout << "mutated" << endl; // g1.print(&(g1.p[0])); gen++; } //cin >> kkk; }
评论
    相关推荐