遗传算法GA求解函数极值
- 格式:docx
- 大小:20.76 KB
- 文档页数:6
利用遗传算法求函数的极大值该函数有两个局部极大值点,分别是f (2.048,-2.048)=3897.7342和f (2.048,-2.048)=3905.9262,其中,后者为全局最大点。
可以分别用二进制编码和十进制编码遗传算法求函数极大值遗传算法二进制编码求函数极大值程序%Generic Algorithm for function f(x1,x2) optimumclear all;close all;%Parameters 参数Size=80; %群体大小G=100; %终止进化代数CodeL=10; %代码长度umax=2.048;umin=-2.048;E=round(rand(Size,2*CodeL)); %Initial Code 最初代码%Main Program 主程序for k=1:1:Gtime(k)=k;222212121(,)100()(1)2.048 2.048(1,2)i f x x x x x x i ⎧=-+-⎨-≤≤=⎩for s=1:1:Sizem=E(s,:);y1=0;y2=0; %X对应的十进制代码%Uncodingm1=m(1:1:CodeL);for i=1:1:CodeLy1=y1+m1(i)*2^(i-1); %将y1转换为十进制数endx1=(umax-umin)*y1/1023+umin;m2=m(CodeL+1:1:2*CodeL);for i=1:1:CodeLy2=y2+m2(i)*2^(i-1); %将y2转换为十进制数endx2=(umax-umin)*y2/1023+umin; %求x对应的十进制数F(s)=100*(x1^2-x2)^2+(1-x1)^2; %个体适应度函数endJi=1./F; %个体适应度函数的倒数%****** Step 1 : Evaluate BestJ ******BestJ(k)=min(Ji);fi=F; %Fitness Function 适应函数[Oderfi,Indexfi]=sort(fi); %Arranging fi small to biggerBestfi=Oderfi(Size); %Let Bestfi=max(fi)BestS=E(Indexfi(Size),:); %Let BestS=E(m), m is the Indexfi belong to max(fi) %最佳样本bfi(k)=Bestfi;%****** Step 2 : Select and Reproduct Operation******fi_sum=sum(fi);fi_Size=(Oderfi/fi_sum)*Size;fi_S=floor(fi_Size); %Selecting Bigger fi valuekk=1;for i=1:1:Sizefor j=1:1:fi_S(i) %Select and ReproduceTempE(kk,:)=E(Indexfi(i),:);kk=kk+1; %kk is used to reproduceendend%************ Step 3 : Crossover Operation ************pc=0.60; %交叉概率n=ceil(20*rand); %种群大小for i=1:2:(Size-1)temp=rand;if pc>temp %Crossover Conditionfor j=n:1:20TempE(i,j)=E(i+1,j); %交换E(i,j)和E(i+1,j)TempE(i+1,j)=E(i,j);endendendTempE(Size,:)=BestS;E=TempE;%************ Step 4: Mutation Operation ************** %pm=0.001; %变异概率%pm=0.001-[1:1:Size]*(0.001)/Size; %Bigger fi, smaller Pm %pm=0.0; %No mutationpm=0.1; %Big mutationfor i=1:1:Sizefor j=1:1:2*CodeLtemp=rand;if pm>temp %Mutation Conditionif TempE(i,j)==0TempE(i,j)=1;elseTempE(i,j)=0;endendendend%Guarantee TempPop(30,:) is the code belong to the best individual(max(fi)) TempE(Size,:)=BestS;E=TempE;endMax_Value=BestfiBestSx1x2figure(1);plot(time,BestJ); %目标函数和时间的坐标系xlabel('Times');ylabel('Best J');figure(2);plot(time,bfi);xlabel('times');ylabel('Best F');遗传算法十进制编码求函数极大值程序%Generic Algorithm for function f(x1,x2) optimumclear all;close all;%Parameters参数Size=80;G=100; %迭代次数CodeL=10; %编码长度umax=2.048;umin=-2.048;E=round(rand(Size,2*CodeL)); %Initial Code ???%Main Programfor k=1:1:Gtime(k)=k;for s=1:1:Sizem=E(s,:);y1=0;y2=0;%Uncodingm1=m(1:1:CodeL); %???for i=1:1:CodeLy1=y1+m1(i)*2^(i-1);endx1=(umax-umin)*y1/1023+umin;m2=m(CodeL+1:1:2*CodeL);for i=1:1:CodeLy2=y2+m2(i)*2^(i-1);endx2=(umax-umin)*y2/1023+umin;F(s)=100*(x1^2-x2)^2+(1-x1)^2;endJi=1./F;%****** Step 1 : Evaluate BestJ ****** BestJ(k)=min(Ji);fi=F; %Fitness Function[Oderfi,Indexfi]=sort(fi); %Arranging fi small to biggerBestfi=Oderfi(Size); %Let Bestfi=max(fi)BestS=E(Indexfi(Size),:); %Let BestS=E(m), m is the Indexfi belong to max(fi)bfi(k)=Bestfi;%****** Step 2 : Select and Reproduct Operation******fi_sum=sum(fi);fi_Size=(Oderfi/fi_sum)*Size;fi_S=floor(fi_Size); %Selecting Bigger fi valuekk=1;for i=1:1:Sizefor j=1:1:fi_S(i) %Select and ReproduceTempE(kk,:)=E(Indexfi(i),:);kk=kk+1; %kk is used to reproduceendend%************ Step 3 : Crossover Operation ************ pc=0.60;n=ceil(20*rand);for i=1:2:(Size-1)temp=rand;if pc>temp %Crossover Conditionfor j=n:1:20TempE(i,j)=E(i+1,j);TempE(i+1,j)=E(i,j);endendendTempE(Size,:)=BestS;E=TempE;%************ Step 4: Mutation Operation ************** %pm=0.001;%pm=0.001-[1:1:Size]*(0.001)/Size; %Bigger fi, smaller Pm%pm=0.0; %No mutationpm=0.1; %Big mutationfor i=1:1:Sizefor j=1:1:2*CodeLtemp=rand;if pm>temp %Mutation Conditionif TempE(i,j)==0TempE(i,j)=1;elseTempE(i,j)=0;endendendend%Guarantee TempPop(30,:) is the code belong to the best individual(max(fi)) TempE(Size,:)=BestS;E=TempE;endMax_Value=BestfiBestSx1x2figure(1);plot(time,BestJ);xlabel('Times');ylabel('Best J');figure(2);plot(time,bfi);xlabel('times');ylabel('Best F');思考:通过改变群体大小、终止进化代数G、交叉概率P c和变异概率P m,分析群体大小、终止进化代数、交叉概率和变异概率对优化效果的影响。
利用遗传算法求函数的极大值遗传算法是一种通过模拟生物进化的方式来解决优化问题的算法。
它基于达尔文的演化论思想,通过不断演化和交叉变异,逐步优化解空间中的解向最优解靠拢。
在求解函数的极大值问题中,遗传算法可以通过优化染色体的基因序列来寻找最大值点。
遗传算法的基本流程如下:1.初始化种群:随机生成初始种群,每个个体都对应问题的一个可能解。
2.适应度评估:根据问题的具体要求,计算每个个体的适应度值,即目标函数值。
3.选择操作:根据适应度值选择一定数量的个体作为父代,用于进行交叉和变异操作。
4.交叉操作:从父代中选择两个个体,按照一定的交叉规则对其基因序列进行交叉生成子代。
5.变异操作:对子代的基因序列进行一定概率的变异操作,引入新的基因。
6.新一代种群形成:将父代和子代合并形成新一代种群。
7.终止条件判断:根据设定的终止条件判断是否停止算法。
8.若满足终止条件,输出结果;否则,转至步骤2在求解函数的极大值问题中,适应度评估的目标函数可以直接使用待求解函数的值。
下面以一个简单的函数f(x)=x^2为例,说明如何利用遗传算法求函数的极大值。
1.初始化种群:随机生成一定数量的个体,每个个体的基因序列代表一个可能的解,在本例中基因序列即为x的取值。
2.适应度评估:计算每个个体的适应度,即将基因序列代入目标函数得到函数值。
3.选择操作:根据适应度值选择一定数量的个体作为父代。
4.交叉操作:从父代中选择两个个体,按照一定的交叉规则对其基因序列进行交叉生成子代。
5.变异操作:对子代的基因序列进行一定概率的变异操作,引入新的基因。
6.新一代种群形成:将父代和子代合并形成新一代种群。
7.终止条件判断:根据设定的终止条件判断是否停止算法。
例如,可以设定迭代次数达到一定阈值或者适应度值足够接近最大值。
8.若满足终止条件,输出最优解的基因序列;否则,转至步骤2通过不断迭代上述步骤,遗传算法可以逐步逼近函数的极大值点。
在实际应用中,可以根据问题的具体特性和要求对交叉、变异概率等参数进行调整,以达到更好的求解效果。
matlab遗传算法计算函数区间最大值和最小值下面是用matlab实现遗传算法计算函数区间最大值和最小值的示例代码:首先定义函数(此处以f(x)=x*sin(10*pi*x)+1为例):matlabfunction y = myfun(x)y = x*sin(10*pi*x)+1;end然后设置遗传算法参数:matlaboptions = gaoptimset('Generations', 1000, 'PopulationSize', 50,'StallGenLimit', 200, 'TolCon', 1e-10);其中,Generations表示遗传算法的迭代次数,PopulationSize表示种群大小,StallGenLimit表示在连续多少代没有改变时停止迭代,TolCon表示收敛精度。
接着,编写遗传算法主函数:matlab[x, fval] = ga(@myfun, 1, [], [], [], [], -1, 2, [], [], options);其中,第一个参数为要优化的函数,第二个参数为变量维度,后面的参数为变量的取值范围。
最后,输出结果:matlabfprintf('Function maximum is %f\n',-fval);fprintf('Function minimum is %f\n',fval);其中,-fval表示函数最大值,fval表示函数最小值。
完整代码如下:matlabfunction y = myfun(x)y = x*sin(10*pi*x)+1;endoptions = gaoptimset('Generations', 1000, 'PopulationSize', 50, 'StallGenLimit', 200, 'TolCon', 1e-10);[x, fval] = ga(@myfun, 1, [], [], [], [], -1, 2, [], [], options);fprintf('Function maximum is %f\n',-fval);fprintf('Function minimum is %f\n',fval);参考资料:[1][2]。
算法原理遗传算法可以用来求函数的极值。
(1)用二进制编码来离散自变量,码长根据离散精度来确定。
码长为log 2[max−min 精度+1](2)交叉方法采用单点交叉(3)变异是根据变异概率反转子代某个位的值(4)选择策略采用轮盘赌策略,令PP i =∑p i i j=1,其中PP i 为累计概率,p i 为个体的选择概率,公式为: p i =fitness(x i )∑fitness(x i)NP i=1,其中fitness(x i )为个体的适应度,共轮转NP 次,每次轮转时,产生随机数r ,当PP i−1≤r <PP i 时选择个体i 。
算法步骤基本遗传算法的基本步骤是:1. 随机产生种群,2. 用轮盘赌策略确定个体的适应度,判断是否符合优化准则,若符合,输出最佳个体及其最优解,结束,否则,进行下一步3. 依据适应度选择再生个体,适应度高的个体被选中的概率高,适应度低的个体被淘汰4. 按照一定的交叉概率和交叉方法,生成新的个体5. 按照一定的变异概率和变异方法,生成新的个体6. 由交叉和变异产生新一代种群,返回步骤2算法的实现%基本遗传算法,一维无约束优化function [ xv,fv ] = mGA( fitness,a,b,NP,NG,Pc,Pm,eps )% 待优化的目标函数:fitness% 自变量下界:a% 自变量上界:b% 种群个体数:NP% 最大进化代数:NG% 杂交常数:Pc% 变异常数:Pm% 自变量离散精度:eps% 目标函数取最大值是的自变量值:xv% 目标函数的最小值:fvL=ceil(log2((b-a)/eps+1)); %码长x=zeros(NP,L);for i=1:NPx(i,:)=Initial(L);fx(i)=fitness(Dec(a,b,x(i,:),L));endfor k=1:NGsumfx=sun(fx);Px=fx/sumfx;PPx=0;PPx(1)=Px(1);for i=2:NP %根据轮盘赌确定父亲PPx(i)=PPx(i-1)+PPx(i);endfor i=1:NPsita=rand();for n=1:NPif sita <= PPx(n)SelFather = n;break;endendSelmother=floor(rand()*(NP-1))+1; %随机选择母亲posCut=floor(rand()*(L-2))+1; %随机确定交叉点r1=rand();if r1<=Pcnx(i,1:posCut)=x(SelFather,1:posCut);nx(I,(posCut+1):L)=x(Selmother,(posCut+1):L);r2=rand();if r2<=Pm %变异posMut=round(rand()*(L-1)+1);nx(i,posMut)=~nx(i,posMut);endelsenx(i,:)=x(SelFather,:);endendx=nx;for i=1:NPfx(i)=fitness(Dec(a,b,x(i,:),L);endendfv=-inf;for i=1:NPfitx=fitness(Dec(a,b,x(i,:),L));if fitx > fvfv=fitx;xv=Dec(a,b,x(i,:),L);endendendfunction result=Initial(length) %初始化函数for i=1:lengthr=round();result(i)=round(r);endendfunction y=Dec(a,b,x,L) %二进制转十进制base=2.^((L-1):-1:0);y=dot(base,x);y=a+y*(b-1)/(2^L-1)'end。
利用遗传算法求解函数的最大值蒋赛赵玉芹1 遗传算法的基本原理遗传算法是模拟生物遗传学和自然选择机理,通过人工方式构造的一类优化搜索算法,是对生物进化过程进行的一种数学仿真,是进化计算的一种重要形式。
遗传算法与传统数学模型截然不同,它为那些难以找到传统数学模型的难题找出了一个解决方法。
同时,遗传算法借鉴了生物科学中的某些知识,从而体现了人工智能的这一交叉学科的特点。
遗传算法是一种通用的优化算法,其编码技术和遗传操作比较简单,优化不受限制条件的约束,不需要有先验条件。
其搜索过程是从问题解的一个随机产生的集合开始的,而不是从单个个体开始的,具有隐含并行搜索特性,也就大大减少可陷入局部极小值的可能。
在解决可能在求解过程中产生组合爆炸的问题时会产生很好的效果。
遗传算法需选择一种合适的编码方式表示解, 并选择一种评价函数用来每个解的适应值, 适应值高的解更容易被选中并进行交叉和变异, 然后产生新的子代。
选择、交叉和变异的过程一直循环 , 直到求得满意解或满足其他终止条件为止。
算法的运行过程具有很强的指向性, 适合众多复杂问题的求解。
具体操作步骤如下:1)初始化种群;2)计算种群上每个个体的适应度值;3)按由个体适应度值所决定的某个规则选择将进入下一代的个体进行交叉操作4)按概率PC进行变异操作5)按概率PC6)若没有满足某种停止条件,则转步骤2),否则进入下一步;7)输入种群中适应度值最优的染色体作为问题的满足解或最优解本例运用遗传算法求解函数优化的问题2 遗传求解举例(Rosenbrock函数的全局最大值计算)2.0 求解函数介绍函数f(x1,x2) = 100 (x21-x2)2 + (1-x2)2是非凸函数,又称Rosenbrock函数,是由De Jong提出的,现已成为测试遗传算法的标准函数。
该函数在极小值附近沿曲线x2=x12有陡峭的峡谷,很容易陷入局部极小,它的全局最小点是(1,1),最小值是0.该函数有两个局部极大点,分别是:f(2.048, -2.048)=3897.7342 和 (-2.048,-2.048)=3905.9262其中后者为全局最大值点。
MATLAB遗传⼯具箱ga求函数在某区间最⼤值问题让你求解⼀个⾮线性规划问题的最优解\[y=200\times \exp(-0.05x)\times \sin(x)\\ s.t. \ -2<x<2 \]GA遗传算法,(Genetic Algorithm,GA)是模拟⽣物进化论中⾃然选择和遗传学机理的⽣物进化过程中的计算模型,是⼀种通过模拟⾃然进化过程搜索最优解的⽅法。
它是智能计算技术之⼀。
matlab求解%使⽤matlab遗传算法⼯具箱进⾏计算%参考《智能计算⽅法及其应⽤》国防⼯业出版社clc;close all;clear all;options= optimoptions('ga','PlotFcn',{@ gaplotbestf, @ gaplotbestindiv, @gaplotexpectation ..., @ gaplotstopping});[x,fval,exitflag,output] =ga(@fitnessfun,1,[],[],[],[],[],[],[],options);%x是最优值%fval是最优值适应度%exitflag是算法结束标志%output是输出参数%fitnessfun是适应度函数%nvars是变量的个数function f =fitnessfun(x)if x<-2 | x>2f=150;elsef=-200*exp(-0.05*x)*sin(x);endend每次运⾏的结果不⼀定⼀样,截图⾥的结果显⽰是在x=1.523时y取得最⼤值mma求解参考。
GA包遗传算法最大化使用遗传算法的适应度函数。
默认求最大值。
用法:ga(type = c("binary", "real-valued", "permutation"), fitness, ..., min, max, nBits, population = gaControl(type)population,<br/>selection=gaControl(type)selection, crossover = gaControl(type)crossover,<br/> mutation=gaControl(type)mutation, popSize = 50, pcrossover = 0.8, pmutation = 0.1, elitism = base::max(1, round(popSize*0.05)), maxiter = 100, run = maxiter, maxfitness = Inf, names = NULL, suggestions = NULL, keepBest = FALSE, parallel = FALSE, monitor = gaMonitor, seed = NULL)参数说明•type: 解得编码类型–binary :二进制编码–real-valued:实数浮点编码–permutation:问题涉及到重新排序的列表,字符串编码。
可求解TSP 问题•fitness:适应度函数•min:解得下界(多元变量为一个向量)•max:解得上界(多元变量为一个向量)•nBits:一个种群用二进制编码的长度是多少(长度越大代表精度越高) •population:初始种群•selection:选择•crossover: 交叉•crossover:变异•popsize:种群大小•pcrossover: 交叉概率(默认0.8)•pmutation:变异概率(默认0.1)•elitism: 代沟(默认情况下,前5%个体将在每个迭代中保留)•maxiter:最大迭代次数(默认100)•maxfitness:适应度函数的上界,GA搜索后中断•keepBest:是否保留每一代的最优解•parallel:是否采用并行运算•monitor:绘图用的,监控遗传算法的运行状况•seed:一个整数值包含随机数发生器的状态。
遗传算法求函数极值遗传算法是一种基于模拟生物进化过程的优化算法,它通过模拟生物的进化过程中的遗传、交叉和变异等操作,对问题的解空间进行,并到满足最优条件的解。
它被广泛应用于求解各种复杂问题,包括函数极值问题。
在使用遗传算法求函数极值的过程中,首先需要明确问题的目标函数。
目标函数是一个将自变量映射到一个实数值的函数,它描述了问题的优化目标。
例如,我们可以考虑一个简单的目标函数f(x),其中x表示自变量,f(x)表示因变量。
遗传算法的基本流程如下:1.初始化种群:随机生成一组初始解,也就是种群。
种群中的每个个体都是一个可能的问题解,而个体中的染色体则表示了问题解的具体数值。
2.适应度评估:对于种群中的每个个体,通过计算目标函数的值,评估每个个体的适应度。
适应度越高的个体,越有可能成为下一代个体的基因。
3.选择操作:根据个体的适应度,选择一些个体作为下一代遗传操作的基因。
4.交叉操作:从选择出的个体中随机选择一对个体,进行交叉操作。
交叉操作通过交换两个个体的染色体信息,产生新的个体。
5.变异操作:对交叉操作生成的新个体进行变异操作。
变异操作通过改变个体染色体中的部分基因,引入新的解,以增加问题解的多样性。
6.新种群产生:基于交叉和变异操作,生成新的种群。
7.终止条件判断:如果满足终止条件(例如达到最大迭代次数、找到了满足要求的解等),则停止算法;否则,返回第2步。
通过以上步骤的循环迭代,遗传算法可以到问题的最优解,即函数的极值。
由于遗传算法充分利用了进化算法的生物特点,具有全局能力和自适应优化能力,因此在函数极值求解中得到了广泛的应用。
遗传算法的关键在于如何进行适应度评估、选择操作、交叉操作和变异操作。
适应度评估是指根据目标函数计算个体的适应度值,一般情况下适应度越高的个体越有可能成为下一代的基因。
选择操作可以采用轮盘赌选择、最优选择等方式,根据个体的适应度选择一定数量的个体进行交叉和变异。
交叉操作通过交换染色体信息,产生新的个体;变异操作通过改变个体染色体中的部分基因,引入新的解。
遗传算法求函数最大值(matlab实现)一、题目:寻找f(x)=x2,,当x在0~31区间的最大值。
二、源程序:%遗传算法求解函数最大值%本程序用到了英国谢菲尔德大学(Sheffield)开发的工具箱GATBX,该工具箱比matlab自带的GATOOL使用更加灵活,但在编写程序方面稍微复杂一些Close all;Clear all;figure(1);fplot('variable*variable',[0,31]); %画出函数曲线%以下定义遗传算法参数GTSM=40; %定义个体数目ZDYCDS=20; %定义最大遗传代数EJZWS=5; %定义变量的二进制位数DG=0.9; %定义代沟trace=zeros(2, ZDYCDS); %最优结果的初始值FieldD=[5;-1;2;1;0;1;1]; %定义区域描述器的各个参数%以下为遗传算法基本操作部分,包括创建初始种群、复制、交叉和变异Chrom=crtbp(GTSM, EJZWS); %创建初始种群,即生成给定规模的二进制种群和结构gen=0; %定义代数计数器初始值variable=bs2rv(Chrom, FieldD); %对生成的初始种群进行十进制转换ObjV=variable*variable; %计算目标函数值f(x)=x2 while gen<ZDYCDS %进行循环控制,当当前代数小于定义的最大遗传代数时,继续循环,直至代数等于最大遗传代数FitnV=ranking(-ObjV); %分配适应度值SelCh=select('sus', Chrom, FitnV, DG); %选择,即对个体按照他们的适配值进行复制SelCh=recombin('xovsp', SelCh, 0.7); %交叉,即首先将复制产生的匹配池中的成员随机两两匹配,再进行交叉繁殖SelCh=mut(SelCh); %变异,以一个很小的概率随机地改变一个个体串位的值variable=bs2rv(SelCh, FieldD); %子代个体的十进制转换ObjVSel=variable*variable; %计算子代的目标函数值[Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel);%再插入子代的新种群,其中Chrom为包含当前种群个体的矩阵,SelCh为包好当前种群后代的矩阵variable=bs2rv(Chrom, FieldD); %十进制转换gen=gen+1; %代数计数器增加%输出最优解及其序号,并在目标函数图像中标出,Y为最优解,I 为种群的%序号[Y, I]=max(ObjV);hold on; %求出其最大目标函数值plot(variable(I), Y, 'bo');trace(1, gen)=max(ObjV); %遗传算法性能跟踪trace(2, gen)=sum(ObjV)/length(ObjV);end%以下为结果显示部分,通过上面计算出的数值进行绘图variable=bs2rv(Chrom, FieldD); %最优个体进行十进制转换hold on, grid;plot(variable,ObjV,'b*'); %将结果画出三、运行结果:由图可见该函数为单调递增函数,即当X=31时,该取得最大值f(x)max=961。
遗传算法是一种模拟自然选择和遗传机制的优化搜索算法,它能够通过模拟生物进化的过程来寻找最优解。
在数学和计算领域,遗传算法被广泛应用于求解函数的最大值和最小值问题。
1. 遗传算法的基本原理遗传算法是一种基于裙体的优化算法,它模拟了自然界中的优胜劣汰和随机性变异的过程。
其基本原理包括遗传、变异、选择和适应度评价。
1.1 遗传:遗传算法通过模拟生物的交配过程来产生新的个体,其中将两个个体的染色体交叉并产生新的后代。
1.2 变异:遗传算法引入随机性的变异操作,以增加搜索空间的多样性,使算法不至于陷入局部最优解。
1.3 选择:个体的适应度评价后,根据一定的选择策略选择出部分个体作为下一代的种裙,通常适应度高的个体有更大的概率被选择。
1.4 适应度评价:遗传算法通过适应度函数对个体进行评价,以确定个体在种裙中的适应度。
适应度函数通常是需要优化的函数。
2. 遗传算法在求解函数最大值和最小值问题中的应用遗传算法作为一种全局搜索算法,具有寻找函数最大值和最小值的能力。
对于一个给定的函数,遗传算法能够在较短的时间内找到该函数的全局最优解。
2.1 函数最大值求解:对于函数的最大值求解问题,可以将函数的负值作为适应度函数,通过遗传算法来求解负值最小化的问题,从而达到求解函数最大值的目的。
2.2 函数最小值求解:对于函数的最小值求解问题,则可以直接将函数的值作为适应度函数,通过遗传算法来求解函数最小值问题。
3. 遗传算法在实际应用中的优势遗传算法作为一种全局搜索算法,在求解函数最大值和最小值问题中具有以下优势:3.1 并行性:遗传算法能够并行处理多个个体,从而加速搜索过程,尤其适合于复杂的高维优化问题。
3.2 全局搜索能力:遗传算法不容易陷入局部最优解,能够在较短的时间内找到函数的全局最优解。
3.3 适应性强:遗传算法能够适应不同类型的函数和问题,具有较强的通用性。
4. 遗传算法在求解函数最大值和最小值问题中的应用实例以下是一些实际应用中遗传算法在求解函数最大值和最小值问题中的应用实例:4.1 Rosenbrock函数最小值求解:Rosenbrock函数是一个经典的优化测试函数,遗传算法在求解Rosenbrock函数的最小值时具有良好的表现。
实验五:遗传算法求解函数最值问题实验一、实验目的使用遗传算法求解函数在及y的最大值。
二、实验内容使用遗传算法进行求解,篇末所附源代码中带有算法的详细注释。
算法中涉及不同的参数,参数的取值需要根据实际情况进行设定,下面运行时将给出不同参数的结果对比。
定义整体算法的结束条件为,当种群进化次数达到maxGeneration时停止,此时种群中的最优解即作为算法的最终输出。
设种群规模为N,首先是随机产生N个个体,实验中定义了类型Chromosome表示一个个体,并且在默认构造函数中即进行了随机的操作。
然后程序进行若干次的迭代,在每次迭代过程中,进行选择、交叉及变异三个操作。
1.选择操作首先计算当前每个个体的适应度函数值,这里的适应度函数即为所要求的优化函数,然后归一化求得每个个体选中的概率,然后用轮盘赌的方法以允许重复的方式选择选择N个个体,即为选择之后的群体。
但实验时发现结果不好,经过仔细研究之后发现,这里在x、y 取某些值的时候,目标函数计算出来的适应值可能会出现负值,这时如果按照把每个个体的适应值除以适应值的总和的进行归一化的话会出现问题,因为个体可能出现负值,总和也可能出现负值,如果归一化的时候除以了一个负值,选择时就会选择一些不良的个体,对实验结果造成影响。
对于这个问题,我把适应度函数定为目标函数的函数值加一个正数,保证得到的适应值为正数,然后再进行一般的归一化和选择的操作。
实验结果表明,之前的实验结果很不稳定,修正后的结果比较稳定,趋于最大值。
2.交叉操作首先是根据交叉概率probCross选择要交叉的个体进行交叉。
这里根据交叉参数crossnum进行多点交叉,首先随机生成交叉点位置,允许交叉点重合,两个重合的交叉点效果互相抵消,相当于没有交叉点,然后根据交叉点进行交叉操作,得到新的个体。
3.变异操作首先是根据变异概率probMutation选择要变异的个体。
变异时先随机生成变异的位置,然后把改位的01值翻转。
主程序%% GAclc % 清屏clear all;%删除workplace变量close all; % 关掉显示图形窗口warning off%% 参数初始化popsize=100; %种群规模lenchrom=7;%变量字串长度pc=0。
7;%设置交叉概率,本例中交叉概率是定值,若想设置变化的交叉概率可用表达式表示,或从写一个交叉概率函数,例如用神经网络训练得到的值作为交叉概率pm=0。
3;%设置变异概率,同理也可设置为变化的maxgen=100; % 进化次数%种群popmax=50;popmin=0;bound=[popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax]; %变量范围%%产生初始粒子和速度for i=1:popsize%随机产生一个种群GApop(i,:)=Code(lenchrom,bound); %随机产生个体%计算适应度fitness(i)=fun(GApop(i,:)); %染色体的适应度end%找最好的染色体[bestfitness bestindex]=min(fitness);zbest=GApop(bestindex,:); %全局最佳gbest=GApop; %个体最佳fitnessgbest=fitness; %个体最佳适应度值fitnesszbest=bestfitness; %全局最佳适应度值%% 迭代寻优for i=1:maxgeni%种群更新 GA选择更新GApop=Select2(GApop,fitness,popsize);%交叉操作 GAGApop=Cross(pc,lenchrom,GApop,popsize,bound);%变异操作 GA变异GApop=Mutation(pm,lenchrom,GApop,popsize,[i maxgen],bound);pop=GApop;for j=1:popsize%适应度值if 0.072*pop(j,1)+0.063*pop(j,2)+0.057*pop(j,3)+0。
GA遗传算法概述1.初始化种群:通过随机生成的方式,创建一个原始的解空间种群。
种群中的每个个体即为一个解的候选解。
初始种群的大小可以根据问题的复杂程度和计算资源来决定。
2.评估适应度:对每个个体进行适应度评估,这个评估函数可以根据问题的特点来设计。
适应度函数通常将问题的目标函数作为评估指标,用来度量个体的适应度。
3.选择操作:根据适应度值,选择一部分个体作为父代,并生成下一代的种群。
选择操作一般通过轮盘赌算法,按照每个个体的适应度值来决定其被选中的概率。
4.交叉操作:对选出的父代个体进行交叉操作,生成新的子代个体。
交叉操作通过模拟生物的基因组合与变异的过程,将两个或多个父代个体的染色体片段进行交叉,并产生新的染色体。
5.变异操作:对新的子代个体进行变异操作,引入一定的随机性,以增加解空间的能力。
变异操作比交叉操作更为随机,可以对染色体的一些基因进行改变。
6.重复以上步骤:通过多次迭代,不断优化种群中的个体,直至达到满足终止条件为止。
终止条件可以是达到最大迭代次数,或者满足特定的目标条件等。
GA遗传算法的主要优点是能够在较短的时间内找到问题的近似最优解,对于解空间复杂、目标函数非线性等问题具有较好的能力。
但是,由于遗传算法是一种随机算法,其结果可能无法完全符合问题的要求,需要在实际问题中进行调整和改进。
在实际应用中,GA遗传算法已广泛应用于组合优化问题、函数优化问题、调度问题等领域。
例如,在组合优化问题中,GA遗传算法可用于求解旅行商问题(TSP)以及图着色问题。
在函数优化问题中,GA遗传算法可以利用模拟进化的方式求解函数的最大值或最小值。
在调度问题中,GA遗传算法可以用于求解生产调度、车辆路径规划等问题。
总而言之,GA遗传算法通过模拟自然进化过程,通过遗传、交叉和变异等操作机制来解空间中的最优解。
它是一种强大的优化算法,可以应用于多领域的问题求解中。
虽然其结果可能不是绝对的最优解,但可以在实际问题中取得较好的效果。
遗传算法详解(GA)(个人觉得很形象,很适合初学者)2016年04月18日11:22:20 boat_lee 阅读数:150199版权声明:欢迎访问,欢迎讨论,拒绝抄袭!https:///u010451580/article/details/51178225本文是去年课题组周报中的一个专题讲解,详细讲了GA,由于是周报,所以十分详细。
很适合初学者入门。
文中也简单提及了模拟退火算法。
文章综合参考了一些互联网资料。
发博客以备忘!三:遗传算法照例先给出科学定义:遗传算法(Genetic Algorithm, GA)起源于对生物系统所进行的计算机模拟研究。
它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,借鉴了达尔文的进化论和孟德尔的遗传学说。
其本质是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解。
再给出相关术语:(各位看看就好,后面都会涉及到,再细说)基因型(genotype):性状染色体的内部表现;表现型(phenotype):染色体决定的性状的外部表现,或者说,根据基因型形成的个体的外部表现;进化(evolution):种群逐渐适应生存环境,品质不断得到改良。
生物的进化是以种群的形式进行的。
适应度(fitness):度量某个物种对于生存环境的适应程度。
选择(selection):以一定的概率从种群中选择若干个个体。
一般,选择过程是一种基于适应度的优胜劣汰的过程。
复制(reproduction):细胞分裂时,遗传物质DNA通过复制而转移到新产生的细胞中,新细胞就继承了旧细胞的基因。
交叉(crossover):两个染色体的某一相同位置处DNA被切断,前后两串分别交叉组合形成两个新的染色体。
也称基因重组或杂交;变异(mutation):复制时可能(很小的概率)产生某些复制差错,变异产生新的染色体,表现出新的性状。
编码(coding):DNA中遗传信息在一个长链上按一定的模式排列。
1、利用遗传算法求出下面函数的极小值:z=2-exp[-(x2+y2)], x,y∈[-5,+5]对于此函数,求某一极值、或说最值时,由于x、y定义域与系数相同,x与y相对于z 来说是地位等同的,因此可以转换成求该函数极值:;继而转换成了一种单变量函数。
函数的实现:(1)ga_main脚本文件% GA main program% Edited by Bian Xuezi% n ---- 种群规模% ger ---- 迭代次数% pc ---- 交叉概率% pm ---- 变异概率% v ---- 初始种群(规模为n)% f ---- 目标函数值% fit ---- 适应度向量% vx ---- 最优适应度值向量% vmfit ---- 平均适应度值向量clear all;close all;clc;tic;n=20;ger=100;pc=0.70;pm=0.009;% 生成初始种群v=init_population(n,20);[N,L]=size(v);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)); % 待优化问题xmin=-5;ymin=-5;xmax=5;ymax=5;f='-2+exp(-x.^2-y.^2)';%初始化sol=0.1;vmfit=[];it=1;vx=[];%C=[];% 计算适应度,并画出图形x=decode(v(:,1:10),xmin,xmax);y=decode(v(:,11:20),ymin,ymax);fit=eval(f);figure(1);[X,Y]=meshgrid(-5:0.1:5,-5:0.1:5);Z=-2+exp(-X.^2-Y.^2);mesh(X,Y,Z);grid on;hold on;plot3(x,y,fit,'k*');title('染色体的初始位置');xlabel('x');ylabel('y');zlabel('f(x,y)');% 开始进化while it<=ger%Reproduction(Bi-classist Selection) vtemp=roulette(v,fit);%Crossoverv=crossover(vtemp,pc);%MutationM=rand(N,L)<=pm;%M(1,:)=zeros(1,L);v=v-2.*(v.*M)+M;%Resultsx=decode(v(:,1:10),xmin,xmax);y=decode(v(:,11:20),ymin,ymax);fit=eval(f);[sol,indb]=max(fit);v(1,:)=v(indb,:);media=mean(fit);vx=[vx sol];vmfit=[vmfit media];it=it+1;end%%%% 最后的结果disp(sprintf('\n')); %空一行% 显示最优解及最优值disp(sprintf('Maximum found[x,f(x)]:[%.4f,%.4f,%.4f]',x(indb),y(indb),sol)); % 图形显示最优结果figure(2);[X,Y]=meshgrid(-5:0.1:5,-5:0.1:5);Z=-2+exp(-X.^2-Y.^2);mesh(X,Y,Z);grid on;hold on;plot3(x,y,fit,'k*');title('染色体的最终位置');xlabel('x');ylabel('y');zlabel('f(x,y)');% 图形显示最优及平均函数值变化趋势figure(3);plot(vx);%title('最优,平均函数值变化趋势'); xlabel('Generations');ylabel('f(x,y)');hold on;plot(vmfit,'r');hold off;runtime=toc(2)Crossover函数%Crossoverfunction v=crossover(vtemp,pc) [N,L]=size(vtemp);C(:,1)=rand(N,1)<=pc;I=find(C(:,1)==1);I';j=1;for i=1:2:size(I)if i>=size(I)break;endsite=fix(1+L*rand(1));temp=vtemp(I(i,1),:);vtemp(I(i,1),site:end)=vtemp(I(i+1,1),site:end); vtemp(I(i+1,1),site:end)=temp(:,site:end);%j=j+2;endv=vtemp;(3)decode函数%Decodify bitstringsfunction x=decode(v,min,max)% x ----真实值% v ----待解码的已编码的0-1串v=fliplr(v);[s,c]=size(v);aux=0:1:c-1 ;%21;aux=ones(s(1),1)*aux;x1=sum((v.*2.^aux)');x=min+(max-min)*x1./(2^c-1); % ; (4)init_population函数function v=init_population(n1,s1)v=round(rand(n1,s1));(5)roulette函数function vtemp=roulette(v,fit)N=size(v);fitmin=abs(min(fit));fit=fitmin+fit;%fitS=sum(fit);for i=1:NSI=S*rand(1);for j=1:Nif SI<=sum(fit(1:j))vtemp(i,:)=v(j,:);breakendendend。
主程序%% GAclc % 清屏clear all; % 删除workplace变量close all; % 关掉显示图形窗口warning off%% 参数初始化popsize=100; %种群规模lenchrom=7; %变量字串长度pc=0.7; %设置交叉概率,本例中交叉概率是定值,若想设置变化的交叉概率可用表达式表示,或从写一个交叉概率函数,例如用神经网络训练得到的值作为交叉概率pm=0.3; %设置变异概率,同理也可设置为变化的maxgen=100; % 进化次数%种群popmax=50;popmin=0;bound=[popminpopmax;popminpopmax;popminpopmax;popminpopmax;popminpopmax;popminpopmax;popm inpopmax]; %变量范围%% 产生初始粒子和速度fori=1:popsize%随机产生一个种群GApop(i,:)=Code(lenchrom,bound); %随机产生个体%计算适应度fitness(i)=fun(GApop(i,:)); %染色体的适应度end%找最好的染色体[bestfitnessbestindex]=min(fitness);zbest=GApop(bestindex,:); %全局最佳gbest=GApop; %个体最佳fitnessgbest=fitness; %个体最佳适应度值fitnesszbest=bestfitness; %全局最佳适应度值%% 迭代寻优fori=1:maxgeni%种群更新GA选择更新GApop=Select2(GApop,fitness,popsize);% 交叉操作GAGApop=Cross(pc,lenchrom,GApop,popsize,bound);% 变异操作GA变异GApop=Mutation(pm,lenchrom,GApop,popsize,[imaxgen],bound);pop=GApop;for j=1:popsize%适应度值if0.072*pop(j,1)+0.063*pop(j,2)+0.057*pop(j,3)+0.05*pop(j,4)+0.032*pop(j,5)+0.0442*pop(j,6)+0.0675*pop(j,7) <=264.4if128*pop(j,1)+78.1*pop(j,2)+64.1*pop(j,3)+43*pop(j,4)+58.1*pop(j,5)+36.9*pop(j,6)+50.5*pop(j,7)<=69719 fitness(j)=fun(pop(j,:));endend%个体最优更新if fitness(j) <fitnessgbest(j)gbest(j,:) = pop(j,:);fitnessgbest(j) = fitness(j);end%群体最优更新if fitness(j) <fitnesszbestzbest = pop(j,:);fitnesszbest = fitness(j);endendyy(i)=fitnesszbest;end%% 结果disp '*************best particle number****************'zbest%%plot(yy,'linewidth',2);title(['适应度曲线' '终止代数=' num2str(maxgen)]);xlabel('进化代数');ylabel('适应度');grid on子程序funfunction y = fun(x)y=0.072*x(1)+0.063*x(2)+0.057*x(3)+0.05*x(4)+0.032*x(5)+0.0442*x(6)+0.0675*x(7);Mutationfunction ret=Mutation(pmutation,lenchrom,chrom,sizepop,pop,bound)% 本函数完成变异操作% pcorss input : 变异概率% lenchrom input : 染色体长度% chrom input : 染色体群% sizepop input : 种群规模% pop input : 当前种群的进化代数和最大的进化代数信息% ret output : 变异后的染色体fori=1:sizepop% 随机选择一个染色体进行变异pick=rand;while pick==0pick=rand;endindex=ceil(pick*sizepop);% 变异概率决定该轮循环是否进行变异pick=rand;if pick>pmutationcontinue;endflag=0;while flag==0% 变异位置pick=rand;while pick==0pick=rand;endpos=ceil(pick*sum(lenchrom)); %随机选择了染色体变异的位置,即选择了第pos个变量进行变异v=chrom(i,pos);v1=v-bound(pos,1);v2=bound(pos,2)-v;pick=rand; %变异开始if pick>0.5delta=v2*(1-pick^((1-pop(1)/pop(2))^2));chrom(i,pos)=v+delta;elsedelta=v1*(1-pick^((1-pop(1)/pop(2))^2));chrom(i,pos)=v-delta;end %变异结束flag=test(lenchrom,bound,chrom(i,:)); %检验染色体的可行性endendret=chrom;Crossfunction ret=Cross(pcross,lenchrom,chrom,sizepop,bound)%本函数完成交叉操作% pcorss input : 交叉概率% lenchrom input : 染色体的长度% chrom input : 染色体群% sizepop input : 种群规模% ret output : 交叉后的染色体fori=1:sizepop% 随机选择两个染色体进行交叉pick=rand(1,2);while prod(pick)==0pick=rand(1,2);endindex=ceil(pick.*sizepop);% 交叉概率决定是否进行交叉pick=rand;while pick==0pick=rand;endif pick>pcrosscontinue;endflag=0;while flag==0% 随机选择交叉位置pick=rand;while pick==0pick=rand;endpos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同pick=rand; %交叉开始v1=chrom(index(1),pos);v2=chrom(index(2),pos);chrom(index(1),pos)=pick*v2+(1-pick)*v1;chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束flag1=test(lenchrom,bound,chrom(index(1),:)); %检验染色体1的可行性flag2=test(lenchrom,bound,chrom(index(2),:)); %检验染色体2的可行性if flag1*flag2==0flag=0;else flag=1;end %如果两个染色体不是都可行,则重新交叉endendret=chrom;Codefunction ret=Code(lenchrom,bound)%本函数将变量编码成染色体,用于随机初始化一个种群% lenchrom input : 染色体长度% bound input : 变量的取值范围% ret output: 染色体的编码值flag=0;while flag==0pick=rand(1,lenchrom);ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %线性插值flag=test(lenchrom,bound,ret); %检验染色体的可行性endSelect2function ret=Select(individuals,fitness,sizepop)% 本函数对每一代种群中的染色体进行选择,以进行后面的交叉和变异% individuals input : 种群信息% fitness input : 适应度% sizepop input : 种群规模% opts input : 选择方法的选择% ret output : 经过选择后的种群fitness= 1./(fitness);sumfitness=sum(fitness);sumf=fitness./sumfitness;index=[];for i=1:sizepop %转sizepop次轮盘pick=rand;while pick==0pick=rand;endfor j=1:sizepoppick=pick-sumf(j);if pick<0index=[index j];break; %寻找落入的区间,此次转轮盘选中了染色体i,注意:在转sizepop次轮盘的过程中,有可能会重复选择某些染色体endendendindividuals=individuals(index,:);fitness=fitness(index);ret=individuals;testfunction flag=test(lenchrom,bound,code)% lenchrom input : 染色体长度% bound input : 变量的取值范围% code output: 染色体的编码值flag=1;[n,m]=size(code);fori=1:nif code(i)<bound(i,1) || code(i)>bound(i,2)flag=0;endend。