遗传算法基本思想
遗传算法(GeneticAlgorithm,GA)起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展上去的随机全局搜索和优化方式,借鉴了达尔文的进化论和孟德尔的遗传学说。其本质是一种高效、并行、全局搜索的方式,能在搜索过程中手动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解。
遗传算法的主要步骤
(1)编码:将问题的候选解用染色体表示,实现解空间向编码空间的映射过程。遗传算法不直接处理解空间的决策变量,而是将其转换成由基因按一定结构组成的染色体。编码方法有好多,如二补码编码、实数向量编码、整数排列编码、通用数据结构编码等等。本文将采用二补码编码的方法,将十补码的变量转换成二补码,用0和1组成的数字串模拟染色体,可以很便捷地实现基因交叉、变异等操作。
(2)种群初始化:形成代表问题可能潜在解集的一个初始群体(编码集合)。种群规模设定主要有以下方面的考虑:从群体多样性方面考虑,群体越大越好,防止深陷局部最优;从估算效率方面考虑,群体规模越大将造成估算量的降低。应当按照实际问题确定种群的规模。形成初始化种群的方式一般有两种:一是完全随机的方式形成;二是按照先验知识设定一组必须满足的条件,之后按照这种条件生成初始样本。
(3)估算个体适应度:借助适应度函数估算各个个体的适应度大小。适应度函数(FitnessFunction)的选定直接影响到遗传算法的收敛速率以及能够找到最优解多目标差分进化算法 matlab,由于在进化搜索中基本不借助外部信息,仅以适应度函数为根据,借助种群每位个体的适应程度来指导搜索。
(4)进化估算:通过选择、交叉、变异,形成出代表新的解集的群体。选择(selection):依据个体适应度大小,根据优胜劣汰的原则,淘汰不合理的个体;交叉(crossover):编码的交叉重组,类似于染色体的交叉重组;变异(mutation):编码按小几率扰动形成的变化,类似于基因突变。
(5)解码:末代种群中的最优个体经过解码实现从编码空间向解空间的映射,可以作为问题的近似最优解。这是整个遗传算法的最后一步,经过若干次的进化过程,种群中适应度最高的个体代表问题的最优解,但这个最优解还是一个由0和1组成的数字串,要将它转换成十补码能够供我们理解和使用。
遗传编码
遗传编码将变量转化为基因组的表示方式,优化变量的编码机制有二补码编码、十补码编码(实数编码)等。
二补码编码
这儿简单介绍以下二补码编码的实现原理。诸如,求实数区间[0,4]上函数f(x)的最大值,传统的方式是不断调整自变量x的值,假定使用二补码编码旧式,我们可以由宽度6的未穿表示变量x,即从000000到111111,并将中间的取值映射到实数区间[0,4]内。因为哦才才能整数上来看,6位宽度二补码表示范围为0~63,所以对应的[0,4]区间,每位相邻值之间的前馈值为4/64≈0.00635。这个就是编码的精度,编码精度越高,所得到的解的质量也越高。
实数编码
在解决高维、连续优化问题等是多目标差分进化算法 matlab,常常采用实数编码形式。实数编码的优点是估算精度搞,以便和精典连续优化算法结合。
遗传算法流程
1)初始化。设置进化代数计数器g=0,设置最大进化代数G,随机生成NP个个体作为初始群体P(0)
2)个体评价P(t)。估算群体中各个个体的适应度
3)选择运算。将选择算子作用域群体,依照个体适应度,根据一定的规则和方式,选择一些优良个体遗传到下一代群体。
4)交叉运算。将交叉算子作用于群体,对选中的成对个体,以某一机率交换她们之间的部份染色体,形成新的个体
5)变异运算。将变异算子作用于群体,对选中的个体,以某一机率改变某一个或某一些基因值为其他的等位基因。群体P(t)经过选择、交叉、和变异运算以后得到下一代群体P(t+1)。估算其适应度值,并按照适应度值进行排序,打算进行下一代遗传操作。
6)中止条件判定:若g≤G,则g=g+1,转入步骤2);若g>G,则中止估算
实际演示
估算函数
的最小值。这是一个简单的平方和问函数,只有一个极小点,理论最小值f(0,0,...,0)=0
仿真过程如下:
(1)初始化种群数量为NP=100,染色体基因维数D=10,最大进化迭代数G=1000,交叉机率为Pc=0.8,变异机率Pm=0.1
(2)形成初始种群,估算给体适应度值;进行始数编码的安泽以及交叉和变异操作。选择和交叉操作采用“君主方案”,即在对群体按照适应度值高低进行排序的基础上,用最优个体与其他奇数位的所有个体进行交叉,每次交叉形成两个新个体。在交叉之后,对信产所的群体进行多点变异形成子群体,再估算器适应度值,之后和父群体合并,但是按照适应度值进行排序,取前NP个个体为新群体,进行下一次遗传操作。
(3)判定是否满足中止条件:若满足,结束搜索过程,输出最优值;若不满足,继续迭代优化
%%%%%%%%%%%%%%%%%%%%实值遗传算法求函数极值%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all; %清除所有变量 close all; %清图 clc; %清屏 D=10; %基因数目 NP=100; %染色体数目 Xs=20; %上限 Xx=-20; %下限 G=1000; %最大遗传代数 f=zeros(D,NP); %初始种群赋空间 nf=zeros(D,NP); %子种群赋空间 Pc=0.8; %交叉概率 Pm=0.1; %变异概率 f=rand(D,NP)*(Xs-Xx)+Xx; %随机获得初始种群 %%%%%%%%%%%%%%%%%%%%%%按适应度升序排列%%%%%%%%%%%%%%%%%%%%%%% for np=1:NP MSLL(np)=func2(f(:,np)); end [SortMSLL,Index]=sort(MSLL); Sortf=f(:,Index); %%%%%%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%%%%%%%%%% for gen=1:G %%%%%%%%%%%%%%采用君主方案进行选择交叉操作%%%%%%%%%%%%%%%% Emper=Sortf(:,1); %君主染色体 NoPoint=round(D*Pc); %每次交叉点的个数 PoPoint=randi([1 D],NoPoint,NP/2); %交叉基因的位置 nf=Sortf; for i=1:NP/2 nf(:,2*i-1)=Emper; nf(:,2*i)=Sortf(:,2*i); for k=1:NoPoint nf(PoPoint(k,i),2*i-1)=nf(PoPoint(k,i),2*i); nf(PoPoint(k,i),2*i)=Emper(PoPoint(k,i)); end end %%%%%%%%%%%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%%%%%% for m=1:NP for n=1:D r=rand(1,1); if r到此这篇关于Matlab借助遗传算法GA求解非连续函数问题解读的文章就介绍到这了,更多相关Matlab遗传算法求解非连续函数内容请搜索脚本之家先前的文章或继续浏览下边的相关文章希望你们之后多多支持脚本之家!