遗传算法的并行实现
建筑设计中遗传算法的研究及实现

建筑设计中遗传算法的研究及实现一、引言随着信息技术的快速发展和应用,建筑设计领域也开始引入计算机辅助设计工具。
遗传算法作为一种有效的优化算法,具有全局搜索能力和并行计算优势,被广泛应用于建筑设计中。
本文将深入探讨建筑设计中遗传算法的研究和实现。
二、遗传算法概述遗传算法是模拟生物进化过程的一种智能优化算法。
它基于自然选择和遗传机制,通过不断迭代搜索和交叉变异操作,逐步优化问题的解。
遗传算法最大的特点是可以同时搜索多个解空间,具有较强的全局寻优能力。
三、建筑设计中的优化问题在建筑设计中,存在许多复杂的问题需要进行优化。
比如,建筑结构的拓扑优化、能源利用的最优化、平面布局的最佳化等。
这些问题涉及到多个变量和约束条件,传统的优化算法往往无法快速找到全局最佳解。
而遗传算法可以通过大规模的搜索和演化,找到较优的设计方案。
四、建筑设计中遗传算法的应用1. 建筑结构优化遗传算法可以应用于建筑结构的拓扑优化问题。
通过对建筑结构进行节点的增减、连杆延长和删减等操作,不断演化出更加优化的结构形式。
这一方法可以有效提高结构的稳定性和抗震性能。
2. 建筑能源优化能源利用是建筑设计中一个重要的考虑因素。
遗传算法可以通过调整建筑的朝向、窗户的位置和大小,寻找能够最大程度减少能耗的设计方案。
同时,遗传算法还可以优化建筑内部的供暖、通风、照明等系统,提高能源利用效率。
3. 平面布局规划在建筑设计中,平面布局对于功能性和空间利用率至关重要。
遗传算法可以通过对建筑内部空间的划分、功能区域的安排等操作,找到最佳的平面布局方案。
这有助于提高建筑的使用效率和舒适性。
五、建筑设计中遗传算法的实现建筑设计中遗传算法的实现过程主要包括以下几个步骤:“问题定义、设计变量和约束条件的设置、适应度函数的构建、初始种群的生成、遗传算子的设计、收敛条件的判断和结果分析”。
首先,需要明确建筑设计中所要解决的优化问题,如建筑结构的拓扑优化、能源利用的最优化等。
简述遗传算法的主要特点

简述遗传算法的主要特点遗传算法是一种基于生物遗传学原理的优化算法,模拟了自然进化过程中的基因遗传和适应度选择机制。
它具有以下主要特点:1.强大的全局能力:遗传算法通过随机生成的初代种群,通过迭代过程,逐步最优解,能够在大规模、复杂的空间中找到全局最优解。
遗传算法不受初始点的选择和初始方向的限制,可以有效避免局部最优解陷阱。
2.并行可并行化:遗传算法的主要操作,如选择、交叉、变异等可以并行执行。
通过并行化,可以加速算法的收敛速度和效率,更好地利用计算资源。
3.高度自适应性:遗传算法通过优秀个体的选择机制,使其在进化过程中具有较高的自适应性。
优秀的个体会通过复制、变异等操作被保留下来,并进一步与其他个体进行交叉,通过良好的适应度选择,更好地实现进化。
4.灵活性和通用性:遗传算法可以应用于各种优化问题,不论是离散型问题还是连续型问题,不论是否存在约束条件。
遗传算法的基本操作可以根据具体问题进行调整和扩展,具有较强的灵活性和适应性。
5.与问题无关的性质:遗传算法对问题的可导性、连续性等要求较低,对问题的特定知识和结构的先验要求较少。
只需要通过问题的适应度函数来评估个体的适应度,因此具有较强的问题无关性。
6.直观易理解:遗传算法通过模拟生物进化过程,通过基因变异、交叉等操作实现个体的进化。
这种自然模拟的方式,使得算法的原理和实现具有较好的直观性和易理解性。
7.可并嵌入其他算法中:遗传算法具有较好的可并嵌入性,可以与其他优化算法相结合,如粒子群优化、模拟退火等,形成混合优化算法,发挥不同算法的优势,提高能力和效果。
8.非确定性的:遗传算法的过程是基于随机化的,通过对个体的随机生成、变异、交叉等操作,引入了随机性,可以避免无效和陷入局部最优解。
同时,该特点使得遗传算法的非确定性,可能在不同情况下得到不同的结果。
9.可解释性和可视化:遗传算法的过程可以通过数据的可视化来展现,每一代的最优解、适应度值的变化趋势等都可以通过图表等方式进行展示。
并行遗传算法的研究及应用进展

