遗传算法十进制编码求函数极大值程序
利用遗传算法求函数的极大值

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

遗传算法求函数最大值实验报告遗传算法是一种模拟自然界进化过程的优化算法,它通过模拟生物进化过程中的遗传、交叉和变异等机制,逐步优化解空间中的个体,以找到问题的最优解。
在本次实验中,我们利用遗传算法来求解一个函数的最大值。
下面我们将详细介绍实验的过程和结果。
首先,我们选择了一个简单的函数作为实验对象,即f(x) = x^2,在x的范围为[-10, 10]。
我们的目标是找到使函数值最大的x。
首先,我们需要定义遗传算法中的基本元素,包括编码方式、适应度函数、选择策略、交叉和变异操作等。
在本实验中,我们选择二进制编码方式,将x的范围[-10, 10]离散化为10位的二进制编码。
适应度函数即为f(x) = x^2,它表示个体的适应度。
选择策略采用轮盘赌选择算法,交叉操作采用单点交叉,变异操作采用随机位变异。
接下来,我们需要初始化种群,并迭代进行交叉和变异操作,直到满足终止条件。
在每一代中,我们根据适应度函数对种群中的个体进行评估,并根据选择策略选择父代个体进行交叉和变异操作。
通过交叉和变异操作,产生新的子代个体,并替代原有种群中的个体。
在本次实验中,我们设置了100个个体的种群,并进行了100代的迭代。
实验结果显示,经过多次迭代,算法逐渐优化到了最优解。
最终找到了使函数值最大的x,即x=10,对应的函数值为100。
总结起来,本次实验利用遗传算法求解函数的最大值,展示了遗传算法在优化问题中的应用。
通过适当选择编码方式、适应度函数和操作策略,我们可以有效地找到问题的最优解。
在后续的研究中,我们可以进一步探索遗传算法在更复杂问题上的应用,并通过改进算法的参数和操作策略来提高算法的性能。
matlab遗传算法计算函数区间最大值和最小值

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]。
遗传算法用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。
编程实现利用遗传算法求解方程最值

编程实现利用遗传算法求解方程最值一.函数为:求函数y=x+3*sin(2*x)-7*cos(x) 在【-4 4】的最大值二.MATLAB 程序如下:1.主控制程序GA.m%求函数y=x+3*sin(2*x)-7*cos(x) 在【-4 4】的最大值%function main()clearclcpopsize=100chromlength=10pc=0.6pm=0.01%%pop=initpop(popsize,chromlength)for i=1:100[objvalue]=calobjvalue(pop)fitvalue=calfitvalue(objvalue)[newpop]=selection(pop,fitvalue)%选择操作[newpop]=crossover(pop,pc)%交叉操作[newpop]=mutation(pop,pm)%变异操作[bestindividaul,bestfit]=best(pop,fitvalue)%求出群体中适应值最大的个体及其适应值y(i)=max(bestfit)n(i)=ipop5=bestindividaulx(i)=decodechrom(pop5,1,chromlength)*8/1023-4pop=newpop;endx(i)y(i)fplot('x+3*sin(2*x)-7*cos(x)',[-4 4])grid onhold onplot(x,y,'r*')title('x+3*sin(2*x)-7*cos(x)的最大值')hold off2.子程序:初始化%初始化function pop=initpop(popsize,chromlength)pop=round(rand(popsize,chromlength)) %rand随机产生初始种群3. 子程序:计算目标函数%计算目标函数值function [objvalue]=calobjvalue(pop)temp1=decodechrom(pop,1,10)x=temp1*8/1023-4objvalue=x+3*sin(2*x)-7*cos(x)function pop2=decodechrom(pop,spoint,length)pop1=pop(:,spoint:spoint+length-1)pop2=decodebinary(pop1)function pop2=decodebinary(pop)[px,py]=size(pop)for i=1:pypop1(:,i)=2.^(py-1).*pop(:,i)py=py-1endpop2=sum(pop1,2)4. 子程序:选择操作%选择function [newpop]=selection(pop,fitvalue)totalfit=sum(fitvalue)fitvalue=fitvalue/totalfit%但个个体选择概率fitvalue=cumsum(fitvalue)[px,py]=size(pop)ms=sort(rand(px,1))fitin=1newin=1while newin<=pxif(ms(newin))<fitvalue(fitin)newpop(newin,:)=pop(fitin,:)newin=newin+1elsefitin=fitin+1endend5.子程序:交叉% 交叉function [newpop]=crossover(pop,pc)[px,py]=size(pop)newpop=ones(size(pop))for i=1:2:px-1if(rand<pc)cpoint=round(rand*py)newpop(i,:)=[pop(i,1:cpoint) pop(i+1,cpoint+1:py)]newpop(i+1,:)=[pop(i+1,1:cpoint) pop(i,cpoint+1:py)] elsenewpop(i,:)=pop(i,:)newpop(i+1,:)=pop(i+1,1)endend%6. 子程序:变异%变异function [newpop]=mutation(pop,pm)[px,py]=size(pop)newpop=ones(size(pop))for i=1:pxif(rand<pm)mpoint=round(rand*py)if mpoint<=0mpoint=1endnewpop(i,:)=pop(i,:)if any(newpop(i,mpoint))==0newpop(i,mpoint)=1elsenewpop(i,mpoint)=0endelsenewpop(i,:)=pop(i,:)endend7. 求出群体中适应值最大的个体及其适应值:%求出群体中最大适应值及其个体function [bestindividual,bestfit]=best(pop,fitvalue) [px,py]=size(pop)bestindividual=pop(1,:)bestfit=fitvalue(1)for i=2:pxif fitvalue(i)>bestfitbestindividual=pop(i,:)bestfit=fitvalue(i)endend三以上程序运行后的的结果如下图:(图)。
遗传算法求多元函数的极值

