🌞欢迎来到智能优化算法的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
🌠本阶段属于筑基阶段之一,希望各位仙友顺利完成突破
📆首发时间:🌹2021年12月11日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
0️⃣✨✨✨变量说明✨✨✨
f 个体适应度
[Umin,Umax] 某变量的取值范围
δ 编码精度
1️⃣✨✨✨基本流程✨✨✨
Step1:参数设置及种群初始化;
Step2:适应度评价;
Step3:轮盘赌选择;
Step4:交叉;
Step5:变异;
Step6:适应度评价;
Step7:终止条件判断,若未达到终止条件,则转到Step3;
Step8:输出结果。
2️⃣✨✨✨函数✨✨✨
1.例程GA.m为主函数,是对函数f(x,y)=x2+y2(-1<x<1,-1<y<1)求解最小值。
2.decod.m 为子函数,实现二进制编码到十进制数的转换功能,需要同学们自行完成。decod(v,l)的输入参数v表示待转换的二进制编码,l表示二进制编码的长度。v为N×l的矩阵,其中N表示种群中的个体数,即decod.m应当可以将N个长度为l的二进制编码的个体转换为N个十进制数。
3️⃣✨✨✨基本原理✨✨✨
1.遗传算法概要
遗传算法是具有“生成+检测”的迭代过程的搜索算法。它的基本处理流程如图所示。由此流程图可见,遗传算法是一种群体型操作,该操作以群体中的所有个体为对象。选择(selection)、交叉(crossover)和变异(mutation)是遗传算法的3个主要操作算子,它们构成了所谓的遗传操作(genetic operation),使遗传算法具有了其它传统方法所没有的特性。遗传算子包含如下6个基本因素:
- 参数编码:由于遗传算法不能直接处理解空间的解数据,因此必须通过编码将它们表示成遗传空间的基因型串结构数据。
- 生成初始群体:由于遗传算法的群体型操作需要,所以必须为遗传操作准备一个由若干初始解组成的初始群体。初始群体的每个个体都是通过随机方法产生。
- 适应度评估检测:遗传算法在搜索进化过程中一般不需要其他外部信息,仅用适应度(fitness)值来评估个体或解的优劣,并作为以后遗传操作的依据。
- 选择(selection):选择或复制操作是为了从当前群体中选出优良的个体, 使它们有机会作为父代为下一代繁殖子孙。个体适应度越高,其被选择的机会就越多。此处采用与适用度成比例的概率方法进行选择。具体地说,就是首先计算群体中所有个体适应度的总和,再计算每个个体的适应度所占的比例,并以此作为相应的选择概率。
- 交叉操作:交叉操作是遗传算法中最主要的遗传操作。简单的交叉(即一点交叉)可分两步进行:首先对种群中个体进行随机配对;其次,在配对个体中随机设定交叉处,配对个体彼此交换部分信息。
(6) 变异:变异操作是按位(bit)进行的,即把某一位的内容进行变异。变异操作同样也是随机进行的。一般而言,变异概率都取得较小。变异操作是十分微妙的遗传操作,它需要和交叉操作配合使用,目的是挖掘群体中个体的多样性,克服有可能限于局部解的弊病。
2.二进制编码及解码方法
二进制编码是遗传算法中最主要的一种编码方法,它使用的编码符号集是由二进制符号0和1所组成的二进制符号集{0,1},它所构成的个体基因型是一个二进制编码符号串。
二进制编码符号串的长度与问题所要求的求解精度有关。假设某一参数的取值范围是[Umin,Umax],我们用长度为L的二进制编码符号串来表示该参数,则它总共能够产生种不同的编码,若使参数编码时的对应关系如下:
00000000…00000000=0 → Umin
00000000…00000001=1 → Umin+δ
… … …
111111111…11111111=2L﹣1 → Umax
4️⃣✨✨✨代码部分✨✨✨
遗传算法求函数f=x+10*sin(5*x)+7*cos(4*x)的最大值
1.要新建一个文件夹
2.打开该文件夹,在新建脚本或函数。
GA.m %基于遗传算法的函数优化 GA.m clc; clear;close all; p = rand(50,22); v = 2*rand(50,22)-1; v=hardlim(v); [N,L] = size(v); ger = 200; pc = 0.5; pm = 0.01; updatef=0;c=0; disp(sprintf('Number of generations: %d',ger)); disp(sprintf('Population size: %d',N)); disp(sprintf('Crossover probability: %.3f',pc)); disp(sprintf('Mutation probability: %.3f',pm)); f='-1*(x.^2+y.^2)'; % General parameters & Initial operations sol1=1; vmfit = []; it = 1; vx = []; C = [];updatef=-10; x = decod(v(:,1:11),11); y = decod(v(:,12:end),11); fit = eval(f); % Generations t0 = clock; while it <= ger % Selection 轮盘赌 for i=1:N sp(i)=(fit(i)+3)/sum(fit+3);% end for i=2:N sp(i)=sp(i-1)+sp(i); end for i=1:N p=rand(1); sindex=1; while p > sp(sindex) sindex=sindex+1; %寻找要选择个体的位置 end newv(i,:)=v(sindex,:); end for i=1:N v(i,:)=newv(i,:);%用选择出的个体构成的种群替代旧的种群 end % Crossver for i=1:N cindex(i)=i; end for i=1:N %产生要配对的父代的序号;经过N次顺序调换,将原有顺序打乱,使相邻两个个体作为交叉的父代 point=unidrnd(N-i+1); temp=cindex(i); cindex(i)=cindex(i+point-1); cindex(i+point-1)=temp; end for i=1:2:N p=rand(1); if(p<pc) point=unidrnd(L-1)+1;%1<point<L 产生交叉点 for j=point:(L-1) %交叉 ch=v(cindex(i),j); v(cindex(i),j)=v(cindex(i+1),j); %cindex中相邻的两个为两个父代的序号 v(cindex(i+1),j)=ch; end end end % Mutation M=rand(N,L)<=pm;%产生(N,L)维的01矩阵,为1的位置进行变异 v=v-2.*(v.*M)+M; % Evaluatefitness & Evolution x = decod(v(:,1:11),11); y = decod(v(:,12:end),11); fit = eval(f); [sol1,indb1] = max(fit); if updatef>=sol1 sol1=updatef; v(indb1,:)=updatec; end updatef=sol1; updatec=v(indb1,:); [sol2,indb2] = min(fit); v(indb2,:) = v(indb1,:); x = decod(v(:,1:11),11); y = decod(v(:,12:end),11); fit = eval(f); media = mean(fit); vx = [vx sol1]; vmfit = [vmfit media]; if rem(it,1) == 0 | it == 10, if c~=1 disp(sprintf('Gen.: %d x: %2.5f y: %2.5f Av: %2.2f f(x,y): %2.40f',it,x(indb1),y(indb1),media,sol1)); else disp(sprintf('Gen.: %d Av: %2.2f f(x,y): %2.5f',it,media,sol1)); end end; it = it + 1; end; T = etime(clock,t0); %F = flops - f0; X=x;Y=y; x = x(indb1); y = y(indb1); fx = sol1; P = v; disp(sprintf('the total time is %2.4f',T)); disp(sprintf('Maximum found [f(x,y)]: [%.2f]',fx)); % xx=vx;yy=vmfit; figure(2); plot(vx,'k'); title('f(x,y) x Mean'); xlabel('Generations'); ylabel('f(x,y)'); hold on; plot(vmfit,'k:'); legend('best','mean',0);hold off; decod.m function x = decod(v,l)%解码子函数 %******************************** [length ,width]=size(v); x=zeros(1,length); for i=1:length sum=0; for j=1:l sum=sum+v(i,j)*2^(1-j); end x(i)=-1+sum+2/(2^l-1); end
利用遗传算法求解函数极值
最新推荐文章于 2023-11-14 20:28:59 发布
本文深入探讨遗传算法的基本原理,包括变量说明、操作流程、适应度评估和遗传算子。通过一个具体的函数优化问题,展示了遗传算法的代码实现,包括种群初始化、轮盘赌选择、交叉和变异等步骤,帮助读者理解并掌握遗传算法的应用。
摘要由CSDN通过智能技术生成