基本遗传算法的C源程序doc.docx
- 文档编号:3465046
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:21
- 大小:20.17KB
基本遗传算法的C源程序doc.docx
《基本遗传算法的C源程序doc.docx》由会员分享,可在线阅读,更多相关《基本遗传算法的C源程序doc.docx(21页珍藏版)》请在冰豆网上搜索。
基本遗传算法的C源程序doc
/******************************************************************/
/*基于基本遗传算法的函数最优化SGA.C*/
/*AFunctionOptimizerusingSimpleGeneticAlgorithm*/
/*developedfromthePascalSGAcodepresentedbyDavidE.Goldberg*/
//******************************************************************/
#include
#include
#include
#include"graph.c"
/*全局变量*/
structindividual/*个体*/
{
unsigned*chrom;/*染色体*/
doublefitness;/*个体适应度*/
doublevarible;/*个体对应的变量值*/
intxsite;/*交叉位置*/
intparent[2];/*父个体*/
int*utility;/*特定数据指针变量*/
};
structbestever/*最佳个体*/
{
unsigned*chrom;/*最佳个体染色体*/
doublefitness;/*最佳个体适应度*/
doublevarible;/*最佳个体对应的变量值*/
intgeneration;/*最佳个体生成代*/
};
structindividual*oldpop;/*当前代种群*/
structindividual*newpop;/*新一代种群*/
structbesteverbestfit;/*最佳个体*/
doublesumfitness;/*种群中个体适应度累计*/
doublemax;/*种群中个体最大适应度*/
doubleavg;/*种群中个体平均适应度*/
doublemin;/*种群中个体最小适应度*/
floatpcross;/*交叉概率*/
floatpmutation;/*变异概率*/
intpopsize;/*种群大小*/
intlchrom;/*染色体长度*/
intchromsize;/*存储一染色体所需字节数*/
intgen;/*当前世代数*/
intmaxgen;/*最大世代数*/
intrun;/*当前运行次数*/
intmaxruns;/*总运行次数*/
intprintstrings;/*输出染色体编码的判断,0--不输出,1--输出*/
intnmutation;/*当前代变异发生次数*/
intncross;/*当前代交叉发生次数*/
/*随机数发生器使用的静态变量*/
staticdoubleoldrand[55];
staticintjrand;
staticdoublerndx2;
staticintrndcalcflag;
/*输出文件指针*/
FILE*outfp;
/*函数定义*/
voidadvance_random();
intflip(float);rnd(int,int);
voidrandomize();
doublerandomnormaldeviate();
floatrandomperc(),rndreal(float,float);
voidwarmup_random(float);
voidinitialize(),initdata(),initpop();
voidinitreport(),generation(),initmalloc();
voidfreeall(),nomemory(char*),report();
voidwritepop(),writechrom(unsigned*);
voidpreselect();
voidstatistics(structindividual*);
voidtitle(),repchar(FILE*,char*,int);
voidskip(FILE*,int);
intselect();
voidobjfunc(structindividual*);
intcrossover(unsigned*,unsigned*,unsigned*,unsigned*);
voidmutation(unsigned*);
voidinitialize()/*遗传算法初始化*/
{
/*键盘输入遗传算法参数*/
initdata();
/*确定染色体的字节长度*/
chromsize=(lchrom/(8*sizeof(unsigned)));
if(lchrom%(8*sizeof(unsigned)))chromsize++;
/*分配给全局数据结构空间*/
initmalloc();
/*初始化随机数发生器*/
randomize();
/*初始化全局计数变量和一些数值*/
nmutation=0;
ncross=0;
bestfit.fitness=0.0;
bestfit.generation=0;
/*初始化种群,并统计计算结果*/
initpop();
statistics(oldpop);
initreport();
}
voidinitdata()/*遗传算法参数输入*/
{
charanswer[2];
setcolor(9);
disp_hz16("种群大小(20-100):
",100,150,20);
gscanf(320,150,9,15,4,"%d",&popsize);
if((popsize%2)!
=0)
{
fprintf(outfp,"种群大小已设置为偶数\n");
popsize++;
};
setcolor(9);
disp_hz16("染色体长度(8-40):
",100,180,20);
gscanf(320,180,9,15,4,"%d",&lchrom);
setcolor(9);
disp_hz16("是否输出染色体编码(y/n):
",100,210,20);
printstrings=1;
gscanf(320,210,9,15,4,"%s",answer);
if(strncmp(answer,"n",1)==0)printstrings=0;
setcolor(9);
disp_hz16("最大世代数(100-300):
",100,240,20);
gscanf(320,240,9,15,4,"%d",&maxgen);
setcolor(9);
disp_hz16("交叉率(0.2-0.9):
",100,270,20);
gscanf(320,270,9,15,5,"%f",&pcross);
setcolor(9);
disp_hz16("变异率(0.01-0.1):
",100,300,20);
gscanf(320,300,9,15,5,"%f",&pmutation);
}
voidinitpop()/*随机初始化种群*/
{
intj,j1,k,stop;
unsignedmask=1;
for(j=0;j { for(k=0;k { oldpop[j].chrom[k]=0; if(k==(chromsize-1)) stop=lchrom-(k*(8*sizeof(unsigned))); else stop=8*sizeof(unsigned); for(j1=1;j1<=stop;j1++) { oldpop[j].chrom[k]=oldpop[j].chrom[k]<<1; if(flip(0.5)) oldpop[j].chrom[k]=oldpop[j].chrom[k]|mask; } } oldpop[j].parent[0]=0;/*初始父个体信息*/ oldpop[j].parent[1]=0; oldpop[j].xsite=0; objfunc(&(oldpop[j]));/*计算初始适应度*/ } } voidinitreport()/*初始参数输出*/ { voidskip(); skip(outfp,1); fprintf(outfp,"基本遗传算法参数\n"); fprintf(outfp,"-------------------------------------------------\n"); fprintf(outfp,"种群大小(popsize)=%d\n",popsize); fprintf(outfp,"染色体长度(lchrom)=%d\n",lchrom); fprintf(outfp,"最大进化代数(maxgen)=%d\n",maxgen); fprintf(outfp,"交叉概率(pcross)=%f\n",pcross); fprintf(outfp,"变异概率(pmutation)=%f\n",pmutation); fprintf(outfp,"-------------------------------------------------\n"); skip(outfp,1); fflush(outfp); } voidgeneration() { intmate1,mate2,jcross,j=0; /*每代运算前进行预选*/ preselect(); /*选择,交叉,变异*/ do { /*挑选交叉配对*/ mate1=select(); mate2=select(); /*交叉和变异*/ jcross=crossover(oldpop[mate1].chrom,oldpop[mate2].chrom,newpop[j].chrom,newpop[j+1].chrom); mutation(newpop[j].chrom); mutation(newpop[j+1].chrom); /*解码,计算适应度*/ objfunc(&(newpop[j])); /*记录亲子关系和交叉位置*/ newpop[j].parent[0]=mate1+1; newpop[j].xsite=jcross; newpop[j].parent[1]=mate2+1; objfunc(&(newpop[j+1])); newpop[j+1].parent[0]=mate1+1; newpop[j+1].xsite=jcross; newpop[j+1].parent[1]=mate2+1; j=j+2; } while(j<(popsize-1)); } voidinitmalloc()/*为全局数据变量分配空间*/ { unsignednbytes; char*malloc(); intj; /*分配给当前代和新一代种群内存空间*/ nbytes=popsize*sizeof(structindividual); if((oldpop=(structindividual*)malloc(nbytes))==NULL) nomemory("oldpop"); if((newpop=(structindividual*)malloc(nbytes))==NULL) nomemory("newpop"); /*分配给染色体内存空间*/ nbytes=chromsize*sizeof(unsigned); for(j=0;j { if((oldpop[j].chrom=(unsigned*)malloc(nbytes))==NULL) nomemory("oldpopchromosomes"); if((newpop[j].chrom=(unsigned*)malloc(nbytes))==NULL) nomemory("newpopchromosomes"); } if((bestfit.chrom=(unsigned*)malloc(nbytes))==NULL) nomemory("bestfitchromosome"); } voidfreeall()/*释放内存空间*/ { inti; for(i=0;i { free(oldpop[i].chrom); free(newpop[i].chrom); } free(oldpop); free(newpop); free(bestfit.chrom); } voidnomemory(string)/*内存不足,退出*/ char*string; { fprintf(outfp,"malloc: outofmemorymaking%s! ! \n",string); exit(-1); } voidreport()/*输出种群统计结果*/ { voidrepchar(),skip(); voidwritepop(),writestats(); repchar(outfp,"-",80); skip(outfp,1); if(printstrings==1) { repchar(outfp,"",((80-17)/2)); fprintf(outfp,"模拟计算统计报告\n"); fprintf(outfp,"世代数%3d",gen); repchar(outfp,"",(80-28)); fprintf(outfp,"世代数%3d\n",(gen+1)); fprintf(outfp,"个体染色体编码"); repchar(outfp,"",lchrom-5); fprintf(outfp,"适应度父个体交叉位置"); fprintf(outfp,"染色体编码"); repchar(outfp,"",lchrom-5); fprintf(outfp,"适应度\n"); repchar(outfp,"-",80); skip(outfp,1); writepop(outfp); repchar(outfp,"-",80); skip(outfp,1); } fprintf(outfp,"第%d代统计: \n",gen); fprintf(outfp,"总交叉操作次数=%d,总变异操作数=%d\n",ncross,nmutation); fprintf(outfp,"最小适应度: %f最大适应度: %f平均适应度%f\n",min,max,avg); fprintf(outfp,"迄今发现最佳个体=>所在代数: %d",bestfit.generation); fprintf(outfp,"适应度: %f染色体: ",bestfit.fitness); writechrom((&bestfit)->chrom); fprintf(outfp,"对应的变量值: %f",bestfit.varible); skip(outfp,1); repchar(outfp,"-",80); skip(outfp,1); } voidwritepop() { structindividual*pind; intj; for(j=0;j{ fprintf(outfp,"%3d)",j+1); /*当前代个体*/ pind=&(oldpop[j]); writechrom(pind->chrom); fprintf(outfp,"%8f|",pind->fitness); /*新一代个体*/ pind=&(newpop[j]); fprintf(outfp,"(%2d,%2d)%2d", pind->parent[0],pind->parent[1],pind->xsite); writechrom(pind->chrom); fprintf(outfp,"%8f\n",pind->fitness); } } voidwritechrom(chrom)/*输出染色体编码*/ unsigned*chrom; { intj,k,stop; unsignedmask=1,tmp; for(k=0;k { tmp=chrom[k]; if(k==(chromsize-1)) stop=lchrom-(k*(8*sizeof(unsigned))); else stop=8*sizeof(unsigned); for(j=0;j { if(tmp&mask) fprintf(outfp,"1"); else fprintf(outfp,"0"); tmp=tmp>>1; } } } voidpreselect() { intj; sumfitness=0; for(j=0;j } intselect()/*轮盘赌选择*/ { externfloatrandomperc(); floatsum,pick; inti; pick=randomperc(); sum=0; if(sumfitness! =0) { for(i=0;(sum sum+=oldpop[i].fitness/sumfitness; } else i=rnd(1,popsize); return(i-1); } voidstatistics(pop)/*计算种群统计数据*/ structindividual*pop; { inti,j; sumfitness=0.0; min=pop[0].fitness; max=pop[0].fitness; /*计算最大、最小和累计适应度*/ for(j=0;j { sumfitness=sumfitness+pop[j].fitness; if(pop[j].fitness>max)max=pop[j].fitness; if(pop[j].fitness /*newglobalbest-fitindividual*/ if(pop[j].fitness>bestfit.fitness) { for(i=0;i bestfit.chrom[i]=pop[j].chrom[i]; bestfit.fitness=pop[j].fitness; bestfit.varible=pop[j].varible; bestfit.generation=gen; } } /*计算平均适应度*/ avg=sumfitness/popsize; } voidtitle() { settextstyle(0,0,4); gprintf(110,15,4,0,"SGAOptimizer"); setcolor(9); disp_hz24("基本遗传算法",220,60,25); } voidrepchar(outfp,ch,repcount) FILE*outfp; char*ch; intrepcount; { intj; for(j=1;j<=repcount;j++)fprintf(outfp,"%s",ch); } voidskip(outfp,skipcount) FILE*outfp; intskipcount; { intj; for(j=1;j<=skipcount;j++)fprintf(outfp,"\n"); } voidobjfunc(critter)/*计算适应度函数值*/ structindividual*critter; { unsignedmask=1; unsignedbitpos; unsignedtp; doublepow(),bitpow; intj,k,stop; critter->varible=0.0; for(k=0;k { if(k==(chromsize-1)) stop=lchrom-(k*(8*sizeof(unsigned))); else stop=8*sizeof(unsigned); tp=critter->chrom[k]; for(j=0;j { bitpos=j+(8*sizeof(unsigned))*k; if((tp&mask)==1)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 遗传 算法 源程序 doc