当前位置:首页 » 操作系统 » 遗传进化算法

遗传进化算法

发布时间: 2025-03-11 10:13:23

A. 遗传算法原理简介

遗传算法(Genetic Algorithm, GA)是一种进化计算(Evolutionary Computing)算法,属于人工智能技术的一部分。遗传算法最早是由John Holland和他的学生发明并改进的,源于对达芬奇物种进化理论的模仿。在物种进化过程中,为了适应环境,好的基因得到保留,不好的基因被淘汰,这样经过很多代基因的变化,物种的基因就是当前自然环境下适应度最好的基因。该算法被广泛应用于优化和搜索中,用于寻求最优解(或最优解的近似),其最主要的步骤包括交叉(crossover)和突变(mutation)。

所有的生物体都由细胞组成,每个细胞中都包含了同样的染色体(chromosome)。染色体由一串DNA组成,我们可以简单地把一个生物个体表示为一条染色体。每条染色体上都包含着基因,而基因又是由多个DNA组成的。每个基因都控制着个体某个性状的表达,例如眼睛的颜色、眼皮的单双等。在物种繁衍的过程中,首先发生交叉,来自于父母的染色体经过分裂和重组,形成后代的染色体。之后,后代有一定概率发生基因突变,即染色体上某个位置处的基因以一定概率发生变化。之后,对每一代都重复进行交叉和突变两个步骤。对于每一个后代,我们可以通过一定的方式测量其适应度。适应度越好的个体,在下一次交叉中被选中的概率越大,它的基因越容易传给下一代。这样,后代的适应度就会越来越好,直到收敛到一个稳定值。

在优化问题中,可行解总是有很多个,我们希望寻找一个最优解,它相对于其他可行解来说具有更好的适应度(即目标函数值更大或更小)。每个可行解就是一个“生物个体”,可以表示为状态空间中的一个点和适应度。每个解都是一个经过编码的序列,已二进制编码为例,每个解都是一个二进制序列。这样每个染色体就是一个二进制序列。遗传算法从从一组可行解开始,称为population,从population中随机选择染色体进行交叉产生下一代。这一做法的基于下一代的适应度会好于上一代。遗传算法的过程如下:

终止条件可以是达到了最大迭代次数,或者是前后连续几代的最优染色体的适应度差值小于一个阈值。以上算法描述也许还不够直观,我们举例说明。假设解可以用二进制编码表示,则每个染色体都是一个二进制序列。假设序列长度为16,则每个染色体都是一个16位的二进制序列:

首先,我们随机生成一个population,假设population size为20,则有20个长度为16的二进制序列。计算每个染色体的适应度,然后选取两个染色体进行交叉,如下图所示。下图在第6为上将染色体断开再重组,断开的位置是可以随机选择的。当然,断裂位置也可以不止一个。可以根据具体问题选择具体的交叉方式来提升算法性能。

之后,随机选取后代染色体上某个基因发生基因突变,突变的位置是随机选取的。并且,基因突变并不是在每个后代上都会发生,只是有一定的概率。对于二进制编码,基因突变的方式是按位取反:

上述例子是关于二进制编码的,像求解一元函数在某个区间内的最大最小值就可以使用二进制编码。例如,求解函数f(x)=x+sin(3x)+cos(3x)在区间[0,6]内的最小值。假设我们需要最小值点x保留4位小数,那么求解区间被离散成60000个数。因为2 {15}<60000<2 {16},所以,需要16位二进制数来表示这60000个可能的解。其中0x0000表示0,0x0001表示0.0001,以此类推。针对这个例子,文末给出了demo code.

然而,在排序问题中无法使用二进制编码,应该采用排列编码(permutation encoding)。例如有下面两个染色体:

交叉:随机选取一个交叉点,从该出将两个染色体断开。染色体A的前部分组成后代1的前部分,然后扫描染色体B,如果出现了后代1中不包含的基因,则将其顺序加入后代1中。同理,染色体B的前部分组成了后代2的前部分,扫描染色体A获得后代2的后部分。注意,交叉的方式多种多样,此处只是举出其中一种方式。

( 1 5 3 2 6 | 4 7 9 8) + ( 8 5 6 7 2 | 3 1 4 9) => ( 1 5 3 2 6 8 7 4 9) + ( 8 5 6 7 2 1 3 4 9)

突变:对于一个染色体,随机选中两个基因互换位置。例如第3个基因和倒数第2个基因互换:

(1 5 3 2 6 8 7 4 9) => (1 5 4 2 6 8 7 3 9)

此外还有值编码(value encoding)和树编码(tree encoding)等,具体例子可以参考这个链接: http://obitko.com/tutorials/genetic-algorithms/encoding.php

在实际的遗传算法中,往往会保留上一代中的少数几个精英(elite),即将上一代population中适应度最好的几个染色体加入到后代的poulation中,同时去除后代population中适应度最差的几个染色体。通过这个策略,如果在某次迭代中产生了最优解,则最优解能够一直保留到迭代结束。

用GA求函数最小值的demo code: https://github.com/JiaxYau/GA_test

参考资料

[1] Introction to Genetic Algorithm, http://obitko.com/tutorials/genetic-algorithms/index.php

[2] Holland J H. Adaption in natural and artificial systems

B. 遗传算法理解

遗传算法是一种进化算法,进化是什么哪?就是种群逐渐适应生存环境,种群中个体不断得到改良的过程。

遗传算法是一种对生物遗传的模拟、在算法中,初始化一个种群,种群中的每个染色体个体都是一种解决方案,我们通过适应性fitness来衡量这个解决方案的好坏。并对它们进行选择、变异、交叉的操作,找到最优的解决方案。

总结一下遗传算法的基本的步骤:

1.初始化一个种群,并评估每条染色体所对应个体的适应度。

