遗传算法的并行实现

上传人:沈*** 文档编号:94710443 上传时间:2022-05-23 格式:DOC 页数:21 大小:309KB
收藏 版权申诉 举报 下载
遗传算法的并行实现_第1页
第1页 / 共21页
遗传算法的并行实现_第2页
第2页 / 共21页
遗传算法的并行实现_第3页
第3页 / 共21页
资源描述:

《遗传算法的并行实现》由会员分享,可在线阅读,更多相关《遗传算法的并行实现(21页珍藏版)》请在装配图网上搜索。

1、 遗传算法 (基于遗传算法求函数最大值)指导老师:X建丽学 号:S201007156姓 名:杨平班 级:研10级1班遗传算法一、 遗传算法的基本描述遗传算法(Genetic Algorithm,GA)是通过模拟自然界生物进化过程来求解优化问题的一类自组织、自适应的人工智能技术。它主要基于达尔文的自然进化论和孟德尔的遗传变异理论。多数遗传算法的应用是处理一个由许多个体组成的群体,其中每个个体表示问题的一个潜在解。对个体存在一个评估函数来评判其对环境的适应度。为反映适者生存的思想,算法中设计一个选择机制,使得:适应度好的个体有更多的机会生存。在种群的进化过程中,主要存在两种类型的遗传算子:杂交和变

2、异。这些算子作用于个体对应的染色体,产生新的染色体,从而构成下一代种群中的个体。该过程不断进行,直到找到满足精度要求的解,或者达到设定的进化代数。显然,这样的思想适合于现实世界中的一大类问题,因而具有广泛的应用价值。遗传算法的每一次进化过程中的,各个体之间的操作大多可以并列进行,因此,一个非常自然的想法就是将遗传算法并行化,以提高计算速度。本报告中试图得到一个并行遗传算法的框架,并考察并行化之后的一些特性。为简单起见(本来应该考虑更复杂的问题,如TSP。因时间有些紧X,做如TSP等复杂问题怕时间不够,做不出来,请老师原谅),考虑的具有问题是:对给定的正整数n、n元函数f,以及定义域D,求函数f

3、在D内的最大值。二、 串行遗传算法1 染色体与适应度函数对函数优化问题,一个潜在的解就是定义域D中的一个点,因此,我们只需用一个长度为n的实数数组来表示一个个体的染色体。由于问题中要求求函数f的最大值,我们可以以个体所代表点在f函数下的值来判断该个体的好坏。因此,我们直接用函数f作为个体的适应度函数。2 选择机制选择是遗传算法中最主要的机制,也是影响遗传算法性能最主要的因素。若选择过程中适应度好的个体生存的概率过大,会造成几个较好的可行解迅速占据种群,从而收敛于局部最优解;反之,若适应度对生存概率的影响过小,则会使算法呈现出纯粹的随机徘徊行为,算法无法收敛。下面我们介绍在实验中所使用的选择机制

4、。我们定义为当前种群内所有个体的集合,为中所有个体的一个固定排列。若为某一个体,表示该个体的适应度,则种群的适应度定义为:对任意个体,的相对适应度定义为。相对适应度反映了个体的适应度在整个适应度总和中所占的比例。个体适应度越高,被选中的概率越高。累积适应度定义为:进行选择之前,先产生一个0到1之间的随机实数,若满足,则第k+1个个体被选中。循环以上过程,即得到生成下一代种群的母体。具体实现见如下函数:void pop_select(void)int mem, i, j, k;double sum = 0;double p;/* 计算种群适应度之和 */for (mem = 0; mem POP

5、SIZE; mem+)/* 按照累积适应度概率选取母体种群 */for (i = 0; i POPSIZE; i+)p = rand()%1000/1000.0;if (p population0.cfitness)newpopulationi = population0; elsefor (j = 0; j = populationj.cfitness &p populationj+1.cfitness)newpopulationi = populationj+1;/*计算种群的总适应度*/for (i = 0; i POPSIZE; i+)populationi = newpopulati

