导航:首页 > 源码编译 > 遗传算法简单实例

遗传算法简单实例

发布时间:2022-06-09 17:38:30

❶ 遗传算法在数学上的应用

应用遗传算法搜索边坡最小安全系数的研究
陆峰 陈祖煜 李素梅
(中国水利水电科学研究院结构材料所)

提 要
本文简要介绍了滑坡滑裂面搜索问题和遗传算法,并试用遗传进化算法从边坡任意形状滑裂面组合中搜索最有可能的滑裂面,也就是使安全系数最小的滑裂面。作为实例,分析了遗传算法在天生桥二级电站首部枢纽进水口右岸滑坡分析中的应用。

关键词 边坡;安全系数;遗传算法;EMU程序。

1.前言

在应用条分法进行边坡稳定分析的过程中,从可能的滑裂面集合中确定相应最小安全系数的临界滑裂面是很关键的一步。这是一个确定安全系数这个泛函对滑裂面形状这个自变函数的极小值问题。由于实际情况的复杂性,求这一极小值的解析方法很难付诸实施。从实用角度出发,基于最优化原理发展起来的求边坡最小安全系数的方法是比较有效而且便于应用。这些方法有"穷举法"、"黄金分割法"、"鲍威尔法"等,但它们都只能应用于圆弧形滑裂面或圆弧-直线形(改良圆弧法)滑裂面的情形。对于比较符合岩质边坡的具有多个自由度的折线形滑裂面情形,孙君实用复形法取得较好的效果;陈祖煜提出了单纯形法,使最优化方法搜索边坡最危险滑裂面更加有效,且不会漏掉可能的最小值。单纯形法程序已在国内外多家工程、科研和教育单位得到应用,并不断随着应用工程案例数量的增加而不断完善[1]。单纯形法使最优化方法应用于岩质边坡稳定性分析的研究和应用前进了一大步。同为最优化方法,遗传算法是最近发展起来的一种仿生寻优算法。国内外已有一些学者试图将遗传算法应用于搜索安全系数最小的边坡滑裂面,以期获得更优的结果。文献[2]将此算法应用于基于圆弧滑裂面假定的任意形状坡面的非均质土坡情况,搜索的目标是使边坡安全系数最小的圆弧滑裂面圆心和半径。本文将在文献[1]和文献[2]的基础上,应用遗传算法搜索边坡安全系数最小的任意形状滑裂面,根据工程实践经验,主要是折线组合的滑裂面。 2.遗传算法及其应用于岩土工程的基础

如前所述,搜索边坡最危险滑裂面问题是安全系数对滑裂面形状的泛函极值问题。数值方法求解这一问题的主要手段是迭代运算。一般的迭代方法容易陷入局部极小的陷阱而出现"死循环"现象,使迭代无法进行。遗传算法很好地克服了这个缺点,是一种全局优化算法。
生物在漫长的进化过程中,从低等生物一直发展到高等生物,可以说是一个绝妙的优化过程。这是自然环境选择的结果。人们研究生物进化现象,总结出进化过程包括复制、杂交、变异、竞争和选择。一些学者从生物遗传、进化的过程得到启发,提出了遗传算法(GA)。算法中称遗传的生物体为个体(indivial),个体对环境的适应程度用适应值(fitness)表示。适应值取决于个体的染色体(chromosome),在算法中染色体常用一串数字表示,数字串中的一位对应一个基因(gene)。一定数量的个体组成一个群体(population)。对所有个体进行选择、交叉和变异等操作,生成新的群体,称为新一代(new generation)。
遗传算法计算程序的流程可以表示如下[3]:
第一步 准备工作
(1)选择合适的编码方案,将变量(特征)转换为染色体(数字串,串长为m)。通常用二进制编码。
(2)选择合适的参数,包括群体大小(个体数M)、交叉概率PC和变异概率Pm。
(3)确定适应值函数f(x)。f(x)应为正值。
第二步 形成一个初始群体(含M个个体)。在边坡滑裂面搜索问题中,取已分析的可能滑裂面组作为初始群体。
第三步 对每一染色体(串)计算其适应值fi,同时计算群体的总适应值 。
第四步 选择
计算每一串的选择概率Pi=fi/F及累计概率 。选择一般通过模拟旋转滚花轮(roulette,其上按Pi大小分成大小不等的扇形区)的算法进行。旋转M次即可选出M个串来。在计算机上实现的步骤是:产生[0,1]间随机数r,若r<q1,则第一串v1入选,否则选v2,使满足qi-1<r<qi(2≤i≤m)。可见适应值大的入选概率大。
第五步 交叉
(1) 对每串产生[0,1]间随机数,若r>pc,则该串参加交叉操作,如此选出参加交叉的一组后,随机配对。
(2) 对每一对,产生[1,m]间的随机数以确定交叉的位置。
第六步 变异
如变异概率为Pm,则可能变异的位数的期望值为Pm ×m×M,每一位以等概率变异。具体为对每一串中的每一位产生[0,1]间的随机数r,若r<Pm,则该位发生反转,如对染色体二进制编码为数字0变为1,1变为0。
如新个体数达到M个,则已形成一个新群体,转向第三步;否则转向第四步继续遗传操作。直到找到使适应值最大的个体或达到最大进化代数为止。
由于选择概率是由适应值决定的,即适应值大的染色体入选概率也较大,使选择起到"择优汰劣"的作用。交叉使染色体交换信息,结合选择规则,使优秀信息得以保存,不良信息被遗弃。变异是基因中得某一位发生突变,以达到产生确实有实质性差异的新品种。遗传算法虽是一种随机算法,但它是有导向的,它所使用的"按概率随机选择"方法是在有方向的搜索方法中的一种工具。正是这种独特的搜索方法,使遗传算法自然地避开了其它最优化算法常遇到的局部最小陷阱。遗传算法搜索最优结果的效果在数学上还没有严格的证明,但它的有效性已在许多专业的应用的得到体现。对于岩质边坡安全系数对滑裂面形状这样不可微的泛函极值问题,就目前的科学认识水平来讲,遗传算法不失为一种可以信赖的方法。 3.用遗传算法搜索安全系数最小的边坡任意形状滑裂面

在边坡(尤其是岩质边坡)最危险滑裂面搜索问题中,滑裂面的实际形状是很复杂的,起控制作用的是岩体的主要结构面和边坡的体型。从以往实际工程经验看,可以总结出岩质边坡滑裂面在顺滑方向上的剖面形状为折线,由岩体结构面和局部岩土材料的剪切破坏面连接而成。这样,搜索最危险滑裂面的问题就可以简化为从折线滑裂面组合中寻优的问题。本文用遗传进化算法解决这个问题。
(1) 定义遗传算法的目标函数
目标函数定义为边坡的安全系数,用安全系数的大小表示解的适应值。在边坡最危险滑裂面搜索问题中,解的安全系数越小,适应性能越好。
(2) 初始群体的确定
根据边坡的工程地质调查记录,根据经验初步拟定出一批滑裂面形状。如图1所示,滑裂面由点序列Ai(xi,yi)(i=1,?,N)表示。将点序列AI的坐标(xi,yi)依次排列成x1y1x2y2?xNyN的形式,经二进制编码形成一条染色体。对于拟定的滑裂面形状,其对应的安全系数用EMU程序[4]进行计算。
(3) 确定搜索范围
根据经验对每个点Ai,确定其坐标(xi,yi)的可能变化范围。在此范围内搜索导致最小安全系数的边坡滑裂面形状。
(4) 计算
将初始种群的所有拟定滑裂面形状(染色体)交给遗传算法程序进行计算。具体过程参见前文。

