遗传算法源代码.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;ix[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;ipopulation[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;ipopulation[POPSIZE].gene[i]=population[best_mem].gene[i];
population[POPSIZE].fitness=population[best_mem].fitness;
}
else
{
for(i=0;ipopulation[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(pnewpopulation[i]=population[0];
else
{
for(j=0;jif(p>=population[j].cfitness&&
pnewpopulation[i]=population[j+1];
}
}
/*onceanewpopulationiscreated,copyitback*/
for(i=0;ipopulation[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;iswap(&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*/
/**********************************************************