一个简单实用的遗传算法c程序完整版.docx

上传人:b****3 文档编号:27402395 上传时间:2023-06-30 格式:DOCX 页数:17 大小:20.88KB
下载 相关 举报
一个简单实用的遗传算法c程序完整版.docx_第1页
第1页 / 共17页
一个简单实用的遗传算法c程序完整版.docx_第2页
第2页 / 共17页
一个简单实用的遗传算法c程序完整版.docx_第3页
第3页 / 共17页
一个简单实用的遗传算法c程序完整版.docx_第4页
第4页 / 共17页
一个简单实用的遗传算法c程序完整版.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

一个简单实用的遗传算法c程序完整版.docx

《一个简单实用的遗传算法c程序完整版.docx》由会员分享,可在线阅读,更多相关《一个简单实用的遗传算法c程序完整版.docx(17页珍藏版)》请在冰豆网上搜索。

一个简单实用的遗传算法c程序完整版.docx

一个简单实用的遗传算法c程序完整版

HENsystemofficeroom【HEN16H-HENS2AHENS8Q8-HENH1688】

 

一个简单实用的遗传算法c程序

一个简单实用的遗传算法c程序(转载)

2009-07-2823:

09:

03阅读418评论0字号:

大中小

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

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

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

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

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

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

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

读者可以从,目录coe/evol中的文件中获得。

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

输入的文件由几行组成:

数目对应于变量数。

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

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

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

/*Thisisasimplegeneticalgorithmimplementationwherethe*/

/*evaluationfunctiontakespositivevaluesonlyandthe*/

/*fitnessofanindividualisthesameasthevalueofthe*/

/*objectivefunction*/

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

#include<>

#include<>

#include<>

/*Changeanyoftheseparameterstomatchyourneeds*/

#definePOPSIZE50/*populationsize*/

#defineMAXGENS1000/*max.numberofgenerations*/

#defineNVARS3/*no.ofproblemvariables*/

#definePXOVER/*probabilityofcrossover*/

#definePMUTATION/*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`'.Itrandomlygeneratesvalues*/

/*betweentheseboundsforeachgeneofeachgenotypeinthe*/

/*population.Theformatoftheinputfile`'is*/

/*var1_lower_boundvar1_upperbound*/

/*var2_lower_boundvar2_upperbound...*/

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

voidinitialize(void)

{

FILE*infile;

inti,j;

doublelbound,ubound;

if((infile=fopen("","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)/*(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/;

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

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-2022 冰豆网网站版权所有

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