4.算例分析[4]

图1 天生桥二级电站首部枢纽进水口右岸滑坡示意图

选用天生桥二级电站首部枢纽进水口右岸滑坡作为算例,图1为其计算简图。滑坡高约30m,总方量为7000余m3,主要为第四系冲坡积物和施工堆碴。物理力学参数见表1。

表1 各土层物理力学性能指标
土层 密度(g/cm3) 抗剪强度指标
内摩擦角 凝聚力(kPa)
① 施工弃碴 1.85 21.8° 19.6
② 坡积土 1.85 21.8° 0.0
③ 砂土 1.85 21.8° 29.4
④ 砂质淤泥 1.85 20.8° 34.3
⑤ 河卵石、砾石 1.90 24.2° 0.0

滑坡发生前,靠近坡脚处因修建挡土墙被开挖而削弱边坡的整体稳定性,可以断定滑坡的滑裂面将从此经过。本例题还将忽略实际工程中坡顶张裂缝的影响。选用5个点的折线来模拟滑裂面形状,初步确定AiBiCiDiE(i=1~4)为可能的滑裂面。滑裂面上端点Ai的y坐标已受限制,下端点E的x、y坐标均已确定,故滑裂面只有7个自由度。按遗传算法的要求将滑裂面表示成如下形式:
xAxByBxCyCxDyD
四个模拟滑裂面的坐标和由EMU程序分析的安全系数列于表2。
表2 模拟滑裂面坐标及安全系数(坐标单位 m)
滑裂面 xA xB yB xC yC xD yD 安全系数
A1B1C1D1E 35.44 27.69 16.82 18.79 9.25 11.39 4.49 0.92
A2B2C2D2E 38.15 30.60 20.69 23.14 14.60 14.12 8.37 0.99
A3B3C3D3E 39.02 34.18 18.47 26.28 10.41 16.07 4.58 1.02
A3B3C4D4E 39.02 34.18 18.47 25.12 11.39 14.70 4.97 1. 03

限制搜索范围为每个自由度可在2.0m范围内变化。将4个排列好的数字串作为输入数据交给遗传算法程序进行编码、计算。经过大量运算,最后在最大种群代数(1000)群体中找到使安全系数最小的坐标数字串,经译码形成如下坐标:
(36.89,30.07)(33.25,21.52)(21.71,9.34)(13.54,5.07)(0.0,0.0)
即为图1中的ABCDE滑裂面。由遗传算法求出其相应的安全系数为0.90。滑裂面形式和安全系数都比较接近实际情况。

5.结语

遗传算法是一种高效的寻优算法,而且能有效地解决局部最小问题、非线性映射关系的表示、非线性映射关系不可微等普通优化算法常遇到的问题。算例的成果证明了这一特点。将遗传算法应用于滑坡滑裂面搜索问题,主要的工作是将工程问题简化成遗传算法需要的形式,简化时需详细参考地质调查资料和工程经验,务使简化的形式接近实际情况。对于简化的搜索样本,其安全系数的计算必须可靠,为此可应用一些比较成熟的计算程序,如EMU等。充分考虑实际工程地质情况和选取切合实际的搜索样本后,遗传算法程序必将能为滑坡搜索出最有可能的滑裂面。

参考文献

1 陈祖煜,邵长明,最优化方法在确定边坡最小安全系数方面的应用,岩土工程学报,Vol.10, No.4, 1998.7。
2 肖专文,张奇志,梁力,林韵梅,遗传进化算法在边坡稳定性分析中的应用,岩土工程学报,Vol.20, No.1, 1998.1。
3 周明,孙树栋,遗传算法原理及应用,国防工业出版社,1999.6。
4 陈祖煜,岩质高边坡稳定分析程序EMU,1995.5。

Research on Searching Least Factor of Safety of Slopes with Genetic Algorithm

Lu Feng Chen Zuyu Li Sumei
(Department of Structure and Material, IWHR)

Abstract

The problem of searching least factor of safety of slopes and the theory of Genetic Algorithm have been introced in this paper. This theory has been employed to solve this problem to find the most possible slide of slopes. As an example, the application of genetic algorithm on the Tianshengqiao Power Station Right Bank Slide has been presented.

Keywords: Slope, Factor of Safety, Genetic Algorithm, EMU Program.

❷ 请问什么是遗传算法,并给两个例子

遗传算法(Genetic Algorithm, GA)是近几年发展起来的一种崭新的全局优化算法,它借
用了生物遗传学的观点,通过自然选择、遗传、变异等作用机制,实现各个个体的适应性
的提高。这一点体现了自然界中"物竞天择、适者生存"进化过程。1962年Holland教授首次
提出了GA算法的思想,从而吸引了大批的研究者,迅速推广到优化、搜索、机器学习等方
面,并奠定了坚实的理论基础。 用遗传算法解决问题时,首先要对待解决问题的模型结构
和参数进行编码,一般用字符串表示,这个过程就将问题符号化、离散化了。也有在连续
空间定义的GA(Genetic Algorithm in Continuous Space, GACS),暂不讨论。

一个串行运算的遗传算法(Seguential Genetic Algoritm, SGA)按如下过程进行:

(1) 对待解决问题进行编码;
(2) 随机初始化群体X(0):=(x1, x2, … xn);
(3) 对当前群体X(t)中每个个体xi计算其适应度F(xi),适应度表示了该个体的性能好
坏;
(4) 应用选择算子产生中间代Xr(t);
(5) 对Xr(t)应用其它的算子,产生新一代群体X(t+1),这些算子的目的在于扩展有限
个体的覆盖面,体现全局搜索的思想;
(6) t:=t+1;如果不满足终止条件继续(3)。
GA中最常用的算子有如下几种:
(1) 选择算子(selection/reproction): 选择算子从群体中按某一概率成对选择个
体,某个体xi被选择的概率Pi与其适应度值成正比。最通常的实现方法是轮盘赌(roulett
e wheel)模型。
(2) 交叉算子(Crossover): 交叉算子将被选中的两个个体的基因链按概率pc进行交叉
,生成两个新的个体,交叉位置是随机的。其中Pc是一个系统参数。
(3) 变异算子(Mutation): 变异算子将新个体的基因链的各位按概率pm进行变异,对
二值基因链(0,1编码)来说即是取反。
上述各种算子的实现是多种多样的,而且许多新的算子正在不断地提出,以改进GA的
某些性能。系统参数(个体数n,基因链长度l,交叉概率Pc,变异概率Pm等)对算法的收敛速度
及结果有很大的影响,应视具体问题选取不同的值。
GA的程序设计应考虑到通用性,而且要有较强的适应新的算子的能力。OOP中的类的继
承为我们提供了这一可能。
定义两个基本结构:基因(ALLELE)和个体(INDIVIDUAL),以个体的集合作为群体类TP
opulation的数据成员,而TSGA类则由群体派生出来,定义GA的基本操作。对任一个应用实
例,可以在TSGA类上派生,并定义新的操作。

