首页 > 编程知识 正文

进化算法与遗传算法的区别,遗传算法适用于什么

时间:2023-05-04 00:09:49 阅读:147761 作者:559

进化算法的介绍与实现(遗传算法)进化算法又称遗传算法。 进化算法的求解过程模拟了自然生物的进化过程,通过“适者生存,劣者淘汰”的规则不断进化,直到找到最优解或达到终止条件。 详细的介绍可以看百度和论文,这里就不多介绍了

进化算法的实现被认为是“神”,通过控制种群选择、杂交和变异策略,不断优化种群进程。

文章目录进化算法的介绍与实现(遗传算法)一、进化计算概要二、进化计算的基本要素1 )个体编码2 )适应值函数3 )笨哆啦A梦选择策略4 )变化算子5 )下一代个体群选择6 )个体群初始化7 )终止条件3 )进化算法的实现1

一、进化计算概要进化计算的详细介绍可以通过百度和知网论文了解,但这只是大致介绍。 以下是进化算法的基本框架的流程图。

二、进化计算的基本要素进化计算结构比较简单,但每个部分不同的处理方式会影响算法的效率和最终结果。 进化算法有以下7个主要要素。

1 .个体编码常见的编码方式有二进制编码和实数编码,本文采用的是实数编码。

2 .适应值函数进化算法中,适应函数用于评估种群中单个个体,是进行笨哆啦A梦种群选择的依据,也是选择下一代种群的依据,适应度函数影响种群的多样性和算法

3 .笨哆啦A梦选择策略笨哆啦A梦选择的目的是希望好的笨哆啦A梦个体经过杂交或变异操作后获得更好的后代。 不同的愚蠢哆啦A梦选择方式每次都选择最好的个体作为影响算法收敛速度的愚蠢哆啦A梦,算法往往会陷入局部最优。 另一方面,在选择压力过小的情况下,也就是说个体好的一方很少被选为愚蠢的哆啦A梦的情况下,虽然能够保持种群的多样性,提高算法最优收敛的概率,但是算法的收敛速度变慢,在达到结束条件时也能得到最优解所以保持恰当选择愚蠢哆啦A梦的压力是个重要的问题。 通常,在算法初始阶段采用较低的选择压力有利于扩展搜索空间,在算法后期采用较大的选择压力有利于算法找到更好的解。 常见的笨蛋哆啦A梦的选择方法有轮盘赌选择、锦标赛选择、基于排名的选择方法等。

4 .变化算子的变化算子主要是杂交算子和变异算子。

)杂交运算符杂交运算符将两个个体的信息组合以生成一个或多个后代。 杂交算子期望通过重组更好的傻哆啦A梦信息来获得更好的后代。 通常,两个笨哆啦A梦之间的杂交会产生两个新个体。 杂交的方式有多种,采用不同的杂交方式对算法收敛和算法效率也有同样大的影响。

)2)变异算子变异算子改变某个个体的某个染色体的信息,得到新的个体。 其目的是通过引入新信息提高种群多样性,扩大搜索空间,避免算法陷入局部最优。

5 .下一代种群选择下一代种群选择的作用是从现代种群和笨哆啦A梦产生的后代中选择一组个体形成下一代种群。 一般下一代种群的选择,通过适应值比较,按现代种群中所有个体的适应值排序,选择最佳个体形成下一代。

6 .种群初始化种群初始化可以在可行域空间中随机生成,也可以通过佳点集策略生成均匀分布在可行域中的种群,也可以采用启发式方法初始化种群,算法更快且比较优

7 .终止条件一般算法的终止条件有以下几种[7] :

(1)算法的执行时间达到预先指定的最大执行时间。

)2)算法计算时使个体适应值总数达到预先指定的最大次数。

)3)算法的进化次数达到预先指定的最大代数。

)4)算法连续几代后,个体适应值无明显变化。

(5)种群多样性降至某一预先指定阈值。

算法的实际结束条件可能是上述几个条件的提取,但最常用的是预先指定最大的代数。

三、进化算法的实现此处进化算法的实现采用MATLAB,测试函数采用Hedar库测试函数——求函数最小值。 实现方法比较简单,可以作为一个参考内容,很少考虑优化效果。