2.选择、交叉、变异,产生新的种群

3.再评估每个个体的适应值,如果适应值达到要求或者达到最大循环次数,否则重复2,不断产生新种群。

知道了GA的大致流程之后、来具体分析一下细节,怎么实现吧

我们知道遗传算法起源于生物遗传,因此在种群中每个个体就是一个染色体,那如何对染色体进行编码,让它表示我们的解决方案那(就是把现实要优化的参数用编码表示成一个染色体)。这里就遇到了一个编码、解码的问题,我们将需要优化的目标编码成染色体,然后再解码为我们可以用来计算fitness的解;

一般在进行参数优化时,一般有两种方式:实数编码、二进制编码

实数编码:基因直接用实数进行表示,这样的表示方法比较简单,不用特意解码了,但是在交叉和变异时,容易过早收敛,陷入局部最优。

二进制编码:将基因用二进制的形式表示,将参数的值转化为二进制形式,这样交叉、变异时更好操作,多样性好,但是占用的存储空间大,需要解码。

染色体就称为个体。对于一次实验,个体就是需要优化参数的一种解、许多这样的个体就构成了种群。

在面对群体中那么多个体时,如何判断个体的好坏呢,就是通过适应值函数了,将解带入适应值函数,适应值越大、解越好。

在遗传算法中,我们怎么使得里面的个体变得越来越优秀呢?

核心思想就是:选择优秀的、淘汰不好的,并且为了生成更好的解,我们要尝试交叉、变异,带来新的解。

选择就是从当前的种群中选择出比较好的个体、淘汰不好的个体

常见的选择方法有:轮盘赌选择、锦标赛选择、最佳保留选择等等

轮盘赌选择就是根据每个个体fitness和种群所有fitness之和比较,确定每个个体被选中的概率,然后进行n次选择,选择n个个体构成新种群,是一种放回抽样的方式。

锦标赛就是每次从种群中选择m个个体,选择最优的,放入新种群,重复选择,直到新种群中个体数目达到n。

最佳保留选择就是在轮盘赌的基础上,将fitness个体先加进新种群,因为轮盘赌是一种概率模型,可能存在最优个体没有进入新种群的情况。

在选择之后,就要考虑产生新的、更优秀的解,为种群带来新的血液。遗传算法的思路是交叉两个优秀的解,往往get好的解。

交叉通过在经过选择的种群中,随机选择一对父母,将它们的染色体进行交叉,生成新的个体,替代原来的解。

常用的交叉方法有:单点交叉、多点交叉等等。

交叉就像生物里面,染色体交换基因一样的~但是并不是种群中所有个体都进行交叉的,实现时可以,设置一个交叉率和交叉概率,随机选择种群中两个体、随机一个数,小于交叉率就进行交叉操作,并根据交叉概率判断交叉的程度,从而生成新个体,反之就保留这两个体。

变异也是一种产生新个体的方式,通过改变个体上基因,期望产生更好的解。比如在以二进制编码的个体上,将里面的0、1进行等位变化啥的,就是0变1、1变0这样。同样也要考虑变异率、变异产生的新解是不可控的,可能很好,也可能很坏,不能像交叉一样,确保一定的效果,所以往往变异率设置的比较小。

C. 遗传算法的基本原理

遗传算法的基本原理:基于达尔文的自然选择和遗传理论模拟生物进化过程,解决优化和搜索问题。

遗传算法是一种模拟自然进化机制的搜索算法。它的核心思想是通过模拟生物进化过程中的自然选择、遗传和变异等机制,寻找最优解或近似最优解。遗传算法的基本原理主要包括以下几个要点:

编码与初始化种群

遗传算法采用一种特定的编码方式来表示问题的解空间,如二进制编码、实数编码等。这些编码构成了一个种群,种群中的每个个体代表一个可能的解。初始化种群是算法的第一步,随机生成一定数量的个体组成初始种群。

适应度函数

适应度函数用于评估种群中个体的质量,是遗传算法中非常重要的部分。适应度函数根据问题的具体需求定义,反映了每个个体解决方案的优劣程度。在进化过程中,适应度高的个体更有可能被选择并产生后代。

选择操作

选择操作模拟了自然选择的过程。在遗传算法中,根据个体的适应度值,按照一定的选择策略,从当前种群中选择出适应度较高的个体,用于产生下一代种群。

交叉与变异操作

交叉和变异操作模拟了生物的遗传过程。交叉操作通过组合两个个体的基因,产生新的个体。变异操作则是对个体基因进行随机改变,增加种群的多样性。这两个操作共同决定了算法的搜索能力和方向。

通过上述步骤,遗传算法不断地迭代进化,每一代种群都比前一代更适应环境。最终,通过自然选择和遗传机制的模拟,遗传算法能够找到问题的近似最优解或满意解。由于其独特的搜索机制和强大的全局搜索能力,遗传算法在许多领域得到了广泛应用。

热点内容
mysql存储过程和函数 发布:2025-03-12 01:56:36 浏览:186
srt流媒体服务器搭建 发布:2025-03-12 01:55:37 浏览:545
如何查找ftp电影下载资源 发布:2025-03-12 01:37:37 浏览:386
一加保存的密码在哪里 发布:2025-03-12 01:13:06 浏览:89
微信第三方平台源码 发布:2025-03-12 01:12:21 浏览:781
服务器关闭怎么补偿 发布:2025-03-12 01:01:26 浏览:334
c语言复数的四则运算 发布:2025-03-12 01:01:22 浏览:803
我的世界电脑版新的服务器 发布:2025-03-12 01:00:27 浏览:379
网站数据库设置 发布:2025-03-12 00:52:13 浏览:311
安卓是哪个企业 发布:2025-03-12 00:41:23 浏览:91