6、oni;sum += (populationmem.fitness - lower_fitness);/* 计算相对适应度 */for(mem = 0; mem POPSIZE; mem+)populationmem.rfitness = (populationmem.fitness - lower_fitness)/sum;population0.cfitness = population0.rfitness;/* 计算累积适应度 */for (mem = 1; mem POPSIZE; mem+)populationmem.cfitness = populationmem-1.cfitne

7、ss + populationmem.rfitness;3 杂交算子杂交算子的流程一般如下:(1) 按杂交概率选择一对参与进化的个体;(2) 随机确定一个截断点;(3) 将两个个体的染色体从截断点处截断,并交换,从而得到新的染色体。具体算法见如下函数:void crossover(void)int i, j,k, m, point;int first = 0;double x;for (k = 0; k POPSIZE; k+)x = rand()%1000/1000.0;/产生随机交叉概率 if (x PXOVER)/*如果随机交叉概率小于交叉概率,则进行交叉*/first+;if (fir

8、st % 2 = 0) if(NVARS = 2)point = 1;/得到一个交叉点elsepoint = (rand() % (NVARS - 1) + 1;for (j = 0; j point; j+)/交叉运算,两个个体的交叉点前的基因进行交换swap(&populationm.genej, &populationk.genej);elsem = k;4 变异算子在遗传算法中使用变异算子有两个目的:改善遗传算法的局部搜索能力。维持群体的多样性,防止出现早熟现象。变异操作的实现相当简单,只需遍历各染色体的各个单元,按某一变异概率将该单元变成一个随机的合法值。其执行过程是:(1)对个体的

9、每一个基因组,依变异概率Pm指定为变异点。(2)对每一个指定的变异点,对其基因取非或者用其他等位基因值来代替,从而产生一个新的个体。实现代码如下:void mutate(void)int i, j;double lbound, hbound;doublep;/定义p为随机变异概率for (i = 0; i POPSIZE; i+)for (j = 0; j NVARS; j+)p = rand()%1000/1000.0;if (p PMUTATION)populationi.genej = randval(lowerj, upperj);串行遗传算法的主要流程如图1所示。在每一次进化过程中,

10、总是找出种群中的最优解与最差解,并将最优解保存,将本次最差解用上次保存的最优解替换,这样保证了各次进化的最优解的适应度不会降低,从而增快收敛的速度。图1 串行遗传算法基本流程三、 算法设计分析图1中的串行算法,容易看出,在选择函数中,计算相对适应度需要用到全局种群的适应度之和,计算个体xk+1的累积适应度依赖于xk的累积适应度,如果在并行算法中要原封不动地模拟串行算法的运算,这些数据依赖关系都将产生通讯。更为不幸的是,选择后的个体需在各进程中作大量数据迁移。杂交算子中,一次杂交需要用到母体中的两个个体,若在这两个个体分配在不同进程,则需要进行一次通讯。此后的变异和评估都可以非常容易的实现并行,

11、并且完全不需要任何通讯。但最后一步求最优个体和最差个体需要对各进程进行归约。由这些分析可以看出,完全地模拟串行情形将使算法变得相当低效。幸运地是,遗传算法本身是一个概率算法,我们完全可以对串行算法作些必要的改变。如图2所示,我们将整个种群分成p个子种群,每一子种群由一个单一的进程负责。各进程独立地完成串行遗传算法的整个过程,唯一不同的是选择函数。各进程作选择操作时,首先计算各子种群内的局部累积适应度,然后根据局部累积适应度选择若干(本算法实现中使用的是常数3,也可以设为子种群大小的一个函数)个体按一固定规则轮流发送到其他进程;同时,按照该规则相应地从其他进程获取若干用来进行交流的个体。获取到个

12、体后,先将其暂存;然后按串行算法中的选择机制从原子种群中选择进行进化的母体;最后再用之前暂存的个体完成进程间的种群交流。对每一个待交流的个体,具体策略如下:(1) 随机地从本地的待进化母体种群内抽取与之进行交流的母体;(2) 比较本地个体与传送过来的待交流个体,选取适应度高者作为最终母体。各进程在每一次进化过程中,均分别保留各自的局部最优解,用来在下一次进化中替换局部最差的个体。各进程均完成所预定的进化迭代后,最后对各进程的局部最优解进行归约,从而得到整个算法的全局最优解。算法的主要流程详见图2。图2 并行遗传算法基本流程四、 算法实现该算法实现的最关键部分为选择中的种群交流,该功能有如下函数

13、实现void pop_select(void)MPI_Status status;MPI_Request handle;int mem, i, j, k;double sum = 0;double p;staticstruct genotype ex_memberEX_NUM;/* 计算子种群的总适应度 */for (mem = 0; mem TASK_NUM(pid); mem+) sum += (populationmem.fitness - lower_fitness);/* 计算各个体相应适应度 */for (mem = 0; mem TASK_NUM(pid); mem+) popu

14、lationmem.rfitness =(populationmem.fitness - lower_fitness)/sum;population0.cfitness = population0.rfitness;/* 计算各个体累积适应度 */for (mem = 1; mem TASK_NUM(pid); mem+) populationmem.cfitness=populationmem-1.cfitness+populationmem.rfitness;/* 按照累积适应度概率选取种群交流个体,并发送和接收 */for (i = 1; i = EX_NUM; i+) p = rand

15、()%1000/1000.0;if (p population0.cfitness) MPI_Isend(&population0, sizeof(struct genotype)/sizeof(char), MPI_CHAR, (pid+i*generation)%pnum, 0, MPI_M_WORLD, &handle);else for (j = 0; j = populationj.cfitness & p populationj+1.cfitness)MPI_Isend(&populationj+1, sizeof(structgenotype)/sizeof(char), MPI

16、_CHAR, (pid+i*generation)%pnum, 0, MPI_M_WORLD, &handle);break;MPI_Recv (&ex_memberi-1, sizeof(struct genotype)/sizeof(char), MPI_CHAR, (pid+(pnum-i)*generation)%pnum, 0, MPI_M_WORLD, &status);/* 按照累积适应度概率选取母体种群 */for (i = 0; i TASK_NUM(pid); i+)p = rand()%1000/1000.0;if (p population0.cfitness)newp

17、opulationi = population0; else for (j = 0; j = populationj.cfitness &p populationj+1.cfitness)newpopulationi = populationj+1;for (i = 0; i TASK_NUM(pid); i+)populationi = newpopulationi;/* 按优胜劣汰的原则完成种群交流 */for (i = 0; i EX_NUM; i+) j = rand()%TASK_NUM(pid);if (populationj.fitness ex_memberi.fitness)

18、 for (k = 0; k NVARS; k+) populationj.genek = ex_memberi.genek;populationj.rfitness = 0;populationj.cfitness = 0;populationj.fitness = ex_memberi.fitness;另外,全局最优解的归约由如下代码实现:MPI_Op_create(MPI_User_function *)gene_max, 1, &my_op);MPI_Reduce(local_best_individual, best_individual, NVARS+1, MPI_DOUBLE,

19、my_op, pnum-1, MPI_M_WORLD);其中,具体的归约操作由如下函数实现:void gene_max(double *in, double *inout, int *len, MPI_Datatype *dptr)int i;if (inout0 in0) /* 比较适应度 */for (i=0; i *len; +i) inouti = ini;/* 复制适应度较高的个体 */五、 算法分析与实验结果下面的实验结果是在192.169.129.47上利用结点vC0168-129-48(slaver)和vC0168-129-49(slaver)和vC0168-129-46(sl

20、aver)获得的。用来计算最大值的函数为其定义域如文件yangping.txt中所示,总种群大小为500,最大进化次数为2000。进程个数1234567运算时间32.3085949.1328124.3359382.7773443.6992192.9492192.621094加速比13.5376397.45135111.6329108.73389610.95496612.326377运行结果x122.45505022.45505022.45505022.45505022.45505022.45505022.455050x27.2055007.2790007.2895007.2370007.289

