遗传算法求函数极值
利用遗传算法求函数的极大值

利用遗传算法求函数的极大值该函数有两个局部极大值点,分别是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通过不断迭代上述步骤,遗传算法可以逐步逼近函数的极大值点。
在实际应用中,可以根据问题的具体特性和要求对交叉、变异概率等参数进行调整,以达到更好的求解效果。
遗传算法GA求解函数极值

主程序%% 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。
利用遗传算法求rosenbrock函数的极大值

利用遗传算法求rosenbrock函数的极大值遗传算法是一种常用于解决复杂问题的机器学习算法,而Rosenbrock函数是一种特殊的二叉搜索树函数,它在搜索树中找到了一组最优解,并且能够保持这些最优解的稳定性。
因此,Rosenbrock函数的极大值是搜索树中的一个重要问题。
为了求解Rosenbrock函数的极大值,可以使用遗传算法来解决。
遗传算法的基本思想是通过随机化交配和自然选择来改进算法的性能。
在遗传算法中,每个个体都是随机生成的,并且每个决策变量和变异体都对应着不同的搜索树结构和策略。
然后,通过交叉和变异操作,算法不断迭代,直到达到最优解。
对于Rosenbrock函数的极大值问题,我们可以将搜索树看作是一个二叉搜索树,并且通过计算每个节点的Rosenbrock函数值来确定搜索树的根节点的值。
具体来说,我们可以将搜索树分成两个子搜索树,一个子搜索树是Rosenbrock函数的极大值所在的子搜索树,另一个子搜索树是搜索树中任意一个节点的Rosenbrock函数的极大值所在的子搜索树。
在求解Rosenbrock函数的极大值问题时,我们可以使用经典的遗传算法求解步骤。
首先,初始化所有个体的值,然后随机生成所有个体的变异体。
接着,计算每个个体的父节点的值,并将这些父节点的值作为个体的变异系数。
然后,计算每个个体的交叉子节点的值,并将这些交叉子节点的值作为个体的变异系数。
最后,根据交叉和变异操作的结果,不断迭代,直到达到最优解。
需要注意的是,在遗传算法中,每个个体的值是由所有个体的值和变异系数计算得到的。
因此,在计算每个个体的值时,需要考虑到所有个体的值和变异系数。
此外,在计算交叉和变异操作的结果时,需要考虑到所有个体的值和变异系数。
利用遗传算法求解Rosenbrock函数的极大值问题是一种有效的方法,可以高效地求解这个问题。
此外,遗传算法还可以应用于其他搜索树的求解问题,如最小生成树、最短路径问题等。
遗传算法用matlab求函数极大值

遗传算法用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。
遗传算法求函数极大值(matlab实现)

遗传算法求函数最大值(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。
实验五:遗传算法求解函数最值问题实验

实验五:遗传算法求解函数最值问题实验实验五:遗传算法求解函数最值问题实验一、实验目的使用遗传算法求解函数f优y)=x*sin(6*y)+y*cos(8*x)在m及yDll的最大值。
使用遗传算法进行求解,篇末所附源代码中带有算法的详细注释。
算法中涉及不同的参数,参数的取值需要根据实际情况进行设定,F面运行时将给出不同参数的结果对比。
//参数constintN-2种群的个休数constintlen=30;每个个体的染色体的长度,xffiyS占一半constintcrossnum=4;交叉操作B孩点交叉曲支叉点个数constintmaxGeneration=19000;//最大进化代^constdoubleprobCross=9.85;//概率constdoubleprobMutation-15;//豈异IK率定义整体算法的结束条件为,当种群进化次数达到maxGeneration时停止,此时种群中的最优解即作为算法的最终输出。
//融饶for(intg=0jgmaxGeneration;g++)(设种群规模为N,首先是随机产生N个个体,实验中定义了类型Chromosome表示一个个体,并且在默认构造函数中即进行了随机的操作。
//初始化种群for(inti=0;iN;i++)grcup[i]=Chrcmc50me();实验内容然后程序进行若干次的迭代,在每次迭代过程中,进行选择、交叉及变异三个操作。
1选择操作首先计算当前每个个体的适应度函数值,这里的适应度函数即为所要求的优化函数,然后归一化求得每个个体选中的概率,然后用轮盘赌的方法以允许重复的方式选择选择N个个体,即为选择之后的群体。
//选择操作Elvoidselect(匚hromosoraegroup[mxn])计算每个个体的询?概率doublefitnessVal[mxn];for(inti=ii++)0;//使用轮蛊賭算法困环体doublerandNum=randoiT01();intj;for(j-B;jN-1;j++)if(randNump rab[j])selectld[i]*j;break;(jN-1)selectld[i]=j;//把种群更新为新选挥的个体集合for(inti=0;itemGroup[i]=g^oup[i]for(intift;igroup[i]=temOrc upfselectId[i]];但实验时发现结果不好,经过仔细研究之后发现,这里在取某些值的时候,目标函数计算出来的适应值可能会出现负值,这时如果按照把每个个体的适应值除以适应值的总和的进行归一化的话会出现问题,因为个体可能出现负值,总和也可能出现负值,如果归一化的时候除以了一个负值,选择时就会选择一些不良的个体,对实验结果造成影响。
遗传算法求多元函数的极值

