遗传算法原理简介
遗传算法(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] Introduction to Genetic Algorithm, http://obitko.com/tutorials/genetic-algorithms/index.php [2] Holland J H. Adaption in natural and artificial systems
遗传算法简单易懂的例子
遗传算法的例子如下:求解函数 f(x) = x + 10*sin(5*x) + 7*cos(4*x) 在区间[0,9]的最大值。对于求解函数最大值问题,一般选择二进制编码:实数编码:直接用实数表示基因,容易理解且不需要解码过程,但容易过早收敛,从而陷入局部最优;二进制编码:稳定性高,种群多样性大,但需要的存储空间大,需要解码且难以理解。以目标函数 f(x) = x + 10sin(5x) + 7cos(4x), x∈[0,9] 为例。设定求解的精度为小数点后4位,可以将x的解空间划分为 (9-0)×(1e+4)=90000个等分。2^16<90000<2^17,需要17位二进制数来表示这些解。换句话说,一个解的编码就是一个17位的二进制串。这些二进制串是随机生成的。一个这样的二进制串代表一条染色体串,这里染色体串的长度为17。对于任何一条这样的染色体将它复原(解码)到[0,9]这个区间中。可以采用以下公式来解码:x = 0 + decimal(chromosome)×(9-0)/(2^17-1)decimal( )( 将二进制数转化为十进制数。)一般化解码公式:f(x), x∈[lower_bound, upper_bound]x = lower_bound + decimal(chromosome)×(upper_bound-lower_bound)/(2^chromosome_size-1)f(x), x∈[lower_bound, upper_bound]x = lower_bound + decimal(chromosome)×(upper_bound-lower_bound)/(2^chromosome_size-1)lower_bound:函数定义域的下限。upper_bound:函数定义域的上限。chromosome_size:染色体的长度。通过上述公式,我们就可以成功地将二进制染色体串解码成[0,9]区间中的十进制实数解。
遗传算法
例如:[1,2,3],[1,3,2],[3,2,1]均是函数 3x+4y+5z<100 的可行解(代进去成立即为可行解),那么这些可行解在遗传算法中均称为“染色体”。可行解由 3 个元素构成,每个元素都称为染色体的一个基因。
遗传算法在运行过程中会进行 N 次迭代,每次迭代都会生成若干条染色体。适应度函数会给本次迭代中生成的所有染色体打个分,来评判这些染色体的适应度,然后将适应度低的染色体淘汰,只保留适应度高的染色体,从而讲过若干次迭代后染色体的质量将越来越好。
遗传算法每次迭代会生成 N 条染色体,在遗传算法中一次迭代被称为一次进化。每次进化新的染色体生成的方法——交叉。
每一次进化完成后,都要计算每一条染色体的适应度+适应度概率。在交叉过程中就需要根据这个概率来选择父母染色体。适应度高的染色体被选中的概率越高。(这就是遗传算法能够保留优良基因的原因)
交叉能保证每次进化留下优良的基因,但它仅仅是对原有的结果集进行选择,基因还是那么几个,只不过交换了它们的顺序。这只能保证 N 次进化后,计算结果更接近于局部最优解,而永远没办法达到全局最优解(?????),为了解决这个问题,需引入变异。
假设每次进化都需要生成 N 条染色体,那么每次进化中,通过交叉方式需要生成 N-M 条,剩余的 M 条染色体通过复制上一代适应度最高的 M 条染色体而来。
本文的目标是使所有任务的总处理时间最少,时间越短适应度越大。适应度 = 1 / 所有任务的总处理时间
将任务从 0 开始编号,用一个一维数组存储每个任务的时长
tasks[i] :表第 i 个任务的长度。
第 0 个任务的长度为 2;
第 1 个任务的长度为 4;
第 2 个任务的长度为 6;
第 3 个任务的长度为 8;
将处理器节点从 0 开始编号,用一个一维数组存储每个处理器的处理速度(单位时间内可处理的长度)
nodes[i] 表第 i 个节点的处理速度。
第 0 个节点的处理速度为 2;
第 1 个节点的处理速度为 1。
timeMatrix[i][j] 表第 i 个任务在第 j 个节点上处理的话,所需处理时间。
一个可行解就是一个染色体,就是一个一维数组
chromosome[i]=j 表将第 i 个任务分配到节点 j 上处理(任务编号从 0 开始;节点编号从 0 开始)
将任务 0 分配给 3 号节点处理;
将任务 1 分配给 2 号节点处理;
将任务 2 分配给 1 号节点处理;
将任务 3 分配给 0 号节点处理。
记录本次进化生成的 N 条染色体的适应度,将染色体从 0 开始编号。
adaptablility[i] 表第 i 个染色体的适应度
selectionProbability[i] 表第 i 个染色体的适应度概率,所有染色体的适应度概率和为 1 。
java中PriorityQueue优先级队列使用方法
第 2 次迭代结果
第 100 次迭代结果
遗传算法路径规划中什么值影响最优解
在遗传算法路径规划中,影响最优解的值取决于具体问题的不同。一般来说,遗传算法路径规划的优化目标可以是时间、距离、成本、安全性等多个方面,因此影响最优解的值也会随着优化目标的不同而变化。举个例子,如果优化目标是时间最短,那么影响最优解的值可能是路径上每个节点之间的距离、车辆的最大速度、交通状况等因素。如果优化目标是成本最低,那么影响最优解的值可能是每个路径的经济成本、燃油消耗、人工成本等因素。总之,影响遗传算法路径规划中最优解的值取决于具体的优化目标,需要根据问题的特点来选择适当的目标函数,并结合实际情况选择影响最优解的相关因素。【摘要】
遗传算法路径规划中什么值影响最优解【提问】
遗传算法路径规划中什么值影响最优解【提问】
在遗传算法路径规划中,影响最优解的值取决于具体问题的不同。一般来说,遗传算法路径规划的优化目标可以是时间、距离、成本、安全性等多个方面,因此影响最优解的值也会随着优化目标的不同而变化。举个例子,如果优化目标是时间最短,那么影响最优解的值可能是路径上每个节点之间的距离、车辆的最大速度、交通状况等因素。如果优化目标是成本最低,那么影响最优解的值可能是每个路径的经济成本、燃油消耗、人工成本等因素。总之,影响遗传算法路径规划中最优解的值取决于具体的优化目标,需要根据问题的特点来选择适当的目标函数,并结合实际情况选择影响最优解的相关因素。【回答】
如果是路线最优呢。距离最近【提问】
如果优化目标是路线最优,那么影响遗传算法路径规划中最优解的值可能包括以下因素:距离:路径的总长度和各个节点之间的距离都是影响路线最优的重要因素。道路交通情况:路况、拥堵情况、道路限速等因素都会影响路径的行驶时间和路线规划。路线安全:考虑到道路的安全性,可能需要避开一些危险区域或路段,或是选择更安全的路径。时间窗口:在一些特定的情况下,需要考虑路径的行驶时间是否符合时间窗口的限制。费用:在一些特定的场景下,可能需要考虑路径的行驶费用是否符合预算。总之,在路线最优的情况下,距离是最重要的因素之一,同时也需要考虑其他因素,例如交通情况、安全性、时间窗口和费用等,以找到最优解。【回答】
如果是车辆路线最优呢老师【提问】
如果优化目标是车辆路线最优,那么影响遗传算法路径规划中最优解的因素可能包括以下几个:车辆载重和容积:不同的车辆载重和容积限制可能会影响到路径规划,需要根据车辆特性进行相应的调整。道路限制:一些道路可能有宽度、高度、重量等限制,需要避开或选择合适的道路,以保证车辆安全通行。路况和拥堵情况:路况和拥堵情况对于车辆行驶时间和路径规划具有很大的影响,需要考虑实时交通信息。费用和效率:在路径规划中需要考虑车辆行驶的费用和效率,避免在路径规划中出现不必要的浪费。服务质量:在一些特定的场景中,例如快递和物流领域,需要考虑到服务质量的因素,例如准确性和及时性等。综上所述,影响遗传算法路径规划中最优解的因素包括车辆载重和容积、道路限制、路况和拥堵情况、费用和效率、服务质量等。需要根据具体的应用场景来确定具体的优化目标和规划路径。【回答】
遗传算法具体应用
1、函数优化函数优化是遗传算法的经典应用领域,也是遗传算法进行性能评价的常用算例,许多人构造出了各种各样复杂形式的测试函数:连续函数和离散函数、凸函数和凹函数、低维函数和高维函数、单峰函数和多峰函数等。2、组合优化随着问题规模的增大,组合优化问题的搜索空间也急剧增大,有时在目前的计算上用枚举法很难求出最优解。对这类复杂的问题,人们已经意识到应把主要精力放在寻求满意解上,而遗传算法是寻求这种满意解的最佳工具之一。此外,GA也在生产调度问题、自动控制、机器人学、图象处理、人工生命、遗传编码和机器学习等方面获得了广泛的运用。3、车间调度车间调度问题是一个典型的NP-Hard问题,遗传算法作为一种经典的智能算法广泛用于车间调度中,很多学者都致力于用遗传算法解决车间调度问题,现今也取得了十分丰硕的成果。从最初的传统车间调度(JSP)问题到柔性作业车间调度问题(FJSP),遗传算法都有优异的表现,在很多算例中都得到了最优或近优解。扩展资料:遗传算法的缺点1、编码不规范及编码存在表示的不准确性。2、单一的遗传算法编码不能全面地将优化问题的约束表示出来。考虑约束的一个方法就是对不可行解采用阈值,这样,计算的时间必然增加。3、遗传算法通常的效率比其他传统的优化方法低。4、遗传算法容易过早收敛。5、遗传算法对算法的精度、可行度、计算复杂性等方面,还没有有效的定量分析方法。参考资料来源:百度百科-遗传算法
基本遗传算法介绍
遗传算法是群智能优化计算中应用最为广泛、最为成功、最具代表性的智能优化方法。它是以达尔文的生物进化论和孟德尔的遗传变异理论为基础,模拟生物进化过程和机制,产生的一种群体导向随机搜索技术和方法。 遗传算法的基本思想:首先根据待求解优化问题的目标函数构造一个适应度函数。然后,按照一定的规则生成经过基因编码的初始群体,对群体进行评价、遗传运算(交叉和变异)、选择等操作。经过多次进化,获得适应度最高的一个或几个最优个体作为问题的最优解。 编码是对问题的可行解的遗传表示,是影响算法执行效率的关键因素的之一。遗传算法中,一个解 称为个体或染色体(chromosome),染色体由被称为基因(gene)的离散单元组成,每个基因控制颜色体的一个或多个特性,通常采用固定长度的0-1二进制编码,每个解对应一个唯一的二进制编码串编码空间中的二进制位串称为基因型(genotype)。而实际所表示问题的解空间的对应点称为表现型(phenotype)。 种群由个体构成,每个个体的染色体对应优化问题的一个初始解。 适应度函数是评价种群中个体对环境适应能力的唯一确定性指标,体现出“适者生存,优胜劣汰”这一自然选择原则。 遗传算法在每次迭代过程中,在父代种群中采用某种选择策略选择出指定数目的哥特体提进行遗传操作。最常用的选择策略是正比选择(proportional selection)策略。 在 交叉算子中,通常由两个被称为父代(parent)的染色体组合,形成新的染色体,称为子代(offspring)。父代是在种群中根据个体适应度进行选择,因此适应度较高的染色体的基因更有可能被遗传到下一代 。通过在迭代过程中不断地应用交叉算子,使优良个体的基因得以在种群中频繁出现,最终使得整个种群收敛到一个最优解。 在染色体交叉之后产生的子代个体,其基因位可能以很小的概率发生转变,这个过程称为变异。变异是为了增强种群的多样性,将搜索跳出局部最优解。 遗传算法的停止准则一般采用设定最大迭代次数或适应值函数评估次数,也可以是规定的搜索精度。 已Holland的基本GA为例介绍算法等具体实现,具体的执行过程描述如下: Step 1: 初始化 。随机生成含有 个个体的初始种群 ,每个个体经过编码对应着待求解优化问题的一个初始解。 Step 2: 计算适应值 。个体 ,由指定的适应度函数评价其适应环境的能力。不同的问题,适应度函数的构造方式也不同。对函数优化问题,通常取目标函数作为适应度函数。 Step 3: 选择 。根据某种策略从当前种群中选择出 个个体作为重新繁殖的下一代群体。选择的依据通常是个体的适应度的高低,适应度高的个体相比适应度低的个体为下一代贡献一个或多个后代的概率更大。选择过程提现了达尔文“适者生存”原则。 Step 4: 遗传操作 。在选出的 个个体中,以事件给定的杂交概率 任意选择出两个个体进行 交叉运算 ,产生两个新的个体,重复此过程直到所有要求杂交的个体杂交完毕。根据预先设定的变异概率 在 个个体中选择出若干个体,按一定的策略对选出的个体进行 变异运算 。 Step 5: 检验算法等停止条件 。若满足,则停止算法的执行,将最优个体的染色体进行解码得到所需要的最优解,否则转到 Step 2 继续进行迭代过程。
遗传算法的核心是什么?!
遗传操作的交叉算子。在自然界生物进化过程中起核心作用的是生物遗传基因的重组(加上变异)。同样,遗传算法中起核心作用的是遗传操作的交叉算子。所谓交叉是指把两个父代个体的部分结构加以替换重组而生成新个体的操作。通过交叉,遗传算法的搜索能力得以飞跃提高。交叉算子根据交叉率将种群中的两个个体随机地交换某些基因,能够产生新的基因组合,期望将有益基因组合在一起。扩展资料评估编码策略常采用以下3个规范:a)完备性(completeness):问题空间中的所有点(候选解)都能作为GA空间中的点(染色体)表现。b)健全性(soundness): GA空间中的染色体能对应所有问题空间中的候选解。c)非冗余性(nonredundancy):染色体和候选解一一对应。目前的几种常用的编码技术有二进制编码,浮点数编码,字符编码,变成编码等。而二进制编码是目前遗传算法中最常用的编码方法。即是由二进制字符集{0,1}产生通常的0,1字符串来表示问题空间的候选解。参考资料来源:百度百科-遗传算法参考资料来源:百度百科-SGA
基因遗传算法的主流是什么?
基因遗传算法是一种灵感源于达尔文自然进化理论的启发式搜索算法 该算法反映了自然选择的过程 即最适者被选定繁殖 并产生下一代
自然选择的过程从选择群体中最适应环境的个体开始 后代继承了父母的特性 并且这些特性将添加到下一代中 如果父母具有更好的适应性 那么它们的后代将更易于存活 迭代地进行该自然选择的过程 最终 我们将得到由最适应环境的个体组成的一代
这一概念可以被应用于搜索问题中 我们考滤一个问题的诸多解决方案 并从中搜寻出最佳方案
遗传算法含以下五步
1.初始化
2.个体评价(计算适应度函数)
3.选择运算
4.交叉运算
5.变异运算
初始化
该过程从种群的一组个体开始 且每一个体都是待解决问题的一个候选解
个体以一组参数(变量)为特征 这些特征被称为基因 串联这些基因就可以组成染色体(问题的解)
在遗传算法中 单个个体的基因组以字符串的方式呈现 通常我们可以使用二进制(1和0的字符串)编码 即一个二进制串代表一条染色体串 因此可以说我们将基因串或候选解的特征编码在染色体中
个体评价利用适应度函数评估了该个体对环境的适应度(与其它个体径争的能力)每一个体都有适应评分 个体被选中进行繁殖的可能性取决于其适应度评分 适应度函数是遗传算法进化的驱动力 也是进行自然选择的唯一标准 它的设计应结合求解问题本身的要求而定
选择运算的目的是选出适应性最好的个体 并使它们将基因传到下一代中 基于其适应度评分 我们选择多对较优个体(父母)适应度高的个体更易被选中繁殖 即将较优父母的基因传递到下一代
交叉运算是遗传算法中最重要的阶段 对每一对配对的父母 基因都存在随机选中的交叉点
变异运算
在某些形成的新后代中 它们的某些基因可能受到低概率变异因子的作用 这意味着二进制位串中的某些位可能会翻转
变异运算前后
变异运算可用于保持群内的多样性 并防止过早收敛
终止
在群体收敛的情况下(群体内不产生与前一代差异较大的后代)该算法终止 也就是说遗传算法提供了一组问题的解
遗传算法的基本原理
遗传算法本质上是对染色体模式所进行的一系列运算,即通过选择算子将当前种群中的优良模式遗传到下一代种群中,利用交叉算子进行模式重组,利用变异算子进行模式突变。步骤基本框架1.编码由于遗传算法不能直接处理问题空间的参数,因此必须通过编码将要求解的问题表示成遗传空间的染色体或者个体。这一转换操作就叫做编码,也可以称作(问题的)表示(representation)。评估编码策略常采用以下3个规范: (a)完备性(completeness):问题空间中的所有点(候选解)都能作为GA空间中的点(染色体)表现。 (b)健全性(soundness): GA空间中的染色体能对应所有问题空间中的候选解。 (c)非冗余性(nonredundancy):染色体和候选解一一对应。2.适应度函数进化论中的适应度,是表示某一个体对环境的适应能力,也表示该个体繁殖后代的能力。遗传算法的适应度函数也叫评价函数,是用来判断群体中的个体的优劣程度的指标,它是根据所求问题的目标函数来进行评估的。遗传算法在搜索进化过程中一般不需要其他外部信息,仅用评估函数来评估个体或解的优劣,并作为以后遗传操作的依据。由于遗传算法中,适应度函数要比较排序并在此基础上计算选择概率,所以适应度函数的值要取正值。由此可见,在不少场合,将目标函数映射成求最大值形式且函数值非负的适应度函数是必要的。适应度函数的设计主要满足以下条件:(a)单值、连续、非负、最大化(b) 合理、一致性 (c)计算量小 (d)通用性强。 在具体应用中,适应度函数的设计要结合求解问题本身的要求而定。适应度函数设计直接影响到遗传算法的性能。3.初始群体选取遗传算法中初始群体中的个体是随机产生的。一般来讲,初始群体的设定可采取如下的策略:(a)根据问题固有知识,设法把握最优解所占空间在整个问题空间中的分布范围,然后,在此分布范围内设定初始群体。(b)先随机生成一定数目的个体,然后从中挑出最好的个体加到初始群体中。这种过程不断迭代,直到初始群体中个体数达到了预先确定的规模。