基本遗传算法的C源程序docWord下载.docx

上传人:b****3 文档编号:16370463 上传时间:2022-11-23 格式:DOCX 页数:21 大小:20.17KB
下载 相关 举报
基本遗传算法的C源程序docWord下载.docx_第1页
第1页 / 共21页
基本遗传算法的C源程序docWord下载.docx_第2页
第2页 / 共21页
基本遗传算法的C源程序docWord下载.docx_第3页
第3页 / 共21页
基本遗传算法的C源程序docWord下载.docx_第4页
第4页 / 共21页
基本遗传算法的C源程序docWord下载.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

基本遗传算法的C源程序docWord下载.docx

《基本遗传算法的C源程序docWord下载.docx》由会员分享,可在线阅读,更多相关《基本遗传算法的C源程序docWord下载.docx(21页珍藏版)》请在冰豆网上搜索。

基本遗传算法的C源程序docWord下载.docx

/*种群中个体最大适应度*/

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++;

染色体长度(8-40):

100,180,20);

gscanf(320,180,9,15,4,"

lchrom);

是否输出染色体编码(y/n):

100,210,20);

printstrings=1;

gscanf(320,210,9,15,4,"

%s"

answer);

if(strncmp(answer,"

n"

1)==0)printstrings=0;

最大世代数(100-300):

100,240,20);

gscanf(320,240,9,15,4,"

maxgen);

交叉率(0.2-0.9):

100,270,20);

gscanf(320,270,9,15,5,"

%f"

pcross);

变异率(0.01-0.1):

100,300,20);

gscanf(320,300,9,15,5,"

pmutation);

voidinitpop()/*随机初始化种群*/

intj,j1,k,stop;

unsignedmask=1;

for(j=0;

j<

popsize;

j++)

for(k=0;

k<

chromsize;

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"

-------------------------------------------------\n"

种群大小(popsize)=%d\n"

popsize);

染色体长度(lchrom)=%d\n"

lchrom);

最大进化代数(maxgen)=%d\n"

maxgen);

交叉概率(pcross)=%f\n"

pcross);

变异概率(pmutation)=%f\n"

pmutation);

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);

/*解码,计算适应度*/

(newpop[j]));

/*记录亲子关系和交叉位置*/

newpop[j].parent[0]=mate1+1;

newpop[j].xsite=jcross;

newpop[j].parent[1]=mate2+1;

(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)

newpop"

/*分配给染色体内存空间*/

nbytes=chromsize*sizeof(unsigned);

if((oldpop[j].chrom=(unsigned*)malloc(nbytes))==NULL)

oldpopchromosomes"

if((newpop[j].chrom=(unsigned*)malloc(nbytes))==NULL)

newpopchromosomes"

if((bestfit.chrom=(unsigned*)malloc(nbytes))==NULL)

bestfitchromosome"

voidfreeall()/*释放内存空间*/

inti;

for(i=0;

i<

i++)

free(oldpop[i].chrom);

free(newpop[i].chrom);

free(oldpop);

free(newpop);

free(bestfit.chrom);

voidnomemory(string)/*内存不足,退出*/

char*string;

malloc:

outofmemorymaking%s!

!

\n"

string);

exit(-1);

voidreport()/*输出种群统计结果*/

voidrepchar(),skip();

voidwritepop(),writestats();

repchar(outfp,"

-"

80);

if(printstrings==1)

"

((80-17)/2));

模拟计算统计报告\n"

世代数%3d"

gen);

(80-28));

世代数%3d\n"

(gen+1));

个体染色体编码"

lchrom-5);

适应度父个体交叉位置"

染色体编码"

适应度\n"

writepop(outfp);

第%d代统计:

\n"

gen);

总交叉操作次数=%d,总变异操作数=%d\n"

ncross,nmutation);

最小适应度:

%f最大适应度:

%f平均适应度%f\n"

min,max,avg);

迄今发现最佳个体=>

所在代数:

%d"

bestfit.generation);

适应度:

%f染色体:

bestfit.fitness);

writechrom((&

bestfit)->

chrom);

对应的变量值:

%f"

bestfit.varible);

voidwritepop()

structindividual*pind;

for(j=0;

j{

%3d)"

j+1);

/*当前代个体*/

pind=&

(oldpop[j]);

writechrom(pind->

%8f|"

pind->

fitness);

/*新一代个体*/

(newpop[j]);

(%2d,%2d)%2d"

pind->

parent[0],pind->

parent[1],pind->

xsite);

%8f\n"

voidwritechrom(chrom)/*输出染色体编码*/

intj,k,stop;

unsignedmask=1,tmp;

tmp=chrom[k];

stop;

if(tmp&

mask)

1"

0"

tmp=tmp>

>

voidpreselect()

sumfitness=0;

j++)sumfitness+=oldpop[j].fitness;

intselect()/*轮盘赌选择*/

externfloatrandomperc();

floatsum,pick;

pick=randomperc();

sum=0;

if(sumfitness!

(sum<

pick)&

&

(i<

popsize);

sum+=oldpop[i].fitness/sumfitness;

i=rnd(1,popsize);

return(i-1);

voidstatistics(pop)/*计算种群统计数据*/

structindividual*pop;

inti,j;

sumfitness=0.0;

min=pop[0].fitness;

max=pop[0].fitness;

/*计算最大、最小和累计适应度*/

sumfitness=sumfitness+pop[j].fitness;

if(pop[j].fitness>

max)max=pop[j].fitness;

if(pop[j].fitness<

min)min=pop[j].fitness;

/*newglobalbest-fitindividual*/

bestfit.fitness)

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"

disp_hz24("

基本遗传算法"

220,60,25);

voidrepchar(outfp,ch,repcount)

FILE*outfp;

char*ch;

intrepcount;

for(j=1;

=repcount;

j++)fprintf(outfp,"

ch);

voidskip(outfp,skipcount)

intskipcount;

=skipcount;

voidobjfunc(critter)/*计算适应度函数值*/

structindividual*critter;

unsignedmask=1;

unsignedbitpos;

unsignedtp;

doublepow(),bitpow;

critter->

varible=0.0;

stop=lchrom-(k*(8*sizeof(unsigned)));

tp=critter->

chrom[k];

bitpos=j+(8*sizeof(unsigned))*k;

if((tp&

mask)==1)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1