程序代码: (代码标记 [code]...[/code] )#include<iostream.h>#include<math.h>#include<time.h>//#include<graphics.h>#include<stdlib.h>#include<string.h>#define maxpop 100#define maxstring 32typedef struct...{char chrom[maxstring];float x,fitness;int parent1,parent2,xsite;}pp;pp *oldpop,*newpop,*p1;int popsize,lchrom,gen,maxgen,nmutation,ncross,jcross,maxpp,minpp,jrand;float pcross,pmutation,sumfitness,avg,max,min,seed,rj[maxpop],oldrand[maxpop];double coef;float objfunc(float);int select();int flip(float);int crossover(char *,char *,int);char mutation();void generation();void initialize();void report();void initpop();void initdata();void initreport();double decode(char *);float random1();void randomize1();void pause();void test(char x)...{cout<<x<<' ';}float objfunc(float x1)//compute object fitness;...{float y;y=3.14*x1;y=sin(2.0*y);return y*y;}void statistic(pp *pop)//statistic the fitness of population...{int j;sumfitness=pop[0].fitness;max=pop[0].fitness;min=pop[0].fitness;maxpp=0;minpp=0;for(j=1;j<popsize;j++)...{sumfitness=sumfitness+pop[j].fitness;if(pop[j].fitness>max)...{max=pop[j].fitness;maxpp=j;}if(pop[j].fitness<min)...{min=pop[j].fitness;minpp=j;}}//end foravg=sumfitness/(float)popsize;}void generation()//update a generation;...{int j,mate1,mate2;j=0;do...{mate1=select();mate2=select();crossover(oldpop[mate1].chrom,oldpop[mate2].chrom,j);newpop[j].x=(float)decode(newpop[j].chrom);newpop[j].fitness=objfunc(newpop[j].x);newpop[j].parent1=mate1;newpop[j].parent2=mate2;newpop[j].xsite=jcross;//recode the cross point;newpop[j+1].x=(float)decode(newpop[j+1].chrom);newpop[j+1].fitness=objfunc(newpop[j+1].x);newpop[j+1].parent1=mate1;newpop[j+1].parent2=mate2;newpop[j+1].xsite=jcross;j=j+2;}while(j<popsize);}void initdata()//input control parameters...{int ch,j;cout<<"*********SGA DATA ENTRY AND INITIALIZATION******* ";cout<<"Enter population size:";cin>>popsize;// cout<<"Enter chromosome length:";// cin>>lchrom;lchrom = 32;cout<<"Enter max generations";cin>>maxgen;cout<<"Enter crossover probability:";cin>>pcross;cout<<"Enter mutation probability:";cin>>pmutation;//randomize1();nmutation=0;ncross=0;}void initreport()...{cout<<"Population size:"<<popsize<<' ';// cout<<"Chromosome length:"<<lchrom<<' ';cout<<"Maximum # of generation:"<<maxgen<<' ';cout<<"Crossover probability:"<<pcross<<' ';cout<<"Mutation probability:"<<pmutation<<' ';cout<<"----------------------------------------------------- ";cout<<"Initial Population Maximum Fitness:"<<max<<' ';cout<<"Initial Population Average Fitness:"<<avg<<' ';cout<<"Initial Population Minimun Fitness:"<<min<<' ';cout<<"Initial Population Sum of Fitness:"<<sumfitness<<' ';pause();}void initpop()...{srand((unsigned)time(NULL));int bit;oldpop = new pp[popsize];newpop = new pp[popsize];int j,j1;for(j=0;j<popsize;j++)...{for(j1=0;j1<lchrom;j1++)...{if (rand()%2 == 1)oldpop[j].chrom[j1] = '1';else oldpop[j].chrom[j1]='0';}oldpop[j].x=(float)decode(oldpop[j].chrom);oldpop[j].fitness=objfunc(oldpop[j].x);oldpop[j].parent1=0;oldpop[j].parent2=0;oldpop[j].xsite=0;}//end for}void initialize()...{initdata();//test('a');coef=pow(2.00,lchrom)-0.1;initpop();statistic(oldpop);initreport();}void report(int gen)...{int k,j;cout<<"****************************************************** ";cout<<" Generation:"<<gen<<' ';cout<<"# parents xsite string x fitness ";for(j=0;j<popsize;j++)...{cout<<j<<" "<<newpop[j].parent1<<' '<<newpop[j].parent2<<' '<<newpop[j].xsite<<' ';for(k=0;k<lchrom;k++) cout<<newpop[j].chrom[k];cout<<' '<<newpop[j].x<<' '<<newpop[j].fitness<<' ';}cout<<"******************************************************** ";cout<<"Result Gen:"<<gen<<' ';cout<<"AVG="<<avg<<' '<<"MIN="<<min<<' '<<"MAX="<<max<<' ';cout<<"ncross="<<ncross<<' '<<"nmutation="<<nmutation<<' ';}int select()...{double rand1,partsum;int j;partsum=0.0;j=0;rand1=random1()*sumfitness;do...{partsum=partsum+oldpop[j].fitness;j=j+1;}while((partsum<rand1)&&(j<popsize));return j-1;}double decode(char *pp)//decode chrom to the real number...{int j;double tt,tt1;tt1=1.0;tt=0.0;for(j=lchrom-1;j>-1;j--)...{// for (j = 31; j > -1; j--) {if(pp[j] == '1') tt=tt+tt1;tt1=2.0*tt1;}tt=tt/coef;// tt = tt / (pow(2.0,32) - 0.1);return tt;}void pause()...{int j,j1;int x1;x1=0;for(j=1;j<=25;j++)for(j1=1;j1<2;j1++) x1=x1+1;}char mutation(char ch)//mutation operate...{int mutate,j;mutate=flip(pmutation);if(mutate)...{nmutation=nmutation+1;//???nmutation??if(ch) ch=0;else ch=1;}if(ch) return '1';else return '0';}int crossover(char *parent1,char *parent2,int k5)//crossover operate...{int i,j,j1;if(flip(pcross))...{jcross=rand()%(lchrom-1);ncross=ncross+1;//???ncross?}else jcross=lchrom;if(jcross!=lchrom)...{for(j=0;j<jcross;j++)...{newpop[k5].chrom[j]=mutation(parent1[j]);newpop[k5+1].chrom[j]=mutation(parent2[j]);}for(j=jcross;j<lchrom;j++)...{newpop[k5].chrom[j]=mutation(parent2[j]);newpop[k5+1].chrom[j]=mutation(parent1[j]);}}//end ifelse...{for(j=0;j<lchrom;j++)...{newpop[k5].chrom[j]=mutation(parent1[j]);newpop[k5+1].chrom[j]=mutation(parent2[j]);}}//end elsereturn 1;}void randomize1()//reset the random number generator...{int i;srand((unsigned)time(NULL));// randomize();//???????generate errors "randomize undeclared"for(i=0;i<lchrom;i++);oldrand[i]=(rand()%1000)/1000.0;jrand=0;}float random1()//generate a random number...{jrand=jrand+1;if(jrand>=lchrom)...{jrand=0;randomize1();}return oldrand[jrand];}int flip(float probability)//贝努利实验...{float ppp;ppp=(rand()%1000)/1000.0;if(ppp<=probability) return 1;return 0;}void main()...{double detest;char testch[32];for (int testi = 0; testi < 32; testi++) ...{if (rand()%2 == 1)testch[testi] = '1';else testch[testi] = '0';}detest = decode(testch);cout<<detest<<' ';char c;long int gen,k,j;float oldmax;int oldmaxpp;// pp *oldpop,*newpop,*p1;// oldpop=new pp[maxpop];// newpop=new pp[maxpop];/**//* oldpop = new pp[maxpop];newpop = new pp[maxpop];p1=new pp;for(k=0;k<maxpop;k++)for (j = 0; j < maxstring; j++) {oldpop[k].chrom[j]='0';newpop[k].chrom[j]='0';}*/gen=0;initialize();p1=newpop;newpop=oldpop;statistic(newpop);report(gen);newpop=p1;cin>>c;do ...{gen=gen+1;oldmax=max;oldmaxpp=maxpp;generation();statistic(newpop);if(max<oldmax)...{for(j=0;j<lchrom;j++)newpop[minpp].chrom[j]=oldpop[oldmaxpp].chrom[j];newpop[minpp].x=oldpop[oldmaxpp].x;newpop[minpp].fitness=oldpop[oldmaxpp].fitness;statistic(newpop);}// report(gen);p1=oldpop;oldpop=newpop;newpop=p1;// cin>>c;}while(gen<maxgen);report(gen);free(p1);free(oldpop);}