21、5007.2895007.289500x319.26950019.23900019.26950019.26950019.26950019.26950019.269500x44.9440004.9920004.0720004.9840004.8880004.9840004.968000x5-1.193000-1.196500-1.200000-1.200000-1.200000-1.196500-1.200000x6-9.120000-9.113180-9.072260-9.120000-9.120000-9.120000-9.120000f157521400.960884157373629.6

22、94664157325373.684378157701606.886265157673921.515628157623544.425141157702393.783168进程个数891011121314运算时间2.2265622.5742192.4492192.6171882.2890622.6640622.597656加速比14.51053012.55083313.19138612.34477414.11433812.12756812.437595运行结果x122.45505022.45505022.45505022.45505022.45505022.45505022.455050x27.

23、2895007.2895007.2790007.2895007.2895007.2895007.279000x319.26950019.26950019.26950019.26950019.26950019.26950019.269500x44.9200004.9760004.9920004.9840004.9920004.9680004.992000x5-1.200000-1.200000-1.200000-1.200000-1.200000-1.196500-1.200000x6-9.120000-9.120000-9.120000-9.120000-9.120000-9.120000-9

24、.120000f157689427.608764157704566.391334157624693.663186157706742.306205157708921.527178157619195.230127157707891.211178表1 实验结果结果分析:表1中最为有趣的现象是,当进程数小于5时,该算法的加速比似乎与进程数p存在一个平方关系,也就是说,存在一个超线性加速的关系。进程数大于等于5时,这种超线性加速实际也应该存在,只是由于节点数的限制,被进程管理的开销所限制。下面我们通过估计时间复杂性来分析造成这种超线性加速的原因。如果将对染色体中每一变元上的一个计算看作一个基本计算,并设

