遗传算法C语言代码.docx

上传人:b****8 文档编号:10052704 上传时间:2023-02-08 格式:DOCX 页数:19 大小:19.61KB
下载 相关 举报
遗传算法C语言代码.docx_第1页
第1页 / 共19页
遗传算法C语言代码.docx_第2页
第2页 / 共19页
遗传算法C语言代码.docx_第3页
第3页 / 共19页
遗传算法C语言代码.docx_第4页
第4页 / 共19页
遗传算法C语言代码.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

遗传算法C语言代码.docx

《遗传算法C语言代码.docx》由会员分享,可在线阅读,更多相关《遗传算法C语言代码.docx(19页珍藏版)》请在冰豆网上搜索。

遗传算法C语言代码.docx

遗传算法C语言代码

遗传算法C语言代码

遗传算法C语言代码

遗传算法C语言代码

//GA.cpp:

Definestheentrypointfortheconsoleapplication.

//

/*

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

SitaS.Raghavan(UniversityofNorthCarolinaatCharlotte)修正。

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

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

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

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

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

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

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

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

输入的文件由几行组成:

数目对应于变量数。

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

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

*/

 

#include

#include

#include

/*Changeanyoftheseparameterstomatchyourneeds*/

//请根据你的需要来修改以下参数

#definePOPSIZE50/*populationsize种群大小*/

#defineMAXGENS1000/*max.numberofgenerations最大基因个数*/

constintNVARS=3;/*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;新种群*/

/*replacestheoldgeneration*/

//取代旧的基因

/*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,j,i;

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)

{

intmem,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*/

/*sel

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

当前位置:首页 > PPT模板 > 艺术创意

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

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