TPopulation类包含两个重要过程:
FillFitness: 评价函数,对每个个体进行解码(decode)并计算出其适应度值,具体操
作在用户类中实现。
Statistic: 对当前群体进行统计,如求总适应度sumfitness、平均适应度average、最好
个体fmax、最坏个体fmin等。

TSGA类在TPopulation类的基础上派生,以GA的系统参数为构造函数的参数,它有4个
重要的成员函数:
Select: 选择算子,基本的选择策略采用轮盘赌模型(如图2)。轮盘经任意旋转停止
后指针所指向区域被选中,所以fi值大的被选中的概率就大。
Crossover: 交叉算子,以概率Pc在两基因链上的随机位置交换子串。
Mutation: 变异算子,以概率Pm对基因链上每一个基因进行随机干扰(取反)。
Generate: 产生下代,包括了评价、统计、选择、交叉、变异等全部过程,每运行一
次,产生新的一代。

SGA的结构及类定义如下(用C++编写):
[code] typedef char ALLELE; // 基因类型
typedef struct{
ALLELE *chrom;
float fitness; // fitness of Chromosome
}INDIVIDUAL; // 个体定义

class TPopulation{ // 群体类定义
public:
int size; // Size of population: n
int lchrom; // Length of chromosome: l
float sumfitness, average;

INDIVIDUAL *fmin, *fmax;
INDIVIDUAL *pop;

TPopulation(int popsize, int strlength);
~TPopulation();
inline INDIVIDUAL &Indivial(int i){ return pop[i];};
void FillFitness(); // 评价函数
virtual void Statistics(); // 统计函数
};

class TSGA : public TPopulation{ // TSGA类派生于群体类
public:
float pcross; // Probability of Crossover
float pmutation; // Probability of Mutation
int gen; // Counter of generation

TSGA(int size, int strlength, float pm=0.03, float pc=0.6):
TPopulation(size, strlength)
{gen=0; pcross=pc; pmutation=pm; } ;
virtual INDIVIDUAL& Select();
virtual void Crossover(INDIVIDUAL &parent1, INDIVIDUAL &parent2,
INDIVIDUAL &child1, INDIVIDUAL &child2);
&child1, INDIVIDUAL &child2);
virtual ALLELE Mutation(ALLELE alleleval);
virtual void Generate(); // 产生新的一代
};
用户GA类定义如下:
class TSGAfit : public TSGA{
public:
TSGAfit(int size,float pm=0.0333,float pc=0.6)
:TSGA(size,24,pm,pc){};
void print();
}; [/code]

由于GA是一个概率过程,所以每次迭代的情况是不一样的;系统参数不同,迭代情况
也不同。在实验中参数一般选取如下:个体数n=50-200,变异概率Pm=0.03, 交叉概率Pc=
0.6。变异概率太大,会导致不稳定。

参考文献
● Goldberg D E. Genetic Algorithm in Search, Optimization, and machine

Learning. Addison-Wesley, Reading, MA, 1989
● 陈根社、陈新海,"遗传算法的研究与进展",《信息与控制》,Vol.23,
NO.4, 1994, PP215-222
● Vittorio Maniezzo, "Genetic Evolution of the Topology and Weight Distri
bution of the Neural Networks", IEEE, Trans. on Neural Networks, Vol.5, NO
.1, 1994, PP39-53
● Xiaofeng Qi, Francesco Palmieri, "Theoretical Analysis of Evolutionary
Algorithms with an Infinite Population Size in Continuous Space. Part Ⅰ
l Networks, Vol.5, NO.1, 1994, PP102-119
● Xiaofeng Qi, Francesco Palmieri, "Theoretical Analysis of Evolutionary
Algorithms with an Infinite Population Size in Continuous Space. Part Ⅱ
al Networks, Vol.5, NO.1, 1994, PP102-119
● Gunter Rudolph, Convergence Analysis of Canonical Genetic Algorithms, I
EEE, Trans. on Neural Networks, Vol.5, NO.1, 1994, PP96-101
● A E Eiben, E H L Aarts, K M Van Hee. Gloable convergence of genetic alg
orithms: A Markov chain analysis. in Parallel Problem Solving from Nat
ure. H.-P.Schwefel, R.Manner, Eds. Berlin and Heidelberg: Springer, 1991
, PP4-12
● Wirt Atmar, "Notes on the Simulation of Evolution", IEEE, Trans. on Neu
ral Networks, Vol.5, NO.1, 1994, PP130-147
● Anthony V. Sebald, Jennifer Schlenzig, "Minimax Design of Neural Net Co
ntrollers for Highly Uncertain Plants", IEEE, Trans. on Neural Networks, V
ol.5, NO.1, 1994, PP73-81
● 方建安、邵世煌,"采用遗传算法自学习模型控制规则",《自动化理论、技术与应
用》,中国自动化学会 第九届青年学术年会论文集,1993, PP233-238
● 方建安、邵世煌,"采用遗传算法学习的神经网络控制器",《控制与决策》,199
3,8(3), PP208-212
● 苏素珍、土屋喜一,"使用遗传算法的迷宫学习",《机器人》,Vol.16,NO.5,199
4, PP286-289
● M.Srinivas, L.M.Patnaik, "Adaptive Probabilities of Crossover and Mutat
ion", IEEE Trans. on S.M.C, Vol.24, NO.4, 1994 of Crossover and Mutation",
IEEE Trans. on S.M.C, Vol.24, NO.4, 1994
● Daihee Park, Abraham Kandel, Gideon Langholz, "Genetic-Based New Fuzzy
Reasoning Models with Application to Fuzzy Control", IEEE Trans. S. M. C,
Vol.24, NO.1, PP39-47, 1994
● Alen Varsek, Tanja Urbancic, Bodgan Filipic, "Genetic Algorithms in Con
troller Design and Tuning", IEEE Trans. S. M. C, Vol.23, NO.5, PP1330-13
39, 1993

❸ 高分悬赏:遗传算法应用实例

柔性生产计划?我想在这方面,遗传算法应用的例子还是有一些的。比如说人员的安排,机器设备的调度等

❹ 基本的遗传算法

在许多实际应用领域,无论是工程技术科学还是社会经济科学中,都会遇到全局最优化问题[53,56~59,61],这一类问题大多数可以形式化为一个对(S,f)的寻优问题,其中 S⊂R n 是 R n 中的有界集,f∶S→R是 n 维实值函数。所要求解的问题就是要找到一点 x best∈S,使得 f(xbest)是 S 上的全局最优解,可以是极大值或极小值。以极小值为例,即求一点 x min∈S,满足

含水层参数识别方法