25、变元数为k,总种群中个体数为n,进程数则对每一进程,分析容易得到:pop_select函数最坏情形的时间复杂性为O(kn/p)2),crossover函数最坏情形的时间复杂性为O(kn/p),mutate函数最坏情形的时间复杂性为O(kn/p),评估函数最坏情形的时间复杂性为O(kn/p),elitist函数最坏情形的时间复杂性为O(n/p+k)。此外,按照算法的设计,在选择过程中的通讯所耗费的时间为O(kn/p)。综合可知,一次进化的时间复杂性为O(kn/p)2)。因此,所有进程总的计算时间最坏情形的渐近上界为O(kn)2/p)。而串行遗传算法一次进化的时间复杂性为O(kn)2),这就解释了

26、为什么p小于5的情形会具有超线性加速。当然,这并不能说明并行计算真能产生超线性加速比,因为我们可以非常有效地用一个进程来模拟p个进程的计算,也就是说在串行的情形下也能达到这样的加速。真正值得研究的问题是分析上述建立并行遗传算法收敛速度与串行遗传算法的收敛速度之间的关系。不过从表1可以看出,进程增加时,解得质量并没有任何降低。六、 源程序清单/ genetic.cpp : 定义控制台应用程序的入口点。/#include#includempi.h#include#include#include#include#definePOPSIZE500 /*种群大小*/#defineNVARS6 /*染色体

27、的长度*/#defineMAXGENS2000 #definePXOVER0.8 /* 杂交概率*/#definePMUTATION0.15 /* 变异概率*/#defineTASK_NUM(i)(POPSIZE+pnum-1)/pnum)/#define TASK_NUM(i)(i)=pnum-1 & POPSIZE%(POPSIZE+pnum-1)/pnum)? POPSIZE%(POPSIZE+pnum-1)/pnum):(POPSIZE+pnum-1)/pnum)#defineEX_NUM3structgenotypedoublegeneNVARS; /*记录染色体的基因*/doubl