有关Hedar test set的测试函数,请参见

链接:3358 www-optima.amp.I.Kyoto-u.AC.jp/member/student/hedar _ files/test go _ files/page 330

让我们把两个函数的三维模型放在这里:

1. Matlab码实现框架这里是求解函数的最小值,所以编码规则选择实数编码。

1. 种群初始化

简单点,在此选择随机初始化种群的方法。

(初始化个体群马自行车运动中心(个体群马自行车运动中心popsize )个体群马自行车运动中心)维度dim )个体维度)取值范围bounds )每个个体的一维取值范围functionpop=initpop ) popsize,dim, bounds ) p=rand ) popsize popsize*dim的0-1矩阵forI=1:dimp(:I )=p ) :I ) * ) bounds(i(I,2 )-bobounds 结束

2. 计算个体适应值

%计算函数适应值,先对函数值进行求倒,为了防止函数值为0的情况,先加上0.001,最后对进行归一化处理function [fitvalue] = calfitvalue(objvalue)value = 1./(objvalue+0.001);Max = max(value);Min = min(value);fitvalue = (value-Min)/(Max-Min);end

3. 笨笨的机器猫个体的选择
这里采用最简单的方式选择笨笨的机器猫个体,选择适应值最大的前N个个体为笨笨的机器猫种群,进行后续的杂交和变异。这样做的一个优点是可以加快种群的进化速度,缺点是容易陷入局部最优,要做到一个更好的优化效果建议采用其他策略。

function [newpop] = selection(pop,fitvalue)%pop:种群%fitvalue:种群每个个体对应的适应值[~,index]= sort(fitvalue,'descend');[x,y] = size(pop);newpop = zeros(x,y);for i = 1:ceil(x/1.2) newpop(i,:) = pop(index(i),:);endend

4. 个体杂交方法
个体杂交方式也采用比较简单的方案,在笨笨的机器猫种群中随机选择两个个体进行杂交,根据杂交概率是否进行杂交。生成一个杂交因子n,笨笨的机器猫1乘以n加上笨笨的机器猫2乘以(1-n);第二个子代交换顺序相乘。最后将笨笨的机器猫和子代合并称为一个新的种群,进行下一步的变异。

%交叉变换% pop:种群% pc:杂交概率,用于决定所选的两个个体是否进行交叉变换--杂交function [newpop] = crossover(pop,pc)[px,~] = size(pop);newpop = pop;childpop = [];for i = 1:px x = ceil(rand(1,2)).*px; %生成两个随机数选择个体进行交换生成新个体 if(rand<pc) n = rand; newpop1 = pop(x(1),:).*n+pop(x(2),:)*(1-n); newpop2 = pop(x(1),:).*(n-1)+pop(x(2),:)*n; childpop = [childpop ;newpop1; newpop2]; endendnewpop = [newpop;childpop];%和并笨笨的机器猫种群和子代个体end

5. 个体变异方法
遍历每一个个体,遍历个体的的每一个基因(维度),根据变异概率决定该基因是否变异。

%变异算子% pop:种群% pc:变异概率,个体单个基因(维度)变异的概率function [newpop] = mutation(pop,pm,bounds)[px,py] = size(pop);newpop = pop;for i = 1:px for j = 1:py if(rand<pm) % 小于pm,变异,变异为取值范围内的随机值 newpop(i,j) = rand * (bounds(j,2)-bounds(j,1))+bounds(j,1); end endendend

6. 新一代种群选择
在当前种群中根据适应值排序选择新一代种群

function [newpop] = updatepop(pop,popsize,fitvalue)[px,py] = size(pop);if px<=popsize newpop = pop; return;endnewpop = zeros(popsize,py);[~,index]= sort(fitvalue,'descend');for i = 1:popsize newpop(i,:) = pop(index(1),:);endend

7. 计算函数值

在这里就不计算所有的Hedar库的所有函数了,Hedar共有27个函数,有些函数有多个不同维度可以计算。在这里就随便几个函数和对应的维度测试。

function y = calfun(x)global fvals nfev nprob %用于保存函数值历史和计算次数switch nprob case 1 y = ackley(x); %2d case 2 y = ackley(x); %5d case 3 y = ackley(x); %10d case 4 y = ackley(x); %20d case 5 y = beale(x); case 6 y = bh1(x); case 7 y = bh2(x); case 8 y = bh3(x); case 9 y = booth(x); % case 10 y = branin(x); endnfev = nfev + 1;%保存计算次数

8. 最佳个体计算函数

function [bestindividual,bestfit] = best(pop,fitvalue,bestindividual,bestfit)[px,~] = size(pop);if isempty(bestindividual) % 初始种群 bestindividual = pop(1,:); bestfit = fitvalue(1);endfor i = 1:px if fitvalue(i)<bestfit % 最小化问题 bestindividual = pop(i,:); bestfit = fitvalue(i); endendend

8. 主函数

function bestfit = myGA_2(bounds,popsize,pc,pm)% bounds 搜索区域% popsize 种群大小% pc 杂交概率% pm 变异概率global nfev maxnfev % 函数值计算次数、最大函数值计算次数if nargin<2 popsize = 200; % 种群大小endif nargin<3 pc = 0.8;%杂交概率endif nargin<4 pm = 0.05;%变异概率end[dim,~] = size(bounds);pop = initpop(popsize,dim,bounds);%初始种群objvalue = zeros(popsize,1);bestindividual = [];bestfit = [];while nfev<maxnfev for j=1:size(pop,1) objvalue(j) = calfun(pop(j,:));% 评估种群适应值 end fvalue = calfitvalue(objvalue); %寻找最优解 [bestindividual,bestfit] = best(pop,objvalue,bestindividual,bestfit); %更新种群 [newpop,newfvalue] = updatepop(pop,popsize,fvalue); %选择操作 pop = selection(newpop,newfvalue); %交叉操作 newpop = crossover(pop,pc); %变异操作 pop = mutation(newpop,pm,bounds); endend

9. 测试函数

function [H] = testMyGA()% H : 算法求解Hedar库的测试结果,只保存最佳结果。如果有需要保存其他数据,请自行添加,改造函数% N : 问题维数向量% c: 描述要比较的算法编号global nfev nprob maxnfev %用于计算次数、问题编号、最大函数值计算次数maxnfev = 50000; % 最大函数值计算次数 nfev = 0; % 函数值计算次数初值maxnp = 10; % 测试函数个数maxrun = 2; % 运行多少次算法,适用于随机算法;随机算法,每次计算的结果都不一致。H = ones(maxrun ,maxnp);for nprob=1:maxnp fprintf('Begin to test the %3d th problemn',nprob); bounds = getbounds(nprob); popsize = 100; pc = 0.6; pm = 0.05; for r = 1:maxrun bestfit = myGA_2(bounds,popsize,pc,pm); nfev = 0; H(r,nprob) = bestfit; endendclear globalend%每个问题的取值范围function [bounds] = getbounds(nprob)switch nprob case 1 bounds = [-15*ones(2,1) 30*ones(2,1)]; case 2 bounds = [-15*ones(5,1) 30*ones(5,1)]; case 3 bounds = [-15*ones(10,1) 30*ones(10,1)]; case 4 bounds = [-15*ones(20,1) 30*ones(20,1)]; case 5 bounds = [-4.5*ones(2,1) 4.5*ones(2,1)]; case 6 bounds = [-80*ones(2,1) 125*ones(2,1)]; % 与hedar的界不同,左边乘以0.8,右边除以0.8 case 7 bounds = [-80*ones(2,1) 125*ones(2,1)]; % 与hedar的界不同,左边乘以0.8,右边除以0.8 case 8 bounds = [-80*ones(2,1) 125*ones(2,1)]; % 与hedar的界不同,左边乘以0.8,右边除以0.8 case 9 bounds = [-10*ones(2,1) 10*ones(2,1)]; case 10 bounds = [-5 10;0 15];endend 2. 测试结果

这个测试结果是函数计算次数才5W次,运行一次所得的结果,由于结果我只保存小数点后四位,基本上只有第5,9,10函数与最优解有一定的差距,想要缩短差距,可以设置更大函数计算次数,计算多次以及改进进化策略。

函数名维度最优解测试结果ackley200ackley500ackley1000ackley2000beale200.0060bh1200bh2200bh3200booth200.0066branin20.3978870.3991

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。