尽管人们对这类问题进行了大量的研究,但得到的成绩仍不能令人满意,目前只能解决一些简单的问题。对于更复杂的全局最优化问题,通常是利用数值解法,但许多数值解法都不能找到最优解,只是返回一个接近于全局最优的值。

全局最优化数值方法可以分为两大类:确定性算法和随机算法。在随机算法中,最优化步骤在一定程度上依赖于概率事件,它排除了确定性算法中的一个最大障碍——预先详细说明一个问题的全部特征并针对问题的特征决定算法应采用的对策。与常规的优化算法相比,遗传算法有可能在更大的范围内探寻问题潜在的解。确定性算法没有用到概率信息。只有当对S上进行穷举搜索及对f规定附加的假设条件下,算法才能找到全局最优解。实行穷举搜索在很多情况下(如实数解)是不可能的,因此多采用对f规定附加的假设条件,这必然影响到最终解的可靠性。在这些算法中,搜索速度越快的算法往往意味着需要对f做更多的假设,或者不能保证搜索成功。与此相对照,许多随机算法都可以证明在概率意义下渐近收敛到全局最优解,即这些算法保证以概率1渐近收敛,而且随机算法的计算结果一般要优于那些确定性算法的结果。遗传算法就是其中具有代表性的随机算法。

常用的遗传算法操作有选择(Selection)、交叉(Crossover)、变异(Mutation)。复制是直接将个体的代码进行拷贝形成新个体。下面就选择、交叉与变异操作做一介绍。

7.3.1 选择过程

选择过程是以旋转赌轮Pop-Size次(种群规模,即群体中个体的总个数)为基础,每次旋转都为新的种群选择一个染色体。首先计算出个体i被选择的概率Pi,优秀的染色体其选择概率大,然后根据选择概率的大小将一个圆盘分为Pop-Size个扇形,每个扇形的中心角的大小为2πPi

每次进行选择时,先选择赌轮边界旁一个不动的参考点,赌轮随机地转动,若不动点停留在扇形j内,则选择个体j。个体的适应值越大,被选择的概率越大,从而其染色体被遗传到下一代的概率越大。

赌轮式选择的特点是对于种群内的所有个体,无论其适应值大小,都有被选择的机会。适应值大的个体被选择的概率大,适应值小的个体被选择的概率小。经过选择后适应值大的个体在种群中的数目会增加。这正体现了适者生存的原则。

7.3.2 交叉操作

交叉操作是个有组织的、随机的字符串间的信息交换过程。假设群体G(t)是模式库。历史信息以每个模式实例数目的形式存储于G(t)中。交叉作用产生模式库中已有模式的新的实例,同时也产生新的模式。简单的交叉操作分为三步:

(1)从当前群体G(t)中选择两个个体结构:A=a1a2…an,B=b1b2…bn

(2)以交叉概率 Pc 随机选择一个整数 x∈{1,2,…,n};

(3)交换A和B中位置x右边的元素,产生两个新的个体结构:a1a2…axbx+1…bn和b1b2…bxax+1…an

7.3.3 变异操作

对于群体G(t)中的每个个体A=a1a2…an,简单的变异操作过程如下:

1)每个位置的字符变量都有一个变异概率Pm,各位置互相独立,通过随机过程选择发生变异的位置x1,x2,…,xn

2)产生一个新个体结构 B=a1 a2……an ,其中是从对应位置x 1 的字符变量的值域中随机选择的一个取值。类似地,,…,可以同样得到。

如果每个位置的变异概率等于Pm,那么模式H(阶为o(H))发生一次或多次变异的概率是

含水层参数识别方法

遗传操作除了有选择、交叉、变异等算子外,还有染色体内部复制(Intrachromo-somal plication)、删除、易位(Translocation)、分异(Segregation)等。

❺ 遗传算法<sup>[1,]</sup>

遗传算法,又称基因算法(Genetic Algorithm,简称GA),也是一种启发式蒙特卡洛优化算法。遗传算法最早是由Holland(1975)提出,它模拟了生物适者生存、优胜劣汰的进化过程,具有不依赖于初始模型的选择、不容易陷入局部极小、在反演过程中不用计算偏导数矩阵等优点。遗传算法最早由Stoffa和Sen(1991)用于地震波的一维反演,之后在地球物理资料的非线性反演中得到广泛的应用。GA算法对模型群体进行追踪、搜索,即模型状态通过模型群体传送,具有比模拟退火法更大、更复杂的“记忆”,潜力更大。

遗传算法在反演中的基本思路和过程是:

(1)将生物体看成模型,模型参数看成染色体,有多少个模型的参数就有多少个染色体。对每个模型的参数(染色体)用二进制进行编码,这个编码就是基因。

(2)随机生成一个模型群体(相当于生物的种群),然后在模型群体中进行繁殖,通过母本的选择、交换和变异等遗传操作产生下一代,然后保留较好基因,淘汰较差基因。

(3)通过一代一代的繁殖优胜劣汰的进化过程,最后所剩下的种群基本上都是最优的基因,种群趋于一致。所谓群体“一致”,即群体目标函数的方差或标准差很小,或者群体目标函数的均值接近于极值(可能是极大值或极小值),从而获得非线性反演问题所对应的最优解或近似最优解。

下面以一个实例来简述遗传算法的基本过程。

[例1]设m是正整数,且0≤m≤127,求方程φ(m)=m2的极大值。

这个例子极为简单,只有一个模型参数,因此只有一条染色体,目标函数的极值是极大值(此例子来自阮百尧课件)。遗传算法通过以下7个步骤来实现:

(1)模型参数二进制编码。

每个模型参数就是一条染色体,把十进制的模型参数表示为二进制,这就是基因。首先确定二进制码的长度(基因的长度):

2N=[mmax(i)-mmin(i)]/Δm(i) (8.20)

其中:N为第i条染色体基因的长度(也就是第i个模型参数的二进制码位数);[mmin(i),mmax(i)]为第i个模型参数的取值范围;Δm(i)为第i个模型参数的分辨率。这样就把模型参数离散化了,它只能按Δm(i)的整数倍变化。基因的长度按下式计算:

地球物理反演教程

其中:c为实数;N为基因长度,是整数;int[ ]为取整函数。上式表示如果c不是整数,那么基因长度N就是对c取整后加1,这样保证最小分辨率。

基因的编码按下式进行:

地球物理反演教程

其中:式(8.22)是编码公式;k为基因编码的十进制数,是整数;int[ ]为取整函数。把k转化为二进制就是基因的编码。解码是按照式(8.23)进行的。首先把一个基因的二进制编码转化为十进制数k,然后按式(8.23)可以计算出第i个模型参数m(i)的十进制值。

例如:电阻率参数ρ(1),它的变化范围为10~5000Ω·m,分辨率为2Ω·m,设当前参数ρ(1)=133Ω·m,按式(8.21)计算得

c=11.28482,N=12

所以二进制基因长度为13位。

利用式(8.22)计算基因编码k的十进制数:

k=int[(133-10)/2]=61

把它转化为二进制数为:000000111101。所以ρ(1)=133 的二进制基因编码为:000000111101。

解码过程就是把二进制基因编码变为十进制数k后用式(8.23)计算:

ρ(1)=10+61×2=132(Ω·m)

注意:基因编码并不是直接把电阻率值变为二进制。此外,133这个值在基因里不会出现,因为分辨率是2,所以表示为最接近的132。

对于[例1]问题来说,选分辨率为1,0~127用二进制编码需7位。

(2)产生初始模型种群。

生物繁殖进化需要一定数量的生物体种群,因此遗传算法开始时需要一定数量的初始模型。为保证基因的多样性,随机产生大量的初始模型作为初始种群,按照上面的编码方式进行编码。个体在模型空间中应分布均匀,最好是模型空间各代表区域均有成员。初始模型群体大,有利于搜索,但太大会增加计算量。

为保证算法收敛,在初始模型群体中,有时候应增加各位都为0和都为1的成员。遗传算法就是在这个初始模型种群的基础上进行繁殖,进化求解的。

对于[例1]问题来说,模型空间是0~127个数字,这样初始种群最多具有128个个体。为了简单,随机选择4个个体作为初始种群。初始种群的编码、目标函数值见表8.1。

表8.1 初始种群编码表

(3)模型选择。

为了生成新一代模型,需要选择较优的个体进行配对。生物进化按照自然选择、优胜劣汰的准则进行。对应地,遗传算法按照一定的准则来选择母本(两个),然后进行配对繁殖下一代模型,这个选择称为模型选择。模型配对最基本的方法是随机采样,用各模型的目标函数值对所有模型目标函数的平均值的比值定义繁殖概率,即

地球物理反演教程

其中:p(mi)为繁殖概率;φ(mi)为第i个模型的目标函数;φAVG为目标函数的平均值。对于极小化问题来说,规定目标函数值高于平均值的不传代;对于极大化问题来说,反之即可。

就[例1]来说,要求目标函数取极大值,所以规定目标函数小于平均值的模型不传代,大于它的可以传代。对第一代,为了防止基因丢失,可先不舍去繁殖概率小的模型,让它与概率大的模型配对。如:本例中70与56配对,101与15配对产生子代,见表8.2。

表8.2 基因交换表

(4)基因交换。

将配对的两个亲本模型的部分染色体相互交换,其中交换点可随机选择,形成两个新的子代(见表8.2)。两个染色体遗传基因的交换过程是遗传算法的“繁殖”过程,是母本的重组过程。

为了使染色体的基因交换比较彻底,Stoffa等人提出了一个交换概率px来控制选择操作的效果。如果px的值较小,那么交换点的位置就比较靠低位,这时的交换操作基本是低位交换,交换前后模型的染色体变化不是太大。如果px的值较大,那么交换点的位置就比较靠高位,此时的交换操作可以在较大的染色体空间进行,交换前后模型数值变化可以很大。

在[例1]中:15、101和56、70作为母本通过交换繁殖出子代5、6、111、120。所选择的基因交换位置见表8.2。有下划线的,是要交换的基因位置。

(5)更新。

母本模型和子本模型如何选择保留一定数量作为新的母本,就是模型更新。不同的策略会导致不同的结果。一般而言,若产生的新一代模型较好,则选择新一代模型而淘汰上一代模型。否则,则必须根据一定的更新概率pu来选择上一代模型来取代新一代中某些较劣的模型。

经过更新以后,繁殖时对子代再进行优胜劣汰的选择。对于极大值问题,大于目标函数平均值的子代可以繁殖,小于目标函数平均值的子代不能繁殖。由于新的种群能繁殖的个体数量减小了,所以要多繁殖几次,维持种群个体的数量保持平衡。

在[例1]中,子代较好,所以完全淘汰上一代模型,完全用子代作为新的母本。选择子代目标函数最大的两个模型进行繁殖,分别是111、120。

(6)基因变异。

在新的配对好的母本中,按一定比例随机选择模型进行变异,变异操作就是模拟自然界中的环境因素,就是按比较小的变异概率pm将染色体某位或某几位的基因发生突变(即将0变为1或将1变为0)。

变异操作的作用是使原来的模型发生某些变化,从而成为新的个体。这样可使群体增加多样性。变异操作在遗传算法中也起着至关重要的作用。实际上,由于搜索空间的性质和初始模型群体的优劣,遗传算法搜索过程中往往会出现所谓的“早熟收敛”现象,即在进化过程中早期陷入局部解而中止进化。采用合适的变异策略可提高群体中个体的多样性,从而防止这种现象的出现,有助于模型跳出局部极值。表8.3为[例1]的基因变异繁殖表。

表8.3 基因变异繁殖表

在[例1]中,用111、120分别繁殖两次,形成4个子代,维持种群数量平衡。随机选择120进行变异,变异的位数也是随机的。这里把它的第2位进行变异,即从1变为0,繁殖后形成子代为:70、110、121、127。可以看出新的子代比初始种群要好得多,其中甚至已经出现了最优解。如果对于地球物理的极小值问题,我们可以预先设置一个拟合精度,只要在种群中出现一个达到拟合精度的模型就可以终止反演了。

(7)收敛。

重复(3)~(6)的步骤,模型群体经多次选择、交换、更新、变异后,种群个体数量大小不变,模型目标函数平均值趋于稳定,最后聚集在模型空间中一个小范围内,则找到了全局极值对应的解,使目标函数最大或最小的模型就是全局最优模型。

对于具有多解性的地球物理反演问题来说,通过这一步有可能找到满足拟合精度的多个模型,对于实际反演解释、推断具有较高的指导意义。

遗传算法中的各种概率包括交换概率px、变异概率pm以及更新概率pu,这些参数的选择与设定目前尚无统一的理论指导,多数都视具体问题而定。Stoffa等(1991)的研究表明,适中的交换概率(px≈0.6)、较小的变异概率(pm≈0.01)和较大的更新概率(pu≈0.9),遗传算法的性能较优。

与模拟退火反算法相同,遗传算法与传统的线性反演方法相比,该方法具有:不依赖初始模型的选择、能寻找全局最小点而不陷入局部极小、在反演过程中不用计算雅克比偏导数矩阵等优点。另外,遗传算法具有并行性,随着并行计算和集群式计算机技术的发展,该算法将会得到越来越广泛的研究与应用。

但是遗传算法作为类蒙特卡洛算法同样需要进行大量的正演计算,种群个体数量越大,繁衍代数越多,则计算量越大。所以和前面的最小二乘法相比,速度不是它的优势。

❻ 遗传算法原理与应用实例的介绍

《遗传算法原理与应用实例》主要结合应用实例系统讨论、介绍遗传算法原理及其应用,主要内容包括:遗传算法的基本原理和数学机理、解决连续问题优化的遗传算法和分布式遗传算法、遗传算法的实现技术、遗传算法应用实例,并给出了两个典型的遗传算法源程序。《遗传算法原理与应用实例》在详细介绍遗传算法理论与方法的同时,还给_出了基于遗传算法的费托合成反应动力学模型参数优化的详细设计应用。

❼ 遗传算法

遗传算法实例:

也是自己找来的,原代码有少许错误,本人都已更正了,调试运行都通过了的。
对于初学者,尤其是还没有编程经验的非常有用的一个文件
遗传算法实例