遗传算法求多元函数的极值
遗传算法是一种基于生物进化理论的优化算法,可以用来求解多元函数的极值。
下面介绍遗传算法求解多元函数极值的基本流程:
确定目标函数:首先需要确定待优化的目标函数,将其转化为一个优化问题。
确定变量范围和初始种群:对于每个变量,需要确定其可行域范围,并生成一个随机的初始种群。
适应度函数的定义:根据目标函数确定适应度函数,并将其作为评估个体优劣的标准。
选择操作:选择操作是遗传算法的核心,通过适应度函数选择个体,以保留优良个体。
遗传操作:包括交叉和变异两种操作。
交叉操作是指将两个个体的染色体部分进行交换,从而产生新个体;变异操作是指对某个个体的染色体部分进行随机变换,从而产生新个体。
繁殖新种群:通过选择和遗传操作,生成新的种群,并根据适应度函数进行排序。
判断停止条件:根据实际情况设定停止条件,如达到最大迭代次数、收敛到一定程度等。
输出结果:在满足停止条件后,输出当前最优解和最优适应度值。
需要注意的是,遗传算法求解多元函数极值需要根据实际情况调整参数和优化算法流程,以达到最优结果。
python实现遗传算法求函数最大值(人工智能作业)

python实现遗传算法求函数最⼤值(⼈⼯智能作业)题⽬:⽤遗传算法求函数f(a,b)=2a x sin(8PI x b) + b x cos(13PI x a)最⼤值,a:[-3,7],b:[-4:10]实现步骤:初始化种群计算种群中每个个体的适应值淘汰部分个体(这⾥是求最⼤值,f值存在正值,所以淘汰所有负值)轮盘算法对种群进⾏选择进⾏交配、变异,交叉点、变异点随机分析:为了⽅便,先将⾃变量范围调整为[0,10]、[0,14]有两个变量,种群中每个个体⽤⼀个列表表⽰,两个列表项,每项是⼀个⼆进制字符串(分别由a、b转化⽽来)种群之间交配时需要确定交叉点,先将个体染⾊体中的两个⼆进制字符串拼接,再确定⼀个随机数作为交叉点为了程序的数据每⼀步都⽐较清晰正确,我在select、crossover、mutation之后分别都进⾏了⼀次适应值的重新计算具体代码:import mathimport randomdef sum(list):total = 0.0for line in list:total += linereturn totaldef rand(a, b):number = random.uniform(a,b)return math.floor(number*100)/100PI = math.pidef fitness(x1,x2):return 2*(x1-3)*math.sin(8*PI*x2)+(x2-4)*math.cos(13*PI*x1)def todecimal(str):parta = str[0:4]partb = str[4:]numerical = int(parta,2)partb = partb[::-1]for i in range(len(partb)):numerical += int(partb[i])*math.pow(0.5,(i+1))return numericaldef tobinarystring(numerical):numa = math.floor(numerical)numb = numerical - numabina = bin(numa)bina = bina[2:]result = "0"*(4-len(bina))result += binafor i in range(7):numb *= 2result += str(math.floor(numb))numb = numb - math.floor(numb)return resultclass Population:def __init__(self):self.pop_size = 500 # 设定种群个体数为500self.population = [[]] # 种群个体的⼆进制字符串集合,每个个体的字符串由⼀个列表组成[x1,x2]self.individual_fitness = [] # 种群个体的适应度集合self.chrom_length = 22 # ⼀个染⾊体22位self.results = [[]] # 记录每⼀代最优个体,是⼀个三元组(value,x1_str,x2_str)self.pc = 0.6 # 交配概率self.pm = 0.01 # 变异概率self.distribution = [] # ⽤于种群选择时的轮盘def initial(self):for i in range(self.pop_size):x1 = rand(0,10)x2 = rand(0,14)x1_str = tobinarystring(x1)x2_str = tobinarystring(x2)self.population.append([x1_str,x2_str]) # 添加⼀个个体fitness_value = fitness(x1,x2)self.individual_fitness.append(fitness_value) # 记录该个体的适应度self.population = self.population[1:]self.results = self.results[1:]def eliminate(self):for i in range(self.pop_size):if self.individual_fitness[i]<0:self.individual_fitness[i] = 0.0def getbest(self):"取得当前种群中的⼀个最有个体加⼊results集合"index = self.individual_fitness.index(max(self.individual_fitness))x1_str = self.population[index][0]x2_str = self.population[index][1]value = self.individual_fitness[index]self.results.append((value,x1_str,x2_str,))def select(self):"轮盘算法,⽤随机数做个体选择,选择之后会更新individual_fitness对应的数值""第⼀步先要初始化轮盘""选出新种群之后更新individual_fitness"total = sum(self.individual_fitness)begin = 0for i in range(self.pop_size):temp = self.individual_fitness[i]/total+beginself.distribution.append(temp)begin = tempnew_population = []new_individual_fitness = []for i in range(self.pop_size):num = random.random() # ⽣成⼀个0~1之间的浮点数j = 0for j in range(self.pop_size):if self.distribution[j]<num:continueelse:breakindex = j if j!=0 else (self.pop_size-1)new_population.append(self.population[index])new_individual_fitness.append(self.individual_fitness[index])self.population = new_populationself.individual_fitness = new_individual_fitnessdef crossover(self):"选择好新种群之后要进⾏交配""注意这只是⼀次种群交配,种群每⼀次交配过程,会让每两个相邻的染⾊体进⾏信息交配"for i in range(self.pop_size-1):if random.random()<self.pc:cross_position = random.randint(1,self.chrom_length-1)i_x1x2_str = self.population[i][0]+self.population[i][1] # 拼接起第i个染⾊体的两个⼆进制字符串i1_x1x2_str = self.population[i+1][0]+self.population[i+1][1] # 拼接起第i+1个染⾊体的两个⼆进制字符串 str1_part1 = i_x1x2_str[:cross_position]str1_part2 = i_x1x2_str[cross_position:]str2_part1 = i1_x1x2_str[:cross_position]str2_part2 = i1_x1x2_str[cross_position:]str1 = str1_part1+str2_part2str2 = str2_part1+str1_part2self.population[i] = [str1[:11],str1[11:]]self.population[i+1] = [str2[:11],str2[11:]]"然后更新individual_fitness"for i in range(self.pop_size):x1_str = self.population[i][0]x2_str = self.population[i][1]x1 = todecimal(x1_str)x2 = todecimal(x2_str)self.individual_fitness[i] = fitness(x1,x2)def mutation(self):"个体基因变异"for i in range(self.pop_size):if random.random()<self.pm:x1x2_str = self.population[i][0]+self.population[i][1]pos = random.randint(0,self.chrom_length-1)bit = "1" if x1x2_str[pos]=="0" else "0"x1x2_str = x1x2_str[:pos]+bit+x1x2_str[pos+1:]self.population[i][0] = x1x2_str[:11]self.population[i][1] = x1x2_str[11:]"然后更新individual_fitness"for i in range(self.pop_size):x1_str = self.population[i][0]x2_str = self.population[i][1]x1 = todecimal(x1_str)x2 = todecimal(x2_str)self.individual_fitness[i] = fitness(x1, x2)def solving(self,times):"进⾏times次数的整个种群交配变异""先获得初代的最优个体"self.getbest()for i in range(times):"每⼀代的染⾊体个体和适应值,需要先淘汰,然后选择,再交配、变异,最后获取最优个体。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
遗传算法十进制编码求函数极大值程序%Generic Algorithm for function f(x1,x2) optimum
clear all;
close all;
Size=500;
CodeL=2;
MinX(1)=-2.048;
MaxX(1)=2.048;
MinX(2)=-2.048;
MaxX(2)=2.048;
E(:,1)=MinX(1)+(MaxX(1)-MinX(1))*rand(Size,1);
E(:,2)=MinX(2)+(MaxX(2)-MinX(2))*rand(Size,1);
G=200;
BsJ=0;
%*************** Start Running ***************
for kg=1:1:G
time(kg)=kg;
%****** Step 1 : Evaluate BestJ ******
for i=1:1:Size
xi=E(i,:);
x1=xi(1);
x2=xi(2);
F(i)=100*(x1^2-x2)^2+(1-x1)^2;
Ji=1./F;
BsJi(i)=min(Ji);
end
[OderJi,IndexJi]=sort(BsJi);
BestJ(kg)=OderJi(1);
BJ=BestJ(kg);
Ji=BsJi+1e-10; %Avoiding deviding zero
fi=F;
[Oderfi,Indexfi]=sort(fi); %Arranging fi small to bigger
Bestfi=Oderfi(Size); %Let Bestfi=max(fi)
BestS=E(Indexfi(Size),:); %Let BestS=E(m), m is the Indexfi belong to max(fi)
bfi(kg)=Bestfi;
kg
BestS
%****** Step 2 : Select and Reproduct Operation******
fi_sum=sum(fi);
fi_Size=(Oderfi/fi_sum)*Size;
fi_S=floor(fi_Size); % Selecting Bigger fi value
r=Size-sum(fi_S);
Rest=fi_Size-fi_S;
[RestValue,Index]=sort(Rest);
for i=Size:-1:Size-r+1
fi_S(Index(i))=fi_S(Index(i))+1; % Adding rest to equal Size end
k=1;
for i=Size:-1:1 % Select the Sizeth and Reproduce firstly
for j=1:1:fi_S(i)
TempE(k,:)=E(Indexfi(i),:); % Select and Reproduce
k=k+1; % k is used to reproduce end
end
%************ Step 3 : Crossover Operation ************
Pc=0.90;
for i=1:2:(Size-1)
temp=rand;
if Pc>temp %Crossover Condition
alfa=rand;
TempE(i,:)=alfa*E(i+1,:)+(1-alfa)*E(i,:);
TempE(i+1,:)=alfa*E(i,:)+(1-alfa)*E(i+1,:);
end
end
TempE(Size,:)=BestS;
E=TempE;
%************ Step 4: Mutation Operation **************
Pm=0.10-[1:1:Size]*(0.01)/Size; %Bigger fi,smaller Pm
Pm_rand=rand(Size,CodeL);
Mean=(MaxX + MinX)/2;
Dif=(MaxX-MinX);
for i=1:1:Size
for j=1:1:CodeL
if Pm(i)>Pm_rand(i,j) %Mutation Condition TempE(i,j)=Mean(j)+Dif(j)*(rand-0.5);
end
end
end
%Guarantee TempE(Size,:) belong to the best individual TempE(Size,:)=BestS;
E=TempE;
end
BestS
Bestfi
figure(1);
plot(time,BestJ,'k');
xlabel('Times');ylabel('Best J');
figure(2);
plot(time,bfi,'k');
xlabel('times');ylabel('Best F');。