遗传算法求多元函数的极值
遗传算法是一种基于生物进化理论的优化算法,可以用来求解多元函数的极值。
下面介绍遗传算法求解多元函数极值的基本流程:
确定目标函数:首先需要确定待优化的目标函数,将其转化为一个优化问题。
确定变量范围和初始种群:对于每个变量,需要确定其可行域范围,并生成一个随机的初始种群。
适应度函数的定义:根据目标函数确定适应度函数,并将其作为评估个体优劣的标准。
选择操作:选择操作是遗传算法的核心,通过适应度函数选择个体,以保留优良个体。
遗传操作:包括交叉和变异两种操作。
交叉操作是指将两个个体的染色体部分进行交换,从而产生新个体;变异操作是指对某个个体的染色体部分进行随机变换,从而产生新个体。
繁殖新种群:通过选择和遗传操作,生成新的种群,并根据适应度函数进行排序。
判断停止条件:根据实际情况设定停止条件,如达到最大迭代次数、收敛到一定程度等。
输出结果:在满足停止条件后,输出当前最优解和最优适应度值。
需要注意的是,遗传算法求解多元函数极值需要根据实际情况调整参数和优化算法流程,以达到最优结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
智能优化算法第一次作业--------------遗传算法洪文杰 S151000853 问题:用遗传算法求解f(x)=xsin(10π*x)+2.0的最大值,x取[-1,2].一、分析:遗传算法基本思路二、实例简介1. 产生初始种群s1= 13 (01101)s2= 24 (11000)s3= 8 (01000)s4= 19 (10011)2. 计算适应度假定适应度为f(s)=s^2 ,则f (s1) = f(13) = 13^2 = 169 f (s2) = f(24) = 24^2 = 576 f (s3) = f(8) = 8^2 = 64f (s4) = f(19) = 19^2 = 3613.选择染色体的选择概率为:染色体的累计概率为:根据上面的式子,可得到:例如设从区间[0, 1]中产生4个随机数: r1 = 0.450126, r2 = 0.110347r3 = 0.572496, r4 = 0.985034. 交叉基本遗传算法(SGA)中交叉算子采用单点交叉算子。
单点交叉运算5.变异6.至下一代,适应度计算→选择→交叉→变异,直至满足终止条件三、解决问题四、实验结果源代码:/*问题:用遗传算法求解f(x)=xsin(10π*x)+2.0的最大值,x取[-1,2].*/ /*洪文杰 2016-3-9. 智能优化算法第一次作业*/#include<iostream>//#includ<stdio.h>#include<stdlib.h>#include<math.h>#include<time.h>#include<float.h>using namespace std;#define NUMBER 50//种群规模#define GENE_NUMBER 10000//迭代次数int Unit[NUMBER][30];//初始种群int Unit_choose[NUMBER][30];//选择、交叉、变异后的种群int Number[NUMBER];//被选择的个体编号float Fitness[NUMBER];//适应度float select_probability[NUMBER];//选择概率float accumula_probability[NUMBER] ;//积累概率float f_max=0.0;//最大值float f_x=0.0;//最大值对应的自变量int hwj_coding(int start,int end);//编码void hwj_initial_population(int num);//产生初始种群void hwj_fitness(int num);//适应度计算void hwj_choose();//选择个体int hwj_binary_search(int l, int r,float temp);//查找选择//void hwj_N_M(int a[],int b[],int N, int M);//从M个数中选N个不一样的数void hwj_cross(int num,float cross);//交叉后的得到种群void hwj_aberrance(int num,float aberrance);//变异后的得到的种群void hwj_max(int num);//找到最适应的个体int main(){int strat,end;//区间int Num;//编码大小float cross=0.8;//交叉概率float aberrance = 0.04;//变异概率int key=1;cout<<"请输入求解区间:"<<endl;cin>>strat>>end;Num=hwj_coding(strat,end);cout<<"Num:"<<Num<<endl;// cout<<"--------------------------1-----------------"<<endl;hwj_initial_population(Num);// cout<<"--------------------------2初始种群-----------------"<<endl;/* for(int i=0;i<NUMBER;i++){for(int j=0;j<Num;j++){cout<<Unit[i][j]<<' ';}cout<<endl;}*/while(key!=GENE_NUMBER){hwj_fitness(Num);// cout<<"--------------------------3适应度-----------------"<<endl;// for(int i=0;i<NUMBER;i++){// cout<<Fitness[i]<<endl;// }hwj_choose();// cout<<"--------------------------4被选择的个体-----------------"<<endl; /* for(int i=0;i<NUMBER;i++){for(int j=0;j<Num;j++){cout<<Unit_choose[i][j]<<' ';}cout<<endl;}*/hwj_cross(Num,cross);/* cout<<"--------------------------5交叉后的种群-----------------"<<endl;for(int i=0;i<NUMBER;i++){for(int j=0;j<Num;j++){cout<<Unit[i][j]<<' ';}cout<<endl;}*/hwj_aberrance(Num,aberrance);/* cout<<"--------------------------6变异后的种群-----------------"<<endl;for(int i=0;i<NUMBER;i++){for(int j=0;j<Num;j++){cout<<Unit[i][j]<<' ';}cout<<endl;}*/key++;hwj_max(Num);}cout<<"最大值是对应的x值是:"<<endl;cout<<f_x<<endl;cout<<"最大值为:"<<f_max<<endl;return 0;}int hwj_coding(int start,int end){//种群编码float precision;int temp=2;int sum;int N=1;cout<<"请输入精度范围:"<<endl;cin>>precision;if(precision==0){cout<<"对不起精度不能为零:"<<endl;return 0;}else{sum=(end-start)/precision;cout<<"sum:"<<sum<<endl;while(temp<sum){temp*=2;N++;}return N;}}void hwj_initial_population(int num){//生成初始种群srand(time(NULL));for(int i=0;i<NUMBER;i++){for(int j=0;j<num;j++){Unit[i][j]=rand()%2;}}}void hwj_fitness(int num){//计算适应度float sum;int temp;for(int i=0;i<NUMBER;i++){temp=1;sum=0.0;for(int j=num-1;j>=0;j--){sum+=Unit[i][j]*temp;temp*=2.0;}Fitness[i]=sum*3/(temp-1.0)-1.0;// cout<<Fitness[i];// cout<<"--------------+++++";Fitness[i]=Fitness[i]*sin(10*3.1415926*Fitness[i])+2.0;// cout<<Fitness[i]<<endl;}}int hwj_binary_search(int l,int r,float temp){for(int i=0;i<NUMBER;i++){if(temp<=accumula_probability[i]&&temp>accumula_probability[i-1]){ return i;}}return -1;}void hwj_choose(){//选择个体float sum=0.0;float temp;int i;for(i=0;i<NUMBER;i++){sum+=Fitness[i];}select_probability[0]=Fitness[0]/sum;temp=accumula_probability[0]=select_probability[0];for(i=1;i<NUMBER;i++){select_probability[i]=Fitness[i]/sum;temp+=select_probability[i];accumula_probability[i]=temp;// cout<<accumula_probability[i]<<endl;}for(i=0;i<NUMBER;i++){// srand(time(NULL));temp=(rand()%1000000)/1000000.0;// cout<<temp;Number[i]=hwj_binary_search(0,NUMBER,temp);// cout<<Number[i]<<endl;for(int j=0;j<NUMBER;j++){Unit_choose[i][j]=Unit[Number[i]][j];}}}/*void hwj_N_M(int a[],int b[],int N,int M){//从M个数中选N个不一样的数 int i=1;srand(time(NULL));a[0]=rand()%M;b[a[0]]=1;while(i!=N){a[i]=rand()%M;if(b[a[i]]==0){i++;b[a[i]]=1;cout<<a[i]<<endl;}}// cout<<a[i]<<' '<<b[a[i]]<<endl;}*/void hwj_cross(int num,float cross){//交叉后的得到种群int num_cross=NUMBER*cross;int k;//交叉点int i , j;if(num_cross%2!=0){num_cross=num_cross+1;}//需要交叉的个体数int cro[NUMBER];//被交叉的个体编号int temp[NUMBER];//是否交叉数组一览for(i=0;i<NUMBER;i++){cro[i]=-1;temp[i]=0;}// hwj_N_M(cro,temp,num_cross,NUMBER);srand(time(NULL));cro[0]=rand()%NUMBER;temp[cro[0]]=1;i=1;while(i!=num_cross){cro[i]=rand()%NUMBER;if(temp[cro[i]]==0){temp[cro[i]]=1;i++;}}// for(int i=0;i<NUMBER;i++){// cout<<temp[i]<<" "<<cro[i]<<endl;// }// cout<<num_cross<<endl;for(i=0;i<num_cross/2;i++){srand(time(NULL));k=rand()%num;for(j=0;j<num;j++){if(j<=k){Unit[i][j]=Unit_choose[cro[num_cross-i]][j];Unit[i+num_cross/2][j]=Unit_choose[cro[i]][j];}else{Unit[i][j]=Unit_choose[cro[i]][j];Unit[i+num_cross/2][j]=Unit_choose[cro[i]][j];}}}for(i=0;i<NUMBER;i++){// cout<<temp[i]<<endl;if(temp[i]==0){for(j=0;j<num;j++){Unit[num_cross][j]=Unit_choose[i][j];}num_cross++;}}}void hwj_aberrance(int num,float aberrance){//变异后的得到的种群int num_aberrance=NUMBER*aberrance;//变异的个体数int k;//变异点int abe[NUMBER];//变异的个体编号int temp[NUMBER];//是否变异数组一览int i,j,p;for(i=0;i<NUMBER;i++){abe[i]=-1;temp[i]=0;}// hwj_N_M(cro,temp,num_cross,NUMBER);srand(time(NULL));abe[0]=rand()%NUMBER;temp[abe[0]]=1;i=1;while(i!=num_aberrance){abe[i]=rand()%NUMBER;if(temp[abe[i]]==0){temp[abe[i]]=1;i++;}}for( i=0;i<NUMBER;i++){for( j=0;j<num_aberrance;j++){if(i==abe[j]){k=rand()%num;for( p=0;p<num;p++){if(p==k){if(Unit[i][p]==1){Unit[i][p]==0;}else{Unit[i][p]==1;}}}}}}}void hwj_max(int num){hwj_fitness(num);// float max=0.0;int i;int temp=1;float sum=0.0;int k;for(i=0;i<NUMBER;i++){// cout<<Fitness[i]<<endl;if(Fitness[i]>f_max){f_max=Fitness[i];k=i;}}for(int j=num-1;j>=0;j--){sum+=Unit[k][j]*temp;temp*=2.0;}f_x=sum*3/(temp-1.0)-1.0;}Welcome !!! 欢迎您的下载,资料仅供参考!。