% 下面举例说明遗传算法 %
% 求下列函数的最大值 %
% f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] %
% 将 x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为 (10-0)/(2^10-1)≈0.01 。 %
% 将变量域 [0,10] 离散化为二值域 [0,1023], x=0+10*b/1023, 其中 b 是 [0,1023] 中的一个二值数。 %
% %
%--------------------------------------------------------------------------------------------------------------%
%--------------------------------------------------------------------------------------------------------------%

% 编程
%-----------------------------------------------
% 2.1初始化(编码)
% initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度),
% 长度大小取决于变量的二进制编码的长度(在本例中取10位)。
%遗传算法子程序
%Name: initpop.m
%初始化
function pop=initpop(popsize,chromlength)
pop=round(rand(popsize,chromlength)); % rand随机产生每个单元为 {0,1} 行数为popsize,列数为chromlength的矩阵,
% roud对矩阵的每个单元进行圆整。这样产生的初始种群。

% 2.2 计算目标函数值
% 2.2.1 将二进制数转化为十进制数(1)
%遗传算法子程序
%Name: decodebinary.m
%产生 [2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制
function pop2=decodebinary(pop)
[px,py]=size(pop); %求pop行和列数
for i=1:py
pop1(:,i)=2.^(py-i).*pop(:,i);
end
pop2=sum(pop1,2); %求pop1的每行之和

% 2.2.2 将二进制编码转化为十进制数(2)
% decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置
% (对于多个变量而言,如有两个变量,采用20为表示,每个变量10为,则第一个变量从1开始,另一个变量从11开始。本例为1),
% 参数1ength表示所截取的长度(本例为10)。
%遗传算法子程序
%Name: decodechrom.m
%将二进制编码转换成十进制
function pop2=decodechrom(pop,spoint,length)
pop1=pop(:,spoint:spoint+length-1);
pop2=decodebinary(pop1);

% 2.2.3 计算目标函数值
% calobjvalue.m函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。
%遗传算法子程序
%Name: calobjvalue.m
%实现目标函数的计算
function [objvalue]=calobjvalue(pop)
temp1=decodechrom(pop,1,10); %将pop每行转化成十进制数
x=temp1*10/1023; %将二值域 中的数转化为变量域 的数
objvalue=10*sin(5*x)+7*cos(4*x); %计算目标函数值

% 2.3 计算个体的适应值
%遗传算法子程序
%Name:calfitvalue.m
%计算个体的适应值
function fitvalue=calfitvalue(objvalue)
global Cmin;
Cmin=0;
[px,py]=size(objvalue);
for i=1:px
if objvalue(i)+Cmin>0
temp=Cmin+objvalue(i);
else
temp=0.0;
end
fitvalue(i)=temp;
end
fitvalue=fitvalue';

% 2.4 选择复制
% 选择或复制操作是决定哪些个体可以进入下一代。程序中采用赌轮盘选择法选择,这种方法较易实现。
% 根据方程 pi=fi/∑fi=fi/fsum ,选择步骤:
% 1) 在第 t 代,由(1)式计算 fsum 和 pi
% 2) 产生 {0,1} 的随机数 rand( .),求 s=rand( .)*fsum
% 3) 求 ∑fi≥s 中最小的 k ,则第 k 个个体被选中
% 4) 进行 N 次2)、3)操作,得到 N 个个体,成为第 t=t+1 代种群
%遗传算法子程序
%Name: selection.m
%选择复制
function [newpop]=selection(pop,fitvalue)
totalfit=sum(fitvalue); %求适应值之和
fitvalue=fitvalue/totalfit; %单个个体被选择的概率
fitvalue=cumsum(fitvalue); %如 fitvalue=[1 2 3 4],则 cumsum(fitvalue)=[1 3 6 10]
[px,py]=size(pop);
ms=sort(rand(px,1)); %从小到大排列
fitin=1;
newin=1;
while newin<=px
if(ms(newin))<fitvalue(fitin)
newpop(newin)=pop(fitin);
newin=newin+1;
else
fitin=fitin+1;
end
end

% 2.5 交叉
% 交叉(crossover),群体中的每个个体之间都以一定的概率 pc 交叉,即两个个体从各自字符串的某一位置
% (一般是随机确定)开始互相交换,这类似生物进化过程中的基因分裂与重组。例如,假设2个父代个体x1,x2为:
% x1=0100110
% x2=1010001
% 从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为:
% y1=0100001
% y2=1010110
% 这样2个子代个体就分别具有了2个父代个体的某些特征。利用交又我们有可能由父代个体在子代组合成具有更高适合度的个体。
% 事实上交又是遗传算法区别于其它传统优化方法的主要特点之一。
%遗传算法子程序
%Name: crossover.m
%交叉
function [newpop]=crossover(pop,pc)
[px,py]=size(pop);
newpop=ones(size(pop));
for i=1:2:px-1
if(rand<pc)
cpoint=round(rand*py);
newpop(i,:)=[pop(i,1:cpoint),pop(i+1,cpoint+1:py)];
newpop(i+1,:)=[pop(i+1,1:cpoint),pop(i,cpoint+1:py)];
else
newpop(i,:)=pop(i);
newpop(i+1,:)=pop(i+1);
end
end

% 2.6 变异
% 变异(mutation),基因的突变普遍存在于生物的进化过程中。变异是指父代中的每个个体的每一位都以概率 pm 翻转,即由“1”变为“0”,
% 或由“0”变为“1”。遗传算法的变异特性可以使求解过程随机地搜索到解可能存在的整个空间,因此可以在一定程度上求得全局最优解。
%遗传算法子程序
%Name: mutation.m
%变异
function [newpop]=mutation(pop,pm)
[px,py]=size(pop);
newpop=ones(size(pop));
for i=1:px
if(rand<pm)
mpoint=round(rand*py);
if mpoint<=0
mpoint=1;
end
newpop(i)=pop(i);
if any(newpop(i,mpoint))==0
newpop(i,mpoint)=1;
else
newpop(i,mpoint)=0;
end
else
newpop(i)=pop(i);
end
end

% 2.7 求出群体中最大得适应值及其个体
%遗传算法子程序
%Name: best.m
%求出群体中适应值最大的值
function [bestindivial,bestfit]=best(pop,fitvalue)
[px,py]=size(pop);
bestindivial=pop(1,:);
bestfit=fitvalue(1);
for i=2:px
if fitvalue(i)>bestfit
bestindivial=pop(i,:);
bestfit=fitvalue(i);
end
end

% 2.8 主程序
%遗传算法主程序
%Name:genmain05.m
clear
clf
popsize=20; %群体大小
chromlength=10; %字符串长度(个体长度)
pc=0.6; %交叉概率
pm=0.001; %变异概率