关键词: 遗传算法; 并行 遗传 算法; 并行模 型 中图分类号 : T P 3 0 1 文献标识码 : A 文章编号 : 1 0 0 9 — 3 0 4 4 ( 2 0 1 4 ) 1 0 — 2 3 4 7 — 0 4
Re s e ar c h Pr o gr e s s o f Pa r al l e l Ge ne t i c Al gor i t hm
w hi c h g r e a t l y p r om ot e s t he r e s e a r c h a nd a p p l i c a t i o n i n g e ne t i c a l go it r hm .Th e r e c e nt r e s e a r c h de ve l o pm e nt s i n PG A mo de l s , pe r — f o r ma nc e a n a l ys i s ,a l go it r hm i mp r ov e me nt ,a nd i mp l e me nt a t i on p l a t f or m a r e s u mma r i z e d a nd r e v i e we d,a nd t he de ve l o pm e nt t r e n ds a n d a p p l i c a t i on pe r s p e c t i v e s ofPGA i n t h e f ut ur e i s a l s o di s c us s e d . Ke y wor ds :g e n e t i c a l g or i t h m; p a r a l l e l ge ne t i c a l g o r i t hm ;p a r a He I m od e l
多种群协同进化的并行遗传算法

多种群协同进化的并行遗传算法多种群协同进化并行遗传算法(Multi-population Cooperative Coevolutionary Parallel Genetic Algorithm, MCCPGA)是一种基于群体协作的进化算法,通过将一个大问题分解为多个子任务,并使用多个种群并行地进行进化,以提高算法效率。
本文将对多种群协同进化并行遗传算法的原理、优点以及应用进行详细介绍。
首先,多种群协同进化并行遗传算法的基本原理是将一个大问题分解成多个子任务,每个子任务由一个种群独立进化。
不同子任务之间通过共享信息交流、协作进化来改善效果。
算法的基本步骤为:初始化多个种群,每个种群为一个子任务的解空间;进行进化操作,包括选择、交叉、变异等;定期进行群体间信息交流,如共享精英个体、最优个体传递等;直到满足终止条件为止。
多种群协同进化并行遗传算法具有以下几个优点。
首先,通过并行计算,同时进行多个种群的进化,加快了算法的速度和收敛速度。
其次,多种群之间的信息交流可以引入不同种群的优势,提高了群体的多样性和整体的能力。
此外,不同子任务的粒度可以根据问题的特点进行调整,灵活性较高,适用范围广。
多种群协同进化并行遗传算法已经在多个领域得到了广泛应用。
例如,在优化问题中,可以将每个种群看作是一个决策变量的子集,通过不同种群的协作进化来求解全局最优解。
在机器学习中,不同种群可以分别学习不同任务的特征,通过信息交流来提高整体的分类准确率。
在智能控制中,可以构建多个控制子系统,通过种群之间的协同来优化整体的控制性能。
总而言之,多种群协同进化并行遗传算法是一种通过多个种群的协作进化来求解复杂问题的进化算法。
通过并行计算和信息交流,该算法能够加快速度、提高能力,已经在优化问题、机器学习、智能控制等领域取得了良好的效果。
未来,随着计算力的提升和算法的改进,多种群协同进化并行遗传算法有望在更多的应用领域发挥重要作用。
遗传算法的并行实现