28、efitness; /* 适应度*/doublerfitness; /* 相对适应度*/doublecfitness; /* 累积适应度*/ *population, *newpopulation;doublelowerboundNVARS; doubleupperboundNVARS; doublelocal_best_individualNVARS+1;/* 局部最优解*/doublebest_individualNVARS+1;/* 全局最优解*/intgeneration;doublelower_fitness; /*最小的适应度*/FILE *galog; intpid, pnum;

29、 /*记录进程编号和进程数*/doublerandval(doublelow, doublehigh) /*编码函数*/doubleval;val = (double)(rand()%1000)/1000.0)*(high - low) + low;returnval;voidinitialize(void) /*初始化函数*/FILE *infile;inti, j, r;doublelbound, ubound;MPI_Statusstatus;population = (structgenotype*)malloc(sizeof(structgenotype)*(TASK_NUM(pid

30、)+1); /定义一个genotype类型指针,用于存放种群newpopulation = (structgenotype*)malloc(sizeof(structgenotype)*(TASK_NUM(pid)+1); /定义一个genotype类型指针newpopulation,用于存放产生新的种群if (pid !=pnum - 1) if (infile = fopen(yangping.txt,r)=NULL) /打开文件,读入每个自变量的定义域fprintf(galog,nCannot open input file!n);exit(1);srand(time(0);for (i

31、=0; ipnum; i+) r = rand();MPI_Send(&r, 1, MPI_INT, i, 1, MPI_M_WORLD); /初始化每个进程的种群for (i = 0; i NVARS; i+) fscanf(infile, %lf,&lowerboundi); /lowerbound记录各个自变量的定义域的下限fscanf(infile, %lf,&upperboundi); /upperbound记录各个自变量的定义域的上限else MPI_Recv(&r, 1, MPI_INT, pnum-1, 1, MPI_M_WORLD, &status); /进程号为pnum-1

32、的作为主进程,负责从其他子进程收集信息srand(r);MPI_Bcast(lowerbound, NVARS, MPI_DOUBLE, pnum-1, MPI_M_WORLD); /MPI_Bcast 是从一序号为pnum-1的主进程将一条消息广播发送到进程组内的所有进程MPI_Bcast(upperbound, NVARS, MPI_DOUBLE, pnum-1, MPI_M_WORLD);for (j = 0; j TASK_NUM(pid); j+) populationj.fitness = 0; /初始化适应度为populationj.rfitness = 0; /初始化相对适应度

33、为populationj.cfitness = 0; / 初始化累计适应度为/printf(nGene of member %d in %d is:n, j, pid);for (i = 0; i NVARS; i+) populationj.genei = randval(lowerboundi, upperboundi); /将编码后的个体染色体放入种群数组population中/printf( %lf , populationj.genei);if (pid = pnum - 1) fclose(infile);/*进化函数*/voidevaluate(void)intmem;inti;

34、doublexNVARS+1;lower_fitness = 0.0;for (mem = 0; mem TASK_NUM(pid); mem+) /解码过程for (i = 0; i NVARS; i+)xi+1 = populationmem.genei; /计算每个染色体中自变量的值populationmem.fitness = (x1*x1*x1*x1*x1*x1) /定义每个染色体的适应度函数- (x1*x2*x3*x4*x4*x6) + (x3*x3*x3*x3*x3*x5*x6)- (x2*x4*x5*x5*x6) - (x1*x1*x3*x3*x5*x5)+ (x2*x2*x3

35、*x5*x6) + (x1*x2*x4*x4*x4*x5);/printf( The fitness of %d at %lf, %lf, %lf, %lf, %lf, %lf is %lfn, mem, x0, x1, x2, x3, x4, x5, populationmem.fitness);if (populationmem.fitness lower_fitness) lower_fitness = populationmem.fitness; /记录最小的适应度/*保存最优个体函数*/voidkeep_the_best() intmem, i, cur_best = 0;for (

36、mem = 0; mem populationTASK_NUM(pid).fitness) cur_best = mem; /用Cur_best记录最大适应度的染色体populationTASK_NUM(pid).fitness = populationmem.fitness; /printf(nG%4d: the best individual in Process %d is %d, the fitness is %lf.n, generation, pid, cur_best, populationcur_best.fitness);for (i = 0; i NVARS; i+) po

37、pulationTASK_NUM(pid).genei = populationcur_best.genei;local_best_individuali+1 = populationcur_best.genei; /保存最有个体local_best_individual0 = populationcur_best.fitness;/*选择函数*/voidpop_select(void)MPI_Statusstatus; /通信状态MPI_Requesthandle; /定义一个通信请求对象intmem, i, j, k;doublesum = 0;doublep;staticstructge

38、notypeex_memberEX_NUM; /定义一个genotype的数组用以记录交流个体/*计算子种群的总适应度*/for (mem = 0; mem TASK_NUM(pid); mem+) sum += (populationmem.fitness - lower_fitness);/printf( Sum %d is %lfn, mem, sum);/* 计算各个体相应适应度*/for (mem = 0; mem TASK_NUM(pid); mem+) populationmem.rfitness = (populationmem.fitness - lower_fitness)

39、/sum;/printf(The fitness of %d is %lf, the rfitness is %lfn, mem, populationmem.fitness, populationmem.rfitness);population0.cfitness = population0.rfitness; /* 计算各个体累积适应度*/for (mem = 1; mem TASK_NUM(pid); mem+) populationmem.cfitness = populationmem-1.cfitness + populationmem.rfitness;/* 按照累积适应度概率选

40、取种群交流个体,并发送和接收*/for (i = 1; i = EX_NUM; i+) p = rand()%1000/1000.0; if (p population0.cfitness) MPI_Isend(&population0, sizeof(structgenotype)/sizeof(char), MPI_CHAR, (pid+i*generation)%pnum, 0, MPI_M_WORLD, &handle);else for (j = 0; j = populationj.cfitness & p populationj+1.cfitness) MPI_Isend(&po

41、pulationj+1, sizeof(structgenotype)/sizeof(char), MPI_CHAR, (pid+i*generation)%pnum, 0, MPI_M_WORLD, &handle);break;MPI_Recv (&ex_memberi-1, sizeof(structgenotype)/sizeof(char), MPI_CHAR, (pid+(pnum-i)*generation)%pnum, 0, MPI_M_WORLD, &status);for (i = 0; i TASK_NUM(pid); i+)p = rand()%1000/1000.0;

42、if (p population0.cfitness)newpopulationi = population0; else for (j = 0; j = populationj.cfitness &p populationj+1.cfitness)newpopulationi = populationj+1;/* once a new population is created, copy it back */for (i = 0; i TASK_NUM(pid); i+)populationi = newpopulationi;for (i = 0; i EX_NUM; i+) j = r

43、and()%TASK_NUM(pid);if (populationj.fitness ex_memberi.fitness) for (k = 0; k 1) if(NVARS = 2)point = 1;elsepoint = (rand() % (NVARS - 1) + 1; /随机选择交叉点for (i = 0; i point; i+)swap(&populationone.genei, &populationtwo.genei); /交叉运算,两个个体的交叉点前的基因进行交换/*杂交函数*/voidcrossover(void)inti, mem, one;intfirst =

44、0; /* count of the number of members chosen */doublex; /产生随机交叉基因for (mem = 0; mem TASK_NUM(pid); mem+) x = rand()%1000/1000.0;if (x PXOVER) /如果随机交叉概率小于交叉概率,则进行交叉*/first+;if (first % 2 = 0)Xover(one, mem); /交叉运算elseone = mem;/*变异函数*/voidmutate(void)inti, j;for (i = 0; i TASK_NUM(pid); i+)for (j = 0;

45、j NVARS; j+)if (rand()%1000/1000.0 PMUTATION) /* find the bounds on the variable to be mutated */populationi.genej = randval(lowerboundj, upperboundj); /*变异操作*/*选出最优适应度函数和最差个体*/voidelitist(void)inti;doublebest, worst; /*best 和worst分别保存最大适应度和最小适应度*/intbest_mem, worst_mem; /*best_mem和worst_mem分别保存最优个体

46、和最差个体*/best = population0.fitness; /初始化最大适应度worst = population0.fitness;/初始化最小适应度for (i = 0; i populationi+1.fitness) if (populationi.fitness = best)best = populationi.fitness;best_mem = i;if (populationi+1.fitness = worst)worst = populationi+1.fitness;worst_mem = i + 1;elseif (populationi.fitness =

47、 best)best = populationi+1.fitness;best_mem = i + 1;if (best = populationTASK_NUM(pid).fitness)for (i = 0; i NVARS; i+) populationTASK_NUM(pid).genei = populationbest_mem.genei;local_best_individuali+1 = populationbest_mem.genei;populationTASK_NUM(pid).fitness = populationbest_mem.fitness;local_best

48、_individual0 = populationbest_mem.fitness;elsefor (i = 0; i NVARS; i+)populationworst_mem.genei = populationTASK_NUM(pid).genei;populationworst_mem.fitness = populationTASK_NUM(pid).fitness;/printf( Generation %d in Process %d: best = %lf, worst =%lfn, generation, pid, local_best_individual0, worst)

49、;/printf(nG%4d: the best individual in Process %d is %d, the fitness is %lf.n, generation, pid, best_mem, populationbest_mem.fitness);/*输出函数,输出到指定的文件*/voidreport(void)inti, j;fprintf(galog, nGene data in %d for generation %d is:n, pid, generation);for (j = 0; j TASK_NUM(pid); j+) fprintf(galog, %4d

50、:, j);for (i = 0; i NVARS; i+) fprintf(galog, t%10.6lf , populationj.genei);fprintf(galog, : %20.6lfn, populationj.fitness);voidgene_max(double *in, double *inout, int *len, MPI_Datatype *dptr)inti;if (inout0 in0) /* 比较适应度*/for (i=0; i *len; +i) /* 复制适应度较高的个体*/inouti = ini;intmain(intargc, char *arg

51、v)doublestartwtime = 0.0, endwtime; /*定义starttime和endtime用于记录运行所需要的时间*/inti, j, flag;intn = 0;MPI_Opmy_op;MPI_Init(&argc, &argv);MPI_m_size(MPI_M_WORLD, &pnum); /得到进程数,放入pnum中MPI_m_rank(MPI_M_WORLD, &pid); /确定进程编号,放入pid中fprintf(stdout, Process %d of %d start .n,pid, pnum);/if (galog = fopen(ga_log.t

52、xt,w)=NULL)/exit(1);/galog = stdout;generation = 0;if (pid = pnum - 1) srand(time(0);startwtime = MPI_Wtime();initialize();evaluate();keep_the_best();/report();while(generationMAXGENS)generation+;pop_select();crossover();mutate();/report();evaluate();elitist();MPI_Op_create(MPI_User_function *)gene_

53、max, 1, &my_op);/*MPI_Reduce将组内每个进程输入缓冲区中的数据按my_op 操作组合起来,并将其结果返回到序号为root 的进程的输出缓冲区中*/MPI_Reduce(local_best_individual, best_individual, NVARS+1, MPI_DOUBLE, my_op, pnum-1, MPI_M_WORLD);if (pid = pnum - 1) fprintf(galog, n The solution is (population size = %d, # of generations = %d):n, TASK_NUM(0)*pnum, genera

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!