pop=initpop(popsize,chromlength); %随机产生初始群体
for i=1:20 %20为迭代次数
[objvalue]=calobjvalue(pop); %计算目标函数
fitvalue=calfitvalue(objvalue); %计算群体中每个个体的适应度
[newpop]=selection(pop,fitvalue); %复制
[newpop]=crossover(pop,pc); %交叉
[newpop]=mutation(pop,pc); %变异
[bestindivial,bestfit]=best(pop,fitvalue); %求出群体中适应值最大的个体及其适应值
y(i)=max(bestfit);
n(i)=i;
pop5=bestindivial;
x(i)=decodechrom(pop5,1,chromlength)*10/1023;
pop=newpop;
end

fplot('10*sin(5*x)+7*cos(4*x)',[0 10])
hold on
plot(x,y,'r*')
hold off

[z index]=max(y); %计算最大值及其位置
x5=x(index)%计算最大值对应的x值
y=z

【问题】求f(x)=x 10*sin(5x) 7*cos(4x)的最大值,其中0<=x<=9
【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95,变异概率为0.08
【程序清单】
%编写目标函数
function[sol,eval]=fitness(sol,options)
x=sol(1);
eval=x 10*sin(5*x) 7*cos(4*x);
%把上述函数存储为fitness.m文件并放在工作目录下
initPop=initializega(10,[0 9],'fitness');%生成初始种群,大小为10
[x endPop,bPop,trace]=ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,'normGeomSelect',...
[0.08],['arithXover'],[2],'nonUnifMutation',[2 25 3]) %25次遗传迭代
运算借过为:x =
7.8562 24.8553(当x为7.8562时,f(x)取最大值24.8553)
注:遗传算法一般用来取得近似最优解,而不是最优解。
遗传算法实例2
【问题】在-5<=Xi<=5,i=1,2区间内,求解
f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2 x2.^2)))-exp(0.5*(cos(2*pi*x1) cos(2*pi*x2))) 22.71282的最小值。
【分析】种群大小10,最大代数1000,变异率0.1,交叉率0.3
【程序清单】
%源函数的matlab代码
function [eval]=f(sol)
numv=size(sol,2);
x=sol(1:numv);
eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x))/numv) 22.71282;
%适应度函数的matlab代码
function [sol,eval]=fitness(sol,options)
numv=size(sol,2)-1;
x=sol(1:numv);
eval=f(x);
eval=-eval;
%遗传算法的matlab代码
bounds=ones(2,1)*[-5 5];
[p,endPop,bestSols,trace]=ga(bounds,'fitness')
注:前两个文件存储为m文件并放在工作目录下,运行结果为
p =
0.0000 -0.0000 0.0055
大家可以直接绘出f(x)的图形来大概看看f(x)的最值是多少,也可是使用优化函数来验证。matlab命令行执行命令:
fplot('x 10*sin(5*x) 7*cos(4*x)',[0,9])
evalops是传递给适应度函数的参数,opts是二进制编码的精度,termops是选择maxGenTerm结束函数时传递个maxGenTerm的参数,即遗传代数。xoverops是传递给交叉函数的参数。mutops是传递给变异函数的参数。

【问题】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9
【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95,变异概率为0.08
【程序清单】
%编写目标函数
function[sol,eval]=fitness(sol,options)
x=sol(1);
eval=x+10*sin(5*x)+7*cos(4*x);
%把上述函数存储为fitness.m文件并放在工作目录下
initPop=initializega(10,[0 9],'fitness');%生成初始种群,大小为10
[x endPop,bPop,trace]=ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,'normGeomSelect',...
[0.08],['arithXover'],[2],'nonUnifMutation',[2 25 3]) %25次遗传迭代
运算借过为:x =
7.8562 24.8553(当x为7.8562时,f(x)取最大值24.8553)
注:遗传算法一般用来取得近似最优解,而不是最优解。
遗传算法实例2
【问题】在-5<=Xi<=5,i=1,2区间内,求解
f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2+x2.^2)))-exp(0.5*(cos(2*pi*x1)+cos(2*pi*x2)))+22.71282的最小值。
【分析】种群大小10,最大代数1000,变异率0.1,交叉率0.3
【程序清单】
%源函数的matlab代码
function [eval]=f(sol)
numv=size(sol,2);
x=sol(1:numv);
eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x))/numv)+22.71282;
%适应度函数的matlab代码
function [sol,eval]=fitness(sol,options)
numv=size(sol,2)-1;
x=sol(1:numv);
eval=f(x);
eval=-eval;
%遗传算法的matlab代码
bounds=ones(2,1)*[-5 5];
[p,endPop,bestSols,trace]=ga(bounds,'fitness')
注:前两个文件存储为m文件并放在工作目录下,运行结果为
p =
0.0000 -0.0000 0.0055
大家可以直接绘出f(x)的图形来大概看看f(x)的最值是多少,也可是使用优化函数来验证。matlab命令行执行命令:
fplot('x+10*sin(5*x)+7*cos(4*x)',[0,9])
evalops是传递给适应度函数的参数,opts是二进制编码的精度,termops是选择maxGenTerm结束函数时传递个maxGenTerm的参数,即遗传代数。xoverops是传递给交叉函数的参数。mutops是传递给变异函数的参数。
打字不易,如满意,望采纳。

❽ 请问能给几个遗传算法的应用实例么,越简单越好,如果有java程序实现的就太太完美了,

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
* 编写者: 赖志环
* 标准遗传算法求解函数
* 编写日期: 2007-12-2
*/
class Best {
public int generations; //最佳适应值代号
public String str; //最佳染色体
public double fitness; //最佳适应值
}

public class SGAFrame extends JFrame {

private JTextArea textArea;
private String str = "";
private Best best = null; //最佳染色体
private String[] ipop = new String[10]; //染色体
private int gernation = 0; //染色体代号
public static final int GENE = 22; //基因数
/**
* Launch the application
* @param args
*/
public static void main(String args[]) {
try {
SGAFrame frame = new SGAFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Create the frame
*/
public SGAFrame() {
super();

this.ipop = inialPops();

getContentPane().setLayout(null);
setBounds(100, 100, 461, 277);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JLabel label = new JLabel();
label.setText("X的区间:");
label.setBounds(23, 10, 88, 15);
getContentPane().add(label);

final JLabel label_1 = new JLabel();
label_1.setText("[-255,255]");
label_1.setBounds(92, 10, 84, 15);
getContentPane().add(label_1);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
SGAFrame s = new SGAFrame();
str = str + s.process() + "\n";
textArea.setText(str);
}
});
button.setText("求最小值");
button.setBounds(323, 27, 99, 23);
getContentPane().add(button);

final JLabel label_2 = new JLabel();
label_2.setText("利用标准遗传算法求解函数f(x)=(x-5)*(x-5)的最小值:");
label_2.setBounds(23, 31, 318, 15);
getContentPane().add(label_2);

final JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBounds(23, 65, 399, 164);
getContentPane().add(panel);

final JScrollPane scrollPane = new JScrollPane();
panel.add(scrollPane, BorderLayout.CENTER);

textArea = new JTextArea();
scrollPane.setViewportView(textArea);
//
}

/**
* 初始化一条染色体(用二进制字符串表示)
* @return 一条染色体
*/
private String inialPop() {
String res = "";
for (int i = 0; i < GENE; i++) {
if (Math.random() > 0.5) {
res += "0";
} else {
res += "1";
}
}
return res;
}