遗传算法的并行实现遗传算法(Genetic Algorithm,GA)是一种模拟自然进化过程的优化算法。
它模拟了生物进化的基本原理,通过迭代的方式不断优化空间中的解,以找到最优解或者接近最优解。
在遗传算法的实现中,可以采用并行计算的方式来提高算法的效率和性能。
并行计算将任务拆分成多个子任务,同时进行处理,并通过协同工作来加速计算过程。
并行实现遗传算法的主要思路有以下几种方式:1. 池式并行(Pool-Based Parallelism):多个遗传算法进程同时运行,并且每个进程都具有自己的种群和繁殖操作。
这些进程可以根据需要交换信息,例如交换最佳个体,以进一步加速过程。
2. 岛模型并行(Island Model Parallelism):将种群划分为多个子种群,每个子种群在独立的进程中进行演化。
定期地选择一些个体进行迁移,使得不同子种群的个体可以交流基因信息。
这种方式类似于地理上的岛屿,每个岛屿代表一个子种群,岛屿之间的迁移模拟了个体在不同岛屿之间的迁徙。
3. 数据并行(Data Parallelism):将种群的每个个体划分成多个部分,每个部分在不同的处理器上进行计算。
这种方法将空间分割成多个子空间,以加速算法的收敛过程。
4. 任务并行(Task Parallelism):将遗传算法的各个操作(例如选择、交叉、变异等)分解为多个任务,并行执行这些任务。
每个任务可以在不同的处理器上同时进行,从而加速算法的执行。
并行实现遗传算法的优势在于它可以通过利用多个处理单元,同时处理并行化的任务,使得算法的过程更加高效。
并行计算可以加速算法的收敛速度,减少空间中的局部最优解,并提供更好的全局能力。
然而,并行实现也会带来一些挑战和注意事项。
例如,如何划分任务以达到最佳的负载均衡,如何设计通信、同步和数据共享机制等等,都需要仔细考虑和解决。
总之,遗传算法的并行实现是一个非常广泛且复杂的课题,需要综合考虑问题的特性、硬件的条件和算法设计的需求。
遗传算法的使用方法和技巧指南

遗传算法的使用方法和技巧指南遗传算法是一种启发式优化算法,它模拟了自然界中的生物进化过程来解决问题。
它具有强大的搜索能力和全局优化能力,在各个领域都有广泛的应用。
本文将介绍遗传算法的基本原理、使用方法以及一些重要的技巧指南。
一、遗传算法的基本原理遗传算法基于生物进化的思想,通过模拟人工选择、交叉和变异等过程来生成和更新解的种群,并利用适应度函数对种群进行评估和选择,以期望通过迭代的方式找到最优解。
遗传算法的基本流程如下:1. 初始化种群:随机生成一组个体作为初始种群。
2. 适应度评估:根据问题的特定要求,计算每个个体的适应度值。
3. 选择操作:利用适应度值选择父代个体进行繁殖,常用的选择算法有轮盘赌选择和竞争选择等。
4. 交叉操作:通过交叉运算生成新的后代个体,交叉操作能够保留父代的有益特征。
5. 变异操作:对交叉后的个体进行基因的随机变异,增加种群的多样性。
6. 替换操作:根据一定的规则,用新生成的后代个体替换原始种群中的一部分个体。
7. 终止条件判断:根据迭代次数或者达到某个预定义的解的条件,判断是否终止迭代。
8. 返回最优解。
二、遗传算法的使用方法为了正确有效地使用遗传算法,我们需要遵循以下几个步骤:1. 理解问题:首先,要准确理解问题的特性和要求,包括确定问题的目标函数、约束条件等。
只有对问题有清晰的认识,才能设计合适的遗传算法。
2. 设计编码方案:将问题的解表示为染色体的编码方案,更好的编码方案可以减少解空间的搜索范围。
常用的编码方式有二进制、浮点数、整数等。
3. 确定适应度函数:根据问题的特点,设计合适的适应度函数用于度量个体的优劣。
适应度函数应能够将问题的目标转化为一个数值,使得数值越大越好或者越小越好。
4. 选择操作:选择操作决定了如何根据适应度值选择父代个体。
常用的选择算法有轮盘赌选择、竞争选择、排名选择等。
轮盘赌选择是普遍应用的一种方法,根据个体的适应度值按比例选择。
5. 交叉操作:交叉操作决定了如何生成新的后代个体。
并行化改进遗传算法的FPGA高速实现方法

