遗传算法源代码.docx

上传人:b****6 文档编号:15454305 上传时间:2023-07-04 格式:DOCX 页数:31 大小:21.65KB
下载 相关 举报
遗传算法源代码.docx_第1页
第1页 / 共31页
遗传算法源代码.docx_第2页
第2页 / 共31页
遗传算法源代码.docx_第3页
第3页 / 共31页
遗传算法源代码.docx_第4页
第4页 / 共31页
遗传算法源代码.docx_第5页
第5页 / 共31页
遗传算法源代码.docx_第6页
第6页 / 共31页
遗传算法源代码.docx_第7页
第7页 / 共31页
遗传算法源代码.docx_第8页
第8页 / 共31页
遗传算法源代码.docx_第9页
第9页 / 共31页
遗传算法源代码.docx_第10页
第10页 / 共31页
遗传算法源代码.docx_第11页
第11页 / 共31页
遗传算法源代码.docx_第12页
第12页 / 共31页
遗传算法源代码.docx_第13页
第13页 / 共31页
遗传算法源代码.docx_第14页
第14页 / 共31页
遗传算法源代码.docx_第15页
第15页 / 共31页
遗传算法源代码.docx_第16页
第16页 / 共31页
遗传算法源代码.docx_第17页
第17页 / 共31页
遗传算法源代码.docx_第18页
第18页 / 共31页
遗传算法源代码.docx_第19页
第19页 / 共31页
遗传算法源代码.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

遗传算法源代码.docx

《遗传算法源代码.docx》由会员分享,可在线阅读,更多相关《遗传算法源代码.docx(31页珍藏版)》请在冰点文库上搜索。

遗传算法源代码.docx

遗传算法源代码

 

这是一个非常简单的遗传算法源代码,是由DenisCormier(NorthCarolinaStateUniversity)开发的,SitaS.Raghavan(UniversityofNorthCarolinaatCharlotte)修正。

代码保证尽可能少,实际上也不必查错。

对一特定的应用修正此代码,用户只需改变常数的定义并且定义“评价函数”即可。

注意代码的设计是求最大值,其中的目标函数只能取正值;且函数值和个体的适应值之间没有区别。

该系统使用比率选择、精华模型、单点杂交和均匀变异。

如果用Gaussian变异替换均匀变异,可能得到更好的效果。

代码没有任何图形,甚至也没有屏幕输出,主要是保证在平台之间的高可移植性。

读者可以从ftp.uncc.edu,目录coe/evol中的文件prog.c中获得。

要求输入的文件应该命名为‘gadata.txt’;系统产生的输出文件为‘galog.txt’。

输入的文件由几行组成:

数目对应于变量数。

且每一行提供次序——对应于变量的上下界。

如第一行为第一个变量提供上下界,第二行为第二个变量提供上下界,等等。

 

/**************************************************************************/

/*Thisisasimplegeneticalgorithmimplementationwherethe*/

/*evaluationfunctiontakespositivevaluesonlyandthe*/

/*fitnessofanindividualisthesameasthevalueofthe*/

/*objectivefunction*/

/**************************************************************************/

#include

#include

#include

/*Changeanyoftheseparameterstomatchyourneeds*/

#definePOPSIZE50/*populationsize*/

#defineMAXGENS1000/*max.numberofgenerations*/

#defineNVARS3/*no.ofproblemvariables*/

#definePXOVER0.8/*probabilityofcrossover*/

#definePMUTATION0.15/*probabilityofmutation*/

#defineTRUE1

#defineFALSE0

intgeneration;/*currentgenerationno.*/

intcur_best;/*bestindividual*/

FILE*galog;/*anoutputfile*/

structgenotype/*genotype(GT),amemberofthepopulation*/

{

doublegene[NVARS];/*astringofvariables*/

doublefitness;/*GT'sfitness*/

doubleupper[NVARS];/*GT'svariablesupperbound*/

doublelower[NVARS];/*GT'svariableslowerbound*/

doublerfitness;/*relativefitness*/

doublecfitness;/*cumulativefitness*/

};

structgenotypepopulation[POPSIZE+1];/*population*/

structgenotypenewpopulation[POPSIZE+1];/*newpopulation;*/

/*replacesthe*/

/*oldgeneration*/

/*Declarationofproceduresusedbythisgeneticalgorithm*/

voidinitialize(void);

doublerandval(double,double);

voidevaluate(void);

voidkeep_the_best(void);

voidelitist(void);

voidselect(void);

voidcrossover(void);

voidXover(int,int);

voidswap(double*,double*);

voidmutate(void);

voidreport(void);

/***************************************************************/

/*Initializationfunction:

Initializesthevaluesofgenes*/

/*withinthevariablesbounds.Italsoinitializes(tozero)*/

/*allfitnessvaluesforeachmemberofthepopulation.It*/

/*readsupperandlowerboundsofeachvariablefromthe*/

/*inputfile`gadata.txt'.Itrandomlygeneratesvalues*/

/*betweentheseboundsforeachgeneofeachgenotypeinthe*/

/*population.Theformatoftheinputfile`gadata.txt'is*/

/*var1_lower_boundvar1_upperbound*/

/*var2_lower_boundvar2_upperbound...*/

/***************************************************************/

voidinitialize(void)

{

FILE*infile;

inti,j;

doublelbound,ubound;

if((infile=fopen("gadata.txt","r"))==NULL)

{

fprintf(galog,"\nCannotopeninputfile!

\n");

exit

(1);

}

/*initializevariableswithinthebounds*/

for(i=0;i

{

fscanf(infile,"%lf",&lbound);

fscanf(infile,"%lf",&ubound);

for(j=0;j

{

population[j].fitness=0;

population[j].rfitness=0;

population[j].cfitness=0;

population[j].lower[i]=lbound;

population[j].upper[i]=ubound;

population[j].gene[i]=randval(population[j].lower[i],

population[j].upper[i]);

}

}

fclose(infile);

}

/***********************************************************/

/*Randomvaluegenerator:

Generatesavaluewithinbounds*/

/***********************************************************/

doublerandval(doublelow,doublehigh)

{

doubleval;

val=((double)(rand()%1000)/1000.0)*(high-low)+low;

return(val);

}

/*************************************************************/

/*Evaluationfunction:

Thistakesauserdefinedfunction.*/

/*Eachtimethisischanged,thecodehastoberecompiled.*/

/*Thecurrentfunctionis:

x[1]^2-x[1]*x[2]+x[3]*/

/*************************************************************/

voidevaluate(void)

{

intmem;

inti;

doublex[NVARS+1];

for(mem=0;mem

{

for(i=0;i

x[i+1]=population[mem].gene[i];

population[mem].fitness=(x[1]*x[1])-(x[1]*x[2])+x[3];

}

}

/***************************************************************/

/*Keep_the_bestfunction:

Thisfunctionkeepstrackofthe*/

/*bestmemberofthepopulation.Notethatthelastentryin*/

/*thearrayPopulationholdsacopyofthebestindividual*/

/***************************************************************/

voidkeep_the_best()

{

intmem;

inti;

cur_best=0;/*storestheindexofthebestindividual*/

for(mem=0;mem

{

if(population[mem].fitness>population[POPSIZE].fitness)

{

cur_best=mem;

population[POPSIZE].fitness=population[mem].fitness;

}

}

/*oncethebestmemberinthepopulationisfound,copythegenes*/

for(i=0;i

population[POPSIZE].gene[i]=population[cur_best].gene[i];

}

/****************************************************************/

/*Elitistfunction:

Thebestmemberofthepreviousgeneration*/

/*isstoredasthelastinthearray.Ifthebestmemberof*/

/*thecurrentgenerationisworsethenthebestmemberofthe*/

/*previousgeneration,thelatteronewouldreplacetheworst*/

/*memberofthecurrentpopulation*/

/****************************************************************/

voidelitist()

{

inti;

doublebest,worst;/*bestandworstfitnessvalues*/

intbest_mem,worst_mem;/*indexesofthebestandworstmember*/

best=population[0].fitness;

worst=population[0].fitness;

for(i=0;i

{

if(population[i].fitness>population[i+1].fitness)

{

if(population[i].fitness>=best)

{

best=population[i].fitness;

best_mem=i;

}

if(population[i+1].fitness<=worst)

{

worst=population[i+1].fitness;

worst_mem=i+1;

}

}

else

{

if(population[i].fitness<=worst)

{

worst=population[i].fitness;

worst_mem=i;

}

if(population[i+1].fitness>=best)

{

best=population[i+1].fitness;

best_mem=i+1;

}

}

}

/*ifbestindividualfromthenewpopulationisbetterthan*/

/*thebestindividualfromthepreviouspopulation,then*/

/*copythebestfromthenewpopulation;elsereplacethe*/

/*worstindividualfromthecurrentpopulationwiththe*/

/*bestonefromthepreviousgeneration*/

if(best>=population[POPSIZE].fitness)

{

for(i=0;i

population[POPSIZE].gene[i]=population[best_mem].gene[i];

population[POPSIZE].fitness=population[best_mem].fitness;

}

else

{

for(i=0;i

population[worst_mem].gene[i]=population[POPSIZE].gene[i];

population[worst_mem].fitness=population[POPSIZE].fitness;

}

}

/**************************************************************/

/*Selectionfunction:

Standardproportionalselectionfor*/

/*maximizationproblemsincorporatingelitistmodel-makes*/

/*surethatthebestmembersurvives*/

/**************************************************************/

voidselect(void)

{

intmem,i,j,k;

doublesum=0;

doublep;

/*findtotalfitnessofthepopulation*/

for(mem=0;mem

{

sum+=population[mem].fitness;

}

/*calculaterelativefitness*/

for(mem=0;mem

{

population[mem].rfitness=population[mem].fitness/sum;

}

population[0].cfitness=population[0].rfitness;

/*calculatecumulativefitness*/

for(mem=1;mem

{

population[mem].cfitness=population[mem-1].cfitness+

population[mem].rfitness;

}

/*finallyselectsurvivorsusingcumulativefitness.*/

for(i=0;i

{

p=rand()%1000/1000.0;

if(p

newpopulation[i]=population[0];

else

{

for(j=0;j

if(p>=population[j].cfitness&&

p

newpopulation[i]=population[j+1];

}

}

/*onceanewpopulationiscreated,copyitback*/

for(i=0;i

population[i]=newpopulation[i];

}

/***************************************************************/

/*Crossoverselection:

selectstwoparentsthattakepartin*/

/*thecrossover.Implementsasinglepointcrossover*/

/***************************************************************/

voidcrossover(void)

{

inti,mem,one;

intfirst=0;/*countofthenumberofmemberschosen*/

doublex;

for(mem=0;mem

{

x=rand()%1000/1000.0;

if(x

{

++first;

if(first%2==0)

Xover(one,mem);

else

one=mem;

}

}

}

/**************************************************************/

/*Crossover:

performscrossoverofthetwoselectedparents.*/

/**************************************************************/

voidXover(intone,inttwo)

{

inti;

intpoint;/*crossoverpoint*/

/*selectcrossoverpoint*/

if(NVARS>1)

{

if(NVARS==2)

point=1;

else

point=(rand()%(NVARS-1))+1;

for(i=0;i

swap(&population[one].gene[i],&population[two].gene[i]);

}

}

/*************************************************************/

/*Swap:

Aswapprocedurethathelpsinswapping2variables*/

/*************************************************************/

voidswap(double*x,double*y)

{

doubletemp;

temp=*x;

*x=*y;

*y=temp;

}

/**************************************************************/

/*Mutation:

Randomuniformmutation.Avariableselectedfor*/

/*mutationisreplacedbyarandomvaluebetweenlowerand*/

/*upperboundsofthisvariable*/

/**********************************************************

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

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

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2