/**
* 初始化一组染色体
* @return 染色体组
*/
private String[] inialPops() {
String[] ipop = new String[10];
for (int i = 0; i < 10; i++) {
ipop[i] = inialPop();
}
return ipop;
}

/**
* 将染色体转换成x的值
* @param str 染色体
* @return 染色体的适应值
*/
private double calculatefitnessvalue(String str) {
int b = Integer.parseInt(str, 2);
//String str1 = "" + "/n";
double x = -255 + b * (255 - (-255)) / (Math.pow(2, GENE) - 1);
//System.out.println("X = " + x);
double fitness = -(x - 5) * (x - 5);
//System.out.println("f(x)=" + fitness);
//str1 = str1 + "X=" + x + "/n"
//+ "f(x)=" + "fitness" + "/n";
//textArea.setText(str1);

return fitness;
}

/**
* 计算群体上每个个体的适应度值;
* 按由个体适应度值所决定的某个规则选择将进入下一代的个体;
*/
private void select() {
double evals[] = new double[10]; // 所有染色体适应值
double p[] = new double[10]; // 各染色体选择概率
double q[] = new double[10]; // 累计概率
double F = 0; // 累计适应值总和
for (int i = 0; i < 10; i++) {
evals[i] = calculatefitnessvalue(ipop[i]);
if (best == null) {
best = new Best();
best.fitness = evals[i];
best.generations = 0;
best.str = ipop[i];
} else {
if (evals[i] > best.fitness) // 最好的记录下来
{
best.fitness = evals[i];
best.generations = gernation;
best.str = ipop[i];
}
}
F = F + evals[i]; // 所有染色体适应值总和

}
for (int i = 0; i < 10; i++) {
p[i] = evals[i] / F;
if (i == 0)
q[i] = p[i];
else {
q[i] = q[i - 1] + p[i];
}
}
for (int i = 0; i < 10; i++) {

double r = Math.random();
if (r <= q[0]) {
ipop[i] = ipop[0];

} else {
for (int j = 1; j < 10; j++) {
if (r < q[j]) {
ipop[i] = ipop[j];
break;
}
}
}
}
}

/**
* 交叉操作
* 交叉率为25%,平均为25%的染色体进行交叉
*/
private void cross() {
String temp1, temp2;
for (int i = 0; i < 10; i++) {
if (Math.random() < 0.25) {
double r = Math.random();
int pos = (int) (Math.round(r * 1000)) % GENE;
if (pos == 0) {
pos = 1;
}
temp1 = ipop[i].substring(0, pos)
+ ipop[(i + 1) % 10].substring(pos);
temp2 = ipop[(i + 1) % 10].substring(0, pos)
+ ipop[i].substring(pos);
ipop[i] = temp1;
ipop[(i + 1) / 10] = temp2;
}
}
}

/**
* 基因突变操作
* 1%基因变异m*pop_size 共180个基因,为了使每个基因都有相同机会发生变异,
* 需要产生[1--180]上均匀分布的
*/
private void mutation() {
for (int i = 0; i < 4; i++) {
int num = (int) (Math.random() * GENE * 10 + 1);
int chromosomeNum = (int) (num / GENE) + 1; // 染色体号

int mutationNum = num - (chromosomeNum - 1) * GENE; // 基因号
if (mutationNum == 0)
mutationNum = 1;
chromosomeNum = chromosomeNum - 1;
if (chromosomeNum >= 10)
chromosomeNum = 9;
//System.out.println("变异前" + ipop[chromosomeNum]);
String temp;
if (ipop[chromosomeNum].charAt(mutationNum - 1) == '0') {
if (mutationNum == 1) {
temp = "1" + ipop[chromosomeNum].substring

(mutationNum);
} else {
if (mutationNum != GENE) {
temp = ipop[chromosomeNum].substring(0, mutationNum -

1) + "1" + ipop

[chromosomeNum].substring(mutationNum);
} else {
temp = ipop[chromosomeNum].substring(0, mutationNum -
1) + "1";
}
}
} else {
if (mutationNum == 1) {
temp = "0" + ipop[chromosomeNum].substring

(mutationNum);
} else {
if (mutationNum != GENE) {
temp = ipop[chromosomeNum].substring(0, mutationNum -

1) + "0" + ipop

[chromosomeNum].substring(mutationNum);
} else {
temp = ipop[chromosomeNum].substring(0, mutationNum -
1) + "1";
}
}
}
ipop[chromosomeNum] = temp;
//System.out.println("变异后" + ipop[chromosomeNum]);
}
}
/**
* 执行遗传算法
*/
public String process() {
String str = "";
for (int i = 0; i < 10000; i++) {
this.select();
this.cross();
this.mutation();
gernation = i;
}
str = "最小值" + best.fitness + ",第" + best.generations + "个染色体";
return str;
}

}

❾ 遗传算法 编码 例子

GA的编码通常都是数字序列(好比基因^_^),具体如何编码要看实际需求如何,例如Jeffris提到的行商问题,其编码就是一个包括n节点数字序列(也就是一条不重复走遍所有城市的路线)。

如果你愿意把你所面对的问题贴出来,或许能帮到你一些。

如果你只是在寻求多维数据结构的表现方式,很简单,无论多少维,都可以表现为(x,y,z,...)这样的坐标形式。不过我相信这不是你想要的啦^_^

最后,这个连接上有些内容或许会有点帮助(尽管可能性很小)http://..com/question/17393957.html

加油!

❿ 如何通俗易懂地解释遗传算法有什么例子

相信遗传算法的官方定义你已经看过,就我个人理解
遗传算法的思想是物竞天择,优胜劣汰。
你可以理解为,当我们解某道数学题时,如果这个题太难我们没法列公式算出正确答案,我们有时候也可以蒙答案去反过来看看是否满足这道题提干的要求,如果能满足,说明我们蒙的答案是正确的。但是蒙对答案要试很多遍,每次随机的去试数可能要试1000次才能蒙对。可是遗传算法可以让我们科学的去蒙答案,每次蒙的答案都会比上一次蒙的更接近正确答案,这样可能蒙十几次我们就找到正确答案了。
希望我的回答对你理解GA有所帮助,望采纳

阅读全文

与遗传算法简单实例相关的资料

热点内容
ccs6中工程导入及编译 浏览:719
飞思卡尔单片机官网 浏览:645
仿真51单片机 浏览:864
密码器单片机 浏览:380
php订单处理 浏览:248
安庆程序员接私活哪里接 浏览:978
程序员那么可爱第9集预告片 浏览:668
手机解压缩工具在哪 浏览:757
如何启用阿里云服务器 浏览:738
python里有trim函数吗 浏览:691
pdf里面的文字怎么复制 浏览:901
ps切图压缩 浏览:299
linux删除db2 浏览:284
用prim算法求公路最优解程序 浏览:641
gpu编译android 浏览:604
miui刷机显示加密中 浏览:582
linuxqt图形界面 浏览:719
c语言常用的排序算法 浏览:762
php写本地文件 浏览:979
光影魔术手批量压缩图片 浏览:657