遗 传算法 能够模 拟 自然 界优 胜劣汰适 者生存 的进化 过程 , 索 出最优解 , 广泛用 于实现各 种复杂 的应用 场 搜 被 合 ,如 图像处理 、 自适应控 制 、通信 系统 、人 工神 经 网络 等[5 1] - 。一般 情况 下 ,遗 传算法都 需要 大量 的运算进 而 达 到优化 的过程 。目前 ,人们 大都采 用软件 实现遗 传算法 ,这使 遗传算 法的实 现受到计算 机运 行速度 的影响 , 在 实 时 性 要 求 高 的 场 合 的 应 用 受 到 限制 ,因此 研 究 基 于 硬 件 实 现 的 遗 传 算 法 十 分 必 要 。 一 代 现 场 可 编 程 逻 辑 门 阵 新 列 (P A 的 出现 ,使遗传 算法 的硬件 实现变 为现实 ,且更加 方便 。本 文采用 V r o FG ) ei g硬件描述 语言 ,设计 了一 种 l 基于 F G P A的遗 传算法 硬件 系统 ,并 分别采 用 Mo e i d l m和 Q ats I s u r 对设计 进行 了功能仿 真和综 合后时序 仿真 。 u I
式 ,将 遗 传 算 法 传 统 实 现 方 法 的 控 制 部 分 分 解 到 各 模 块 内部 ,按 照 流 水 线 模 式 , 应 用 现 场 可 编 程 逻 辑 门 阵 列(P A) 速 实 现 。 综 合 后 时 钟 频 率 达 到 170 z 演 化 l代 需 6 FG 高 3 .8MH , 4个 时 钟 周 期 , 即 0 6 s 实 现 结 构 节 约 硬 件 资 源 , 效 率 高 ,使 大 规 模 遗 传 算 法 的高 速 硬 件 实 现 成 为 可 能 。 . 7I 。 4 x 关 键 词 :遗 传 算 法 ; 硬 件 并 行 化 ; 现 场 可 编 程 逻 辑 门 阵 列 ; 演 化 中 图 分 类 号 :T 4 N7 文献标 识码 : 实现 方 法 P A
电力系统负荷恢复优化的并行遗传算法实现

