遗传算法源代码.docx
- 文档编号:27749413
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:31
- 大小:21.65KB
遗传算法源代码.docx
《遗传算法源代码.docx》由会员分享,可在线阅读,更多相关《遗传算法源代码.docx(31页珍藏版)》请在冰豆网上搜索。
遗传算法源代码
这是一个非常简单的遗传算法源代码,是由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*/ /**********************************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遗传 算法 源代码