本 文 中尝 试将 并行 遗传算 法 的思想应 用 于 电力 系统 的 负荷恢 复 , 效地 提高 了算法 的计 算速 度 , 有 同时遗 传算 子 的设计使 算法 在一 定程 度上避 免 了寻优 中的
过早 收敛 问题 .
第6 期
张志毅 等 :电力系统 负荷恢 复优 化的并行 遗传算法, :mx X = a( f l训 m+ , , k
张志毅 文福栓 刘敏 忠
(. 1武汉大学 电气工程学院 , 湖北 武汉 4 0 7 ; . 30 2 2 华南 理工 大学 电力学 院,广东 广州 5 04 ; 16 0 3 武汉大学 计算机学 院 , . 湖北 武汉 4 0 7 ) 30 2
摘
要 :对 电力 系统 的 负荷 恢 复 问题 进 行 了研 究 . 该 问题 建模 为 一个 多约 束条 件 的 组 将
优化问题时, 面临着两个 主要 困难 : 1 计算 、 () 搜索
的 时间过 长 ;2 过早 收敛 问题. () 对此 研 究人 员 作 了 大 量 的研究 工作 , 其主要 方法 包括 : 改进 选择 机制 和 进 化算 子 、 引用 自调整 技术 、 优化参 数设 置 和采 用并 行 实现 随着计 算 机 技 术 的飞 速 发 展 , 用并 行 引. 应
优化方法 及 电力 系统 的恢 复 控 制 研 究. — a :zzi E m i hy@ l
1 3.o 6 c m
优先恢复重要负荷的同时最多地恢复负荷并满足所 有 的约束 条件 , 样 可 以列 出 系统 负 荷恢 复 时 的 目 这 标 函数如 下 :
维普资讯
合优化 问题 , 据遗传 算 法特 别适 合 求解大规 模组 合优 化 问题 的特 点 , 计 了一种粗 粒度 根 设 并行遗 传 算法 来对此优 化 问题 进行 求解 . 消息传 递 类并行 软 件 开发 环 境提 供 的基 于 消 在 息传 递 的并行虚 拟环境 下 , 用 m s rs v 并行 编 程模 式 , 效地 提 高 了算 法的计 算 采 at /l e的 e a 有
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
遗传算法(基于遗传算法求函数最大值)指导老师:刘建丽学号:S201007156姓名:杨平班级:研10级1班遗传算法一、 遗传算法的基本描述遗传算法(Genetic Algorithm ,GA )是通过模拟自然界生物进化过程来求解优化问题的一类自组织、自适应的人工智能技术。
它主要基于达尔文的自然进化论和孟德尔的遗传变异理论。
多数遗传算法的应用是处理一个由许多个体组成的群体,其中每个个体表示问题的一个潜在解。
对个体存在一个评估函数来评判其对环境的适应度。
为反映适者生存的思想,算法中设计一个选择机制,使得:适应度好的个体有更多的机会生存。
在种群的进化过程中,主要存在两种类型的遗传算子:杂交和变异。
这些算子作用于个体对应的染色体,产生新的染色体,从而构成下一代种群中的个体。
该过程不断进行,直到找到满足精度要求的解,或者达到设定的进化代数。
显然,这样的思想适合于现实世界中的一大类问题,因而具有广泛的应用价值。
遗传算法的每一次进化过程中的,各个体之间的操作大多可以并列进行,因此,一个非常自然的想法就是将遗传算法并行化,以提高计算速度。
本报告中试图得到一个并行遗传算法的框架,并考察并行化之后的一些特性。
为简单起见(本来应该考虑更复杂的问题,如TSP 。
因时间有些紧张,做如TSP 等复杂问题怕时间不够,做不出来,请老师原谅),考虑的具有问题是:对给定的正整数n 、n 元函数f ,以及定义域D ,求函数f 在D 内的最大值。
二、 串行遗传算法1. 染色体与适应度函数对函数优化问题,一个潜在的解就是定义域D 中的一个点011(,,...,)n x x x -,因此,我们只需用一个长度为n 的实数数组来表示一个个体的染色体。
由于问题中要求求函数f 的最大值,我们可以以个体所代表点011(,,...,)n x x x -在f 函数下的值来判断该个体的好坏。
因此,我们直接用函数f 作为个体的适应度函数。
2. 选择机制选择是遗传算法中最主要的机制,也是影响遗传算法性能最主要的因素。
若选择过程中适应度好的个体生存的概率过大,会造成几个较好的可行解迅速占据种群,从而收敛于局部最优解;反之,若适应度对生存概率的影响过小,则会使算法呈现出纯粹的随机徘徊行为,算法无法收敛。
下面我们介绍在实验中所使用的选择机制。
我们定义P 为当前种群内所有个体的集合,(0)(1)(1),,...,n x x x -为P 中所有个体的一个固定排列。
若xP ∈为某一个体,()f x 表示该个体的适应度,则种群P 的适应度定义为:1()0()()n i i s P f x -==∑ 对任意个体x P ∈,x 的相对适应度定义为()()/()r x f x s P =。
相对适应度()r x 反映了个体()i x 的适应度在整个适应度总和中所占的比例。
个体适应度越高,被选中的概率越高。
累积适应度定义为:进行选择之前,先产生一个0到1之间的随机实数t ,若满足1()()k k r x t r x +≤<,则第k+1个个体被选中。
循环以上过程,即得到生成下一代种群的母体。
具体实现见如下函数:void pop_select(void ) { int mem, i, j, k; double sum = 0; double p; /* 计算种群适应度之和 */for (mem = 0; mem < POPSIZE; mem++) {/* 按照累积适应度概率选取母体种群 */ for (i = 0; i < POPSIZE; i++) { p = rand()%1000/1000.0; if (p < population[0].cfitness) newpopulation[i] = population[0]; else { for (j = 0; j < POPSIZE;j++) if (p >= population[j].cfitness && p < population[j+1].cfitness) newpopulation[i] = population[j+1]; }} /*计算种群的总适应度*/ for (i = 0; i < POPSIZE; i++) population[i] = newpopulation[i];} sum += (population[mem].fitness - lower_fitness); }/* 计算相对适应度 */for (mem = 0; mem < POPSIZE; mem++) { population[mem].rfitness = (population[mem].fitness - lower_fitness)/sum; } population[0].cfitness = population[0].rfitness;/* 计算累积适应度 */for (mem = 1; mem < POPSIZE; mem++) { population[mem].cfitness = population[mem-1].cfitness + population[mem].rfitness; ()()0()()k k i i c x r x ==∑}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 (first % 2 == 0) {if (NVARS == 2) point = 1; //得到一个交叉点else point = (rand() % (NVARS - 1)) + 1;for (j = 0; j < point; j++)//交叉运算,两个个体的交叉点前的基因进行交换swap(&population[m].gene[j], &population[k].gene[j]);}else m = k;}}}4.变异算子在遗传算法中使用变异算子有两个目的:改善遗传算法的局部搜索能力。
维持群体的多样性,防止出现早熟现象。
变异操作的实现相当简单,只需遍历各染色体的各个单元,按某一变异概率将该单元变成一个随机的合法值。
其执行过程是:(1)对个体的每一个基因组,依变异概率Pm指定为变异点。
(2)对每一个指定的变异点,对其基因取非或者用其他等位基因值来代替,从而产生一个新的个体。
实现代码如下:void mutate(void){int i, j;double lbound, hbound;double p; //定义p为随机变异概率for (i = 0; i < POPSIZE; i++)for (j = 0; j < NVARS; j++) {p = rand()%1000/1000.0;if (p < PMUTATION) {population[i].gene[j] = randval(lower[j], upper[j]);}}}串行遗传算法的主要流程如图1所示。
在每一次进化过程中,总是找出种群中的最优解与最差解,并将最优解保存,将本次最差解用上次保存的最优解替换,这样保证了各次进化的最优解的适应度不会降低,从而增快收敛的速度。
图1 串行遗传算法基本流程三、算法设计分析图1中的串行算法,容易看出,在选择函数中,计算相对适应度需要用到全局种群的适应度之和,计算个体x k+1的累积适应度依赖于x k的累积适应度,如果在并行算法中要原封不动地模拟串行算法的运算,这些数据依赖关系都将产生通讯。
更为不幸的是,选择后的个体需在各进程中作大量数据迁移。
杂交算子中,一次杂交需要用到母体中的两个个体,若在这两个个体分配在不同进程,则需要进行一次通讯。
此后的变异和评估都可以非常容易的实现并行,并且完全不需要任何通讯。
但最后一步求最优个体和最差个体需要对各进程进行归约。
由这些分析可以看出,完全地模拟串行情形将使算法变得相当低效。
幸运地是,遗传算法本身是一个概率算法,我们完全可以对串行算法作些必要的改变。
如图2所示,我们将整个种群分成p个子种群,每一子种群由一个单一的进程负责。
各进程独立地完成串行遗传算法的整个过程,唯一不同的是选择函数。
各进程作选择操作时,首先计算各子种群内的局部累积适应度,然后根据局部累积适应度选择若干(本算法实现中使用的是常数3,也可以设为子种群大小的一个函数)个体按一固定规则轮流发送到其他进程;同时,按照该规则相应地从其他进程获取若干用来进行交流的个体。
获取到个体后,先将其暂存;然后按串行算法中的选择机制从原子种群中选择进行进化的母体;最后再用之前暂存的个体完成进程间的种群交流。
对每一个待交流的个体,具体策略如下:(1)随机地从本地的待进化母体种群内抽取与之进行交流的母体;(2)比较本地个体与传送过来的待交流个体,选取适应度高者作为最终母体。
各进程在每一次进化过程中,均分别保留各自的局部最优解,用来在下一次进化中替换局部最差的个体。
各进程均完成所预定的进化迭代后,最后对各进程的局部最优解进行归约,从而得到整个算法的全局最优解。
算法的主要流程详见图2。
图2 并行遗传算法基本流程四、算法实现该算法实现的最关键部分为选择中的种群交流,该功能有如下函数实现void pop_select(void){MPI_Status status;MPI_Request handle;int mem, i, j, k;double sum = 0;double p;static struct genotype ex_member[EX_NUM];/* 计算子种群的总适应度 */for (mem = 0; mem < TASK_NUM(pid); mem++) {sum += (population[mem].fitness - lower_fitness);}/* 计算各个体相应适应度 */for (mem = 0; mem < TASK_NUM(pid); mem++) {population[mem].rfitness =(population[mem].fitness - lower_fitness)/sum;}population[0].cfitness = population[0].rfitness;/* 计算各个体累积适应度 */for (mem = 1; mem < TASK_NUM(pid); mem++) {population[mem].cfitness=population[mem-1].cfitness+population[mem].rfitness;}/* 按照累积适应度概率选取种群交流个体,并发送和接收 */for (i = 1; i <= EX_NUM; i++) {p = rand()%1000/1000.0;if (p < population[0].cfitness) {MPI_Isend(&population[0], sizeof(struct genotype)/sizeof(char),MPI_CHAR, (pid+i*generation)%pnum, 0, MPI_COMM_WORLD, &handle);}else {for (j = 0; j < TASK_NUM(pid);j++)if(p >= population[j].cfitness && p < population[j+1].cfitness){ MPI_Isend(&population[j+1], sizeof(structgenotype)/sizeof(char), MPI_CHAR, (pid+i*generation)%pnum, 0, MPI_COMM_WORLD, &handle);break;}}MPI_Recv (&ex_member[i-1], sizeof(struct genotype)/sizeof(char), MPI_CHAR, (pid+(pnum-i)*generation)%pnum, 0, MPI_COMM_WORLD, &status);}/* 按照累积适应度概率选取母体种群 */for (i = 0; i < TASK_NUM(pid); i++){p = rand()%1000/1000.0;if (p < population[0].cfitness)newpopulation[i] = population[0];else {for (j = 0; j < TASK_NUM(pid); j++)if (p >= population[j].cfitness &&p < population[j+1].cfitness)newpopulation[i] = population[j+1];}}for (i = 0; i < TASK_NUM(pid); i++)population[i] = newpopulation[i];/* 按优胜劣汰的原则完成种群交流 */for (i = 0; i < EX_NUM; i++) {j = rand()%TASK_NUM(pid);if (population[j].fitness < ex_member[i].fitness) {for (k = 0; k < NVARS; k++) {population[j].gene[k] = ex_member[i].gene[k];} population[j].rfitness = 0; population[j].cfitness = 0; population[j].fitness = ex_member[i].fitness;} } } 另外,全局最优解的归约由如下代码实现:MPI_Op_create((MPI_User_function *)gene_max, 1, &my_op);MPI_Reduce( local_best_individual, best_individual, NVARS+1,MPI_DOUBLE, my_op, pnum-1, MPI_COMM_WORLD );其中,具体的归约操作由如下函数实现:void gene_max(double *in, double *inout, int *len, MPI_Datatype *dptr) { int i; if (inout[0] < in[0]) { /* 比较适应度 */ for (i=0; i < *len; ++i) { inout[i] = in[i]; /* 复制适应度较高的个体 */ } } }五、 算法分析与实验结果下面的实验结果是在192.169.129.47上利用结点vC0—168-129-48(slaver )和vC0—168-129-49(slaver )和vC0—168-129-46(slaver )获得的。