利用遗传算法求函数f
使用Matlab进行遗传算法优化问题求解的方法
使用Matlab进行遗传算法优化问题求解的方法引言在现代科技发展的背景下,优化算法成为解决各种问题的重要工具之一。
遗传算法作为一种生物启发式算法,具有全局寻优能力和适应性强的特点,在许多领域中被广泛应用。
本文将介绍如何使用Matlab进行遗传算法优化问题求解,包括问题建模、遗传算子设计、遗传算法编码、适应度评价和求解过程控制等方面。
一、问题建模在使用遗传算法求解优化问题之前,我们首先需要将问题定义为数学模型。
这包括确定问题的目标函数和约束条件。
例如,假设我们要最小化一个多变量函数f(x),其中x=(x1,x2,...,xn),同时还有一些约束条件g(x)<=0和h(x)=0。
在Matlab中,我们可通过定义一个函数来表示目标函数和约束条件。
具体实现时,我们需要在目标函数和约束函数中设置输入参数,通过调整这些参数进行优化。
二、遗传算子设计遗传算法的核心是遗传算子的设计,包括选择(Selection)、交叉(Crossover)、变异(Mutation)和替代(Replacement)等。
选择操作通过一定的策略从种群中选择出适应度较高的个体,作为进行交叉和变异的父代个体。
交叉操作通过将两个父代个体的基因片段进行交换,产生新的子代个体。
变异操作通过改变个体某些基因的值,引入新的基因信息。
替代操作通过选择适应度较低的个体将其替换为新产生的子代个体。
三、遗传算法编码在遗传算法中,个体的编码方式决定了问题的解空间。
常见的编码方式有二进制编码和实数编码等。
当问题的变量是二进制形式时,采用二进制编码。
当问题的变量是实数形式时,采用实数编码。
在Matlab中,我们可以使用矩阵或向量来表示个体的基因型,通过制定编码方式来实现遗传算法的编码过程。
四、适应度评价适应度评价是遗传算法中判断个体优劣的指标。
在适应度评价过程中,我们将问题的目标函数和约束条件应用于个体的解,计算得到一个适应度值。
适应度值越大表示个体越优。
利用遗传算法求函数的极大值
利用遗传算法求函数的极大值该函数有两个局部极大值点,分别是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,分析群体大小、终止进化代数、交叉概率和变异概率对优化效果的影响。
遗传算法求函数最小值
遗传算法求函数最小值遗传算法是一种模拟自然界中生物进化过程的计算方法,其基本原理是模拟类比生物的自然选择、交叉和变异过程,以达到求解非线性优化问题的目的。
在本文中,我们将介绍如何使用遗传算法来求解一个简单但典型的非线性函数优化问题。
该函数是 Rosenbrock 函数,它是一个多峰函数,一般用来测试其他优化算法的性能。
Rosenbrock 函数的公式如下:$$f(x,y) = (1-x)^2 + 100(y-x^2)^2$$该函数有一个明显的最小值点 $(1, 1)$,函数值为 0。
我们的目标是使用遗传算法来找到这个最小值点。
以下是遗传算法的基本流程:1. 初始化种群:随机生成一组初始解。
2. 评估适应度:计算种群中每个解的适应度,即 Rosenbrock 函数的值。
适应度越高,表示该解越接近最小值点。
3. 选择育种个体:采用轮盘赌算法从种群中选择一些个体,用于后续的交叉和变异。
4. 交叉:对选择出来的个体进行交叉操作,生成一定数量的新个体。
交叉操作的目的是将两个个体的优良特征互相交换,以产生更好的后代。
5. 变异:对上一步生成的新个体进行变异操作,产生进一步的多样性和探索性。
6. 评估适应度:对新生成的个体进行适应度评估,即 Rosenbrock 函数的值。
7. 替换:选择一部分新生成的个体,替代原来种群中适应度低的个体。
8. 检查停止条件:判断是否满足停止条件,如果是,则输出最优解;否则回到第 3 步。
根据以上基本流程,我们可以逐步开发程序实现。
首先,我们定义一个 Rosenbrock 函数的计算函数:```pythondef rosenbrock(x, y):return (1 - x)**2 + 100*(y - x**2)**2```然后,我们随机生成一组初始解,使用 numpy 库生成随机数,x、y 取值范围在 [-3,3]:```pythonimport numpy as npPOPULATION_SIZE = 100 # 种群大小BOUND_LOW, BOUND_HIGH = -3.0, 3.0 # 取值范围populations = np.random.uniform(low=BOUND_LOW, high=BOUND_HIGH,size=(POPULATION_SIZE, 2))```fitness = [rosenbrock(x, y) for x, y in populations]df = pd.DataFrame({'x': populations[:, 0], 'y': populations[:, 1],'fitness': fitness})```然后,我们编写轮盘赌算法选择育种个体的代码。
利用遗传算法求函数的极大值
利用遗传算法求函数的极大值遗传算法是一种通过模拟生物进化的方式来解决优化问题的算法。
它基于达尔文的演化论思想,通过不断演化和交叉变异,逐步优化解空间中的解向最优解靠拢。
在求解函数的极大值问题中,遗传算法可以通过优化染色体的基因序列来寻找最大值点。
遗传算法的基本流程如下: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。
实验五:遗传算法求解函数最值问题实验
实验五:遗传算法求解函数最值问题实验实验五:遗传算法求解函数最值问题实验一、实验目的使用遗传算法求解函数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]];但实验时发现结果不好,经过仔细研究之后发现,这里在取某些值的时候,目标函数计算出来的适应值可能会出现负值,这时如果按照把每个个体的适应值除以适应值的总和的进行归一化的话会出现问题,因为个体可能出现负值,总和也可能出现负值,如果归一化的时候除以了一个负值,选择时就会选择一些不良的个体,对实验结果造成影响。
遗传算法求函数最小值
遗传算法求函数最⼩值利⽤遗传算法寻找函数f(x)=sin(10πx)/x x=[1,2]解题思路将⾃变量在给定范围进⾏编码,得到种群编码,按照所选择的适应度函数并通过遗传算法中的选择,交叉和变异对个体进⾏筛选和进化,使适应度值⼤的个体被保留,⼩的个体被淘汰,新的种群继承上⼀代的信息,⼜优于下⼀代,这样反复循环,最后得出最终结果注:程序参考<<MATLAB智能智能算法30个案例>>, 依照matlab程序,⽤python进⾏了重写# -*- coding: utf-8 -*-import matplotlib.pyplot as pltimport numpy as npfrom pylab import *import randomimport mathmpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = False#定义遗传算法参数pop_size=40generation=20length=30pc=0.65pm=0.01#编码def genEncoding(pop_size,length):pop=[[]]for i in range(pop_size):temp=[]for j in range(length):temp.append(random.randint(0,1))pop.append(temp)return pop[1:]#解码def genDecoding(pop,length):temp=[]for i in range(len(pop)):t=0for j in range(length):t+=pop[i][j]*math.pow(2,j)temp.append(t)return temp#计算⽬标值def calobjValue(pop,length,lb,ub):temp1=[]obj_value=[]x_value=[]temp1=genDecoding(pop,length)for i in range(len(temp1)):x=lb+(ub-lb)*temp1[i]/((math.pow(2,length))-1)x_value.append(x)obj_value.append(np.sin(10*pi*x)/x)return obj_value#计算适应度def fitness(pop,length,lb,ub):obj_value=[]fitness_value=[]obj_value=calobjValue(pop,length,lb,ub)for i in range(len(obj_value)):fitness_value.append(obj_value[i]-1)fitness_value=list(map(abs,fitness_value))return fitness_value#累积适应度def cumsum(newfitness_value):accumulation_value=[]t=0for i in range(len(newfitness_value)):t+=newfitness_value[i]accumulation_value.append(t)return accumulation_value#选择函数def selection(pop,fitness_value):newfitness_value=[]accumulation_value=[]total_fit=np.sum(fitness_value)for i in range(len(fitness_value)):newfitness_value.append(fitness_value[i]/total_fit) accumulation_value=cumsum(newfitness_value)ms=[]for i in range(len(pop)):ms.append(random.random())newin=0newpop=[]for i in range(len(ms)):j=0for j in range(len(accumulation_value)):if ms[i]<accumulation_value[j]:t=pop[j]newpop.append(t)breakreturn newpop#交叉函数def crossover(pop,fitness_value,pc):newpop=[]newpop=selection(pop,fitness_value)for i in range(len(newpop)-1):if random.random()<pc:temp1=[]temp2=[]temp1=newpop[i][3:15]temp2=newpop[i+1][3:15]newpop[i][3:15]=temp2newpop[i+1][3:15]=temp1return newpopdef mutation(pop,fitness_value,pc,pm,length):newpop=[]newpop=crossover(pop,fitness_value,pc)for i in range(len(newpop)):if random.random()<pm:m1=random.randint(0,length-1)m2=random.randint(0,length-1)m3=random.randint(0,length-1)if newpop[i][m1]==1:newpop[i][m1]=0else:newpop[i][m1]=1if newpop[i][m2]==1:newpop[i][m2]=0else:newpop[i][m2]=1if newpop[i][m3]==1:newpop[i][m3]=0else:newpop[i][m3]=1i=0return newpopif __name__ =='__main__':#画出函数图plt.figure(1)lb=1ub=2x=np.arange(lb,ub,0.01)y=sin(10*pi*x)/xplt.plot(x,y)plt.xlabel("⾃变量x")plt.ylabel("⾃变量y")plt.title('sin(10*pi*x)/x')pop=genEncoding(pop_size,length)obj_value=calobjValue(pop,length,lb,ub)fitness_value=fitness(pop,length,lb,ub)gen=0x_value=[]best_x=[]best_individual=[]Generation=[]while gen<generation:newpop=mutation(pop,fitness_value,pc,pm,length) temp=genDecoding(newpop,length)for i in range(len(temp)):x=lb+(ub-lb)*temp[i]/((math.pow(2,length))-1)x_value.append(x)obj_value=calobjValue(newpop,length,lb,ub)k=0j=0for i in range(len(obj_value)):if k>obj_value[i]:k=obj_value[i]j=ibest_individual.append(k)best_x.append(x_value[j])fitness_value=fitness(newpop,length,lb,ub)Generation.append(gen)gen=gen+1k=0j=0for i in range(len(best_individual)):if k>best_individual[i]:k=best_individual[i]j=iprint(best_individual[j])print(best_x[j])best_individual.sort(reverse=True)plt.figure(2)plt.plot(Generation,best_individual)plt.xlabel("遗传代数")plt.ylabel("解的变化") plt.title("进化过程") plt.show()。
遗传算法考试题目
遗传算法考试题目
题目1:使用遗传算法求解旅行商问题。
假设有一位旅行商需要拜访n个城市,每个城市只能访问一次,并且从一个城市回到起始城市。
每个城市之间都有距离,求解旅行商经过的最短路径。
题目2:使用遗传算法优化函数f(x)=x^2-4x+4,求解使得f(x)取得最小值的x。
题目3:使用遗传算法求解背包问题。
假设有一个背包的容量为C,同时有n个物品,每个物品有自己的重量和价值。
要求
选择一些物品放入背包中,使得背包内物品的总重量不超过C,并且物品的总价值最大。
题目4:使用遗传算法进行图像压缩。
假设有一张彩色图像,每个像素点都有RGB三个分量的值。
要求使用遗传算法对这
张图像进行压缩,使得图像的质量损失最小化的情况下,压缩比最大化。
题目5:使用遗传算法优化神经网络结构。
假设有一个神经网络,其层数和每层的节点数都是可调整的。
使用遗传算法搜索出最优的神经网络结构,使得在给定的数据集上,神经网络的预测性能最好。
遗传算法求函数极值
遗传算法求函数极值遗传算法是一种基于模拟生物进化过程的优化算法,它通过模拟生物的进化过程中的遗传、交叉和变异等操作,对问题的解空间进行,并到满足最优条件的解。
它被广泛应用于求解各种复杂问题,包括函数极值问题。
在使用遗传算法求函数极值的过程中,首先需要明确问题的目标函数。
目标函数是一个将自变量映射到一个实数值的函数,它描述了问题的优化目标。
例如,我们可以考虑一个简单的目标函数f(x),其中x表示自变量,f(x)表示因变量。
遗传算法的基本流程如下:1.初始化种群:随机生成一组初始解,也就是种群。
种群中的每个个体都是一个可能的问题解,而个体中的染色体则表示了问题解的具体数值。
2.适应度评估:对于种群中的每个个体,通过计算目标函数的值,评估每个个体的适应度。
适应度越高的个体,越有可能成为下一代个体的基因。
3.选择操作:根据个体的适应度,选择一些个体作为下一代遗传操作的基因。
4.交叉操作:从选择出的个体中随机选择一对个体,进行交叉操作。
交叉操作通过交换两个个体的染色体信息,产生新的个体。
5.变异操作:对交叉操作生成的新个体进行变异操作。
变异操作通过改变个体染色体中的部分基因,引入新的解,以增加问题解的多样性。
6.新种群产生:基于交叉和变异操作,生成新的种群。
7.终止条件判断:如果满足终止条件(例如达到最大迭代次数、找到了满足要求的解等),则停止算法;否则,返回第2步。
通过以上步骤的循环迭代,遗传算法可以到问题的最优解,即函数的极值。
由于遗传算法充分利用了进化算法的生物特点,具有全局能力和自适应优化能力,因此在函数极值求解中得到了广泛的应用。
遗传算法的关键在于如何进行适应度评估、选择操作、交叉操作和变异操作。
适应度评估是指根据目标函数计算个体的适应度值,一般情况下适应度越高的个体越有可能成为下一代的基因。
选择操作可以采用轮盘赌选择、最优选择等方式,根据个体的适应度选择一定数量的个体进行交叉和变异。
交叉操作通过交换染色体信息,产生新的个体;变异操作通过改变个体染色体中的部分基因,引入新的解。
基于遗传算法求函数最大值
土豆学习小组基于遗传算法求函数最大值先给出实例:设函数为:]7,1[,10)3sin()5cos()(∈+−=x x x x f ,取种群大小20,搜索精度0.0001,交叉概率0.6,变异概率0.1,遗传20代。
下面根据这个例子来叙述如何通过遗传算法来计算最大值。
遗传算法的概念和相关知识可以去网上查看,这里主要介绍和程序相关的知识。
遗传算法的流程图如下:遗传算法流程图种群的产生一般由随机数产生固定长度的01序列,可以理解成染色体,例如:1111010011100001011000,这表示一个单独个体的染色体,那么结合这个例子就是产生20个这样的染色体。
种群适应度估计,因为是求最大值,所以适应度可以通过求函数值来确定,函数值越大,越适合生存。
选择,这是一个自然选择的过程,这里用轮盘赌选择法,土豆学习小组轮盘赌选择法交叉用单点交叉:单点交叉变异的形式如下:变异当然变异的概率相对较低。
注意:选择和交叉方法还很多,也比这来的有效,只是这种方法较为简单,易于程序实现。
MATLAB命令窗口:>>[xv,fv]=GA(@fitness,1,7,20,20,0.6,0.1,0.0001)xv=3.6723土豆学习小组fv=11.8830函数图形结果基本符合。
函数文件1:fitness.m用于存放需要求的函数function F=fitness(x)F=cos(5*x)-sin(3*x)+10;函数文件2:GA.m遗传算法文件function[xv,fv]=GA(fitness,a,b,NP,NG,pc,pm,eps) %上限a%下限b%种群大小:NP%遗传代数:NG%交叉概率:pc%变异概率:pm%离散精度:eps%第一步产生初始种群x,产生之前需要根据离散精度确定串长L L=ceil(log2((b-a)/eps));x=Initial(L,NP);for i=1:NPxdec(i)=dec(a,b,x(i,:),L);end%第二步选择交叉变异要循环好几代for i=1:NG%选择轮盘赌选择法fx=fitness(xdec);%适应度fxp=fx/sum(fx);%选择概率fxa(1)=fxp(1);%累计概率土豆学习小组for j=2:NPfxa(j)=fxa(j-1)+fxp(j);end%开始选择父体sat=rand();for k=1:NPif sat<=fxa(k)father=k;break;endend%随机选取母体mother=ceil(rand()*NP);nx=x;%单点交叉cutp=ceil(rand()*L);r1=rand();if r1<=pcnx(i,1:cutp)=x(father,1:cutp);nx(i,cutp+1:L)=x(mother,cutp+1:L);r2=rand();%是否变异if r2<pmcum=ceil(rand()*L);nx(i,cum)=~nx(i,cum);endendx=nx;for i=1:NPxdec(i)=dec(a,b,x(i,:),L);end%选择较好的子代fv=-inf;for i=1:NPfitx=fitness(dec(a,b,x(i,:),L));if fitx>fvfv=fitx;xv=dec(a,b,x(i,:),L);endendend土豆学习小组%种群初始化函数function t=Initial(L,NP)t=zeros(NP,L);for i=1:NPfor j=1:Ltemp=rand();t(i,j)=round(temp);endend%解码函数转换成十进制function d=dec(a,b,num,L)i=L-1:-1:0;dd=sum((2.^i).*num);d=a+dd*(b-a)/(2^L-1);其中:dec函数将某个个体转换到【1,7】之间的数000000000000=1;111111111111=7;。
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):"每⼀代的染⾊体个体和适应值,需要先淘汰,然后选择,再交配、变异,最后获取最优个体。
用标准遗传算法求函数 f ( x ) =sum(x)的最小值,其中x的取值范围为【0,1】区间的
标准遗传算法(Standard Genetic Algorithm,SGA)是一种基于进化算法(Evolutionary Algorithm)的优化方法,它的基本思想是以自然进化的原理来优化算法。
标准遗传算法可以被用来求解一些具有多变量的优化问题,它能够有效地搜索复杂的优化空间,从而得到最优解。
在求解函数 f ( x ) =sum(x)的最小值的问题中,我们可以利用标准遗传算法来解决。
首先,我们需要确定函数 f ( x ) =sum(x)的自变量 x 的取值范围,在这里,我们假设 x 的取值范围为【0,1】区间。
接下来,我们需要确定搜索空间的大小,即确定一个合适的种群规模,在这里,我们假定种群规模为 50 个个体。
接下来,我们需要确定种群初始状态,即确定每个个体的初始值,这里我们采用随机初始化的方法,即从【0,1】区间随机选择出一组值来初始化每个个体。
接下来,我们需要确定适应度函数,它用来衡量每个个体的优劣,在这里,我们适应度函数为 f ( x ) =sum(x),即我们要求解函数 f ( x ) =sum(x)的最小值。
接下来,我们需要确定遗传算子,这些算子用来对种群中的个体进行繁殖和变异,在这里,我们采用交叉操作、变异操作和选择操作,其中交叉操作用来模拟自然界中的遗传交叉,变异操作用来模拟自然界中的突变,而选择操作则用来模拟自然界中的自然选择。
最后,我们需要确定终止条件,即确定何时停止迭代,在这里,我们可以采用迭代次数的限制,即当迭代次数达到一定值时,停止迭代,或者采用最优解的收敛性来确定终止条件,即当最优解的变化量小于某一阈值时,停止迭代。
标准遗传算法是一种有效的优化算法,它可以有效地求解具有多变量的优化问题,通过确定种群的初始状态、适应度函数、遗传算子以及终止条件,我们可以用标准遗传算法求解函数 f ( x ) =sum(x)的最小值。
正如爱因斯坦所说:“我们只有通过模拟自然界中的进化过程,才能够更好地理解自然界的秘密”。
遗传算法求解实例
yjl.m :简单一元函数优化实例,利用遗传算法计算下面函数的最大值f (x) =xsin( 10 二* x) 2.0,x • [-1,2]选择二进制编码,种群中个体数目为40,每个种群的长度为20,使用代沟为0.9,最大遗传代数为25len lbub scale lbin译码矩阵结构: FieldD code译码矩阵说明:len -包含在Chrom中的每个子串的长度,注意sum(len)=length(Chrom);lb、ub -行向量,分别指明每个变量使用的上界和下界;code -二进制行向量,指明子串是怎样编码的,code(i)=1为标准二进制编码,code(i)=0则为格雷编码;scale -二进制行向量,指明每个子串是否使用对数或算术刻度,scale(i)=0为算术刻度,scale(i)=1则为对数刻度;lbin、ubin -二进制行向量,指明表示范围中是否包含每个边界,选择lbin=0或ubin=0,表示从范围中去掉边界;lbin=1或ubin=1则表示范围中包含边界;注:增加第22 行:variable=bs2rv(Chrom, FieldD);否则提示第26 行plot(variable(l), Y, 'bo');中variable(I)越界yj2.m :目标函数是De Jong函数,是一个连续、凸起的单峰函数,它的M文件objfun1包含在GA工具箱软件中,De Jong函数的表达式为:n2f (x) = ' X j , 一512 乞X j E 512i d这里n是定义问题维数的一个值,本例中选取n=20,求解min f (x),程序主要变量:NIND (个体的数量):=40;MAXGEN (最大遗传代数):=500;NVAR (变量维数):=20 ;PRECI (每个变量使用多少位来表示):=20;GGAP (代沟):=0.9注:函数objfun1.m 中switch改为switch1,否则提示出错,因为switch为matlab保留字,下同!yj3.m :多元多峰函数的优化实例,Shubert函数表达式如下,求min f (x)【shubert.m 】f(x 「X 2)= 7 i cos[( i T)*X t i]*7 i cos[( i ■ 1) * x 2 - i] ,- 10 乞 X t , x 2 乞 10i丄i注:第10行各变量的上下限改为[-10;10],原来为[-3;3];第25行改为:[Y, l]=min(ObjV);原来为[Y, I]=min(ObjVSel);以此将染色体的个 体值与shubert()函数值对应起来, 原表达式不具有 shubert()函数自变量和应变量的对应关系yj4.m :收获系统最优控制,收获系统(Harvest)是一个一阶的离散方程,表达式为x(k T) = a*x(k) - u (k) , k =1, 2,…,N-s.t. x(0)为初始条件x(k)三R 为状态变量u(k 厂R ■为控制输入变量精确优化解:用遗传算法对此问题求解, x(0) =100 , > -1.1,控制步骤N=20 ,决策变量u (k) 个数 NVAR=20, u(k) •二[0,200 ]注:第 20行语句原为:Chrom=crtrp(NIND,FieldDD);改为:Chrom=crtrp(SUBPOP*NIND,FieldDD);运行提示:Warning: File: D:\MA TLAB6p5\toolbox\gatbx\CRTRP .M Line: 34 Column: 19 Variable 'nargin' has bee n previously used as a function n ame. (Type "warni ngoff MATLAB:mir_warni ng_variable_used_as_fu nctio n"tosuppress this warnin g.)yj5.m :装载系统的最优问题,装载系统是一个二维系统,表达式如下X 1 ( k ' 1) = X 2 (k)丄 丄1x 2(k -1) =2 * x 2 (k) —X t (k)^u(k)N目标函数: 1Nf (x,u) - -X t (N 1)u (k)2N k 亠N _1理论最优解: min f (x, u) = _ 1 ■_ - — k 23 6N 2 N k 二目标函数: Nf(x,u)工 J u(k)k40.4 20x( N ) - x(0)k =1, 2,…,Nmax f (x)=Nx(0)(a -1) ~N 」 a (a -1)用遗传算法对此问题求解,x(0) =[0 0],控制步骤N=20,决策变量u(k)个数NVAR=20 , u(k)三[0,10]注:增加第32-35行语句,功能为实现每隔MIGGEN=20代,以迁移率MIGR=0.2在子种群之间迁移个体,增加这几行语句之前求得目标函数最小值为-0.1538,增加这几行语句之后求得目标函数最小值为-0.1544,目标函数理论最优值为-0.1544.yj6.m :离散二次线性系统最优控制问题,其一维二阶线性系统表达式如下:x(k 1)=a*x(k) b*u(k) , k =1, 2,…,N目标函数:N2 2 2f(x,u) =q*x(n 亠1)亠二[s * x( k)亠r*u(k)]k z1参数设置:求min f (x, u)yj7.m :目标分配问题描述为:m个地空导弹火力单元对n批空袭目标进行目标分配。
遗传算法求解函数最大值
遗传算法求解函数最大值研究者们广泛使用各种数学方法来求解函数的最大值,其中遗传算法是一种有效的解决方案。
遗传算法是一种仿生算法,使用相似的进化过程来搜索函数的最大值,这种算法在解决复杂问题时尤其有效。
遗传算法的工作原理是利用遗传操作来进行搜索。
它的步骤大致如下:首先,从初始种群中随机选择一定数量的个体,并进行多次重复,对其属性进行多次迭代,形成较优个体。
然后,根据结果,重建种群,以提高适应度。
在这个过程中,种群中的属性将不断改变,个体之间会遗传和变异,从而改变函数的最大值。
当属性变化趋于稳定时,这种改变的步骤就会停止,最大值就得到了。
为了更好地理解遗传算法,我们先来看一个例子。
一维函数f(x)=x^2-2x+5可以用遗传算法来求最大值。
我们以染色体序列长度为10作为种群大小,创建初始种群,并在每一代经历重复,变异,选择和交叉过程之后,依次获得较优个体。
在这个过程中,染色体序列不断变异,最后形成二进制数f(x)的最大值,最终求得f(x)的最大值为9。
遗传算法具有很多优点,其中最重要的是,它可以解决最优化问题,而且能够在有限的时间里达到不错的效果。
此外,遗传算法不会受到维度或者变量数量的限制,而且它可以根据需要改变变量的组合,从而获得更好的运算结果。
最后,遗传算法也可以应用在实际工程中,这就是遗传算法求解函数最大值的重要应用之一。
总的来说,遗传算法是一种通用的解决方案,能有效地搜索函数的最大值。
虽然它具有很多优点,但也有一些限制。
例如,算法的效率跟种群的大小有关,种群大小越大,搜索效率就越低,而且有时它也会陷入局部最优解中,从而无法搜索到全局最优解。
遗传算法可以给出不错的搜索结果,可以有效地求解函数最大值,是一种普遍应用的有效搜索方法。
因此,在未来,它将继续受到研究者们的广泛关注,并为世人带来更多的益处。
二进制编码遗传算法求函数极大值
二进制编码遗传算法求函数极大值二进制编码遗传算法是一种用于求解函数极大值的优化方法。
通过将函数的自变量编码为二进制字符串,然后利用遗传算法进行搜索,以找到函数的极大值。
下面是详细步骤:1. 确定问题:首先,明确需要求解的函数以及自变量的取值范围。
例如,假设我们要寻找函数f(x) = x^2 + 3x - 2在[0, 10]范围内的最大值。
2. 二进制编码:将自变量x的取值范围划分为若干个区间,然后用二进制字符串表示每个区间。
例如,如果将区间[0, 10]划分为5个区间,那么二进制编码的长度为log2(5) = 3。
3. 构建初始种群:根据二进制编码规则,生成一定数量的初始个体。
每个个体表示一个可能的解。
例如,生成10个个体。
4. 评估适应度:将每个个体解码为自变量x,计算对应的函数值f(x)。
然后,根据函数值计算每个个体的适应度。
适应度越高,表示个体对应的解越有可能为极大值。
5. 选择操作:采用轮盘赌选择法等策略,从当前种群中选择一部分优秀个体作为父代,用于产生下一代。
6. 交叉操作:对选定的父代个体进行交叉,生成一定数量的子代。
交叉操作可以采用单点交叉、多点交叉等方法。
7. 变异操作:对子代个体进行变异,即随机改变某些位上的二进制值。
变异操作有助于保持种群的多样性。
8. 更新种群:根据新的个体适应度重新构建种群。
9. 终止条件:当满足终止条件(如达到最大遗传代数、找到满足精度要求的极大值等)时,算法结束。
10. 结果输出:输出找到的极大值以及对应的自变量值。
通过以上步骤,二进制编码遗传算法可以用于求解函数的极大值。
需要注意的是,二进制编码遗传算法的性能受到种群数量、编码长度、交叉率、变异率等因素的影响,需要根据实际情况调整参数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
长春师范大学实验报告课程数学建模系别15级数学与应用数学班级数本四班学号1507140432姓名蒋佳诺利用遗传算法求函数f(x)=10+x.*cos(5*pi*x),x∈[-1,1]的最大值点。
代码如下:clear all ;clc ;%%%%%清除所有之前的程序%%%%%x=linspace(-1,1);y=10+x.*cos(5*pi*x);figure(1);plot(x,y,’r’)title(‘函数曲线图“)xlabel(‘x’)ylabel(‘y’)%%%%%绘制图中函数图形%%%%%%%主程序%%global BitLength%全局变量,计算如果满足求解精度至少需要编码的长度% global boundsbegin%全局变量,自变量的起始点%globalboundsend%全局变量,自变量的终止点%bounds=[-1,1]; %一维自变量的取值范围%precision=0.0001;%运算精度%boundsbegin=bounds(:,1);boundsend=bounds(:,2);%计算如果满足求解精度至少需要多长的染色体% BitLength=ceil(log2((boundsend-boundsbegin)’./precision)); popsize=50;%初始种群大小Generationnmax=20;%最大代数pcrossover=0.90;%交配概率pmutation=0.09;%变异概率population=round(rand(popsize,BitLength));%初始种群,行代表一个个体,列代表不同个体的%计算适应度[Fitvalue,cumsump]=fitnessfun(population);%输入群体population,返回适应度Fitvalue和累积概率cumsumpGeneration=1;While Generation<Generationnmax+1for j=1:2:popsize%1对1对群体进行如下操作(交叉,变异)%选择seln=selection(population,cumsump);%交叉scro=crossover(population,seln,pcrossover);scnew(j,:) =scro(1,:);scnew(j+1,:) =scro(2,:);%变异smnew(j,:)=mutation(smnew(j,:),pmutation);smnew(j+1,:)=mutation(smnew(j+1,:),pmutation);end%产生了新的种群population=smnew;%计算新种群的适应度[Fitvalue,cumsump]=fitnessfun(population);%记录当前代最好的适应度和平均适应度[fmax,nmax]=max(Fitvalue);%最好的适应度为fmax(即函数值最大),其对应的个体为nmaxfmean=mean(Fitvalue);%平均适应度为fmeanymax(Generation)=fmax;%每代中最好的适应度ymean(Generation)=fmax;%每代中平均的适应度%记录当前代的最佳染色体个体x=transform2to10(population(nmax,:));%population(nmax,:)为最佳染色体个体xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength) -1);xmax(Generation)=xx;Generation=Generation+1endGeneration=Generation-1;%Generation 加1,减1的操作是为了能记录各代中的最佳函数值xmax(Generation)targetfunvalue=targetfun(xmax)[Besttargetfunvalue,nmax]=max(targetfunvalue)Bestpopulation=xmax(nmax)% 绘制经过遗传运算后的适应度曲线figure(2);hand1=plot(1:Generation,ymax);set(hand1,’linestyle’,’-‘,’linewidth’,1,’marker’,’h’,markersize’,8)hold on;hand2=plot(1:Generation,ymean);set(hand2,’color’,’k‘,’linestyle’,’-‘,’linewidth’,1,’marker’,’h’,markersiz e’,8)xlabel(‘进化代数’)ylabel(‘最大和平均适应度’);xlim([1 Generationnmax]);legend(‘最大适应度’,’平均适应度’);box off;hold off;%%%%%%计算适应度函数%%%%%%[Fitvalue,cumsump]=fitnessfun(population);globalBitLengthglobalboundsbeginglobalboundsendpopsize=size(population,1);%计算个体个数fori=1:popsizex=transform2to10(population(i,:));%将二进制转换为十进制%转化为[-2,2]区间的实数xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength)-1);Fitvalue(i)=targetfun(xx);%计算函数值,即适应度end%给适应度函数加上一个大小合理的数以便保证种群适应值为正数Fitvalue=Fitvalue‘%该处还有一个作用就是决定适应度是有利于选取几个有利个体(加强竞争)还是减弱竞争。
%计算选择概率fsum=sum(Fitvalue)Pperpopulation=Fitvalue/fsum%适应度归一化,及被复制的概率%计算累积概率cumsump(1)=Pperpopulation(1)fori=2:popsizecumsump(i)=cumsump(i-1)+Pperpopulation(i)%求累计概率endcumsump=cumsump’%累计概率%%%%%%%%%计算目标函数%%%%%%%%%function y=targetfun(x) %目标函数y=10+x.*cos(5*pi*x);end%%%%%%%%新种群交叉操作%%%%%%%%%输入population为种群,slen为选择的两个个体,pc为交配的概率functionscro=crossover(population,slen,pc);BitLength=size(population,2); %二进制的个数pcc=IfCroIfMut(pc); %根据交叉概率决定是否进行交叉操作,1则是,0则否if pcc==1 %进行交叉操作chb=round(rand*(BitLength-2))+1; %随机产生一个交叉位scro(1,:)=[population(slen(1),1:chb)population(slen(2),chb+1:BitLength)];%序号为slen(2)的个体在交叉位chb前面的信息与序号为slen(1)的个体在交叉位chb+1后面的信息重新重合else %不进行交叉操作scro(1,:)=population(slen(1),:);scro(2,:)=population(slen(2),:);endend%%%%%判断遗传运算是否需要进行交叉或变异%%%%%%%mutORcro为交叉,变异发生的概率%根据mutORcro决定是否进行相应的操作,产生1的概率是mutORcro,产生0的概率为1-mutORcrofunctionpcc=IfCroIfMut(mutORcro);test(1:100)=0; %1*100的行向量1=round(100*mutORcro);%产生一个数为100*mutORcro,round为取靠近的整数test(1:1)=1n=round(rand*99)+1;pcc=test(n);end%%%%%%%新种群变异操作%%%%%%%%%%%snew为一个个体functionsnew=mutation(snew,pmutation);BitLength=size(snew,2);snnew=snew;pmm=IfCroIfMut(pmutation); %根据变异概率决定是否进行变异操作,1则是,0则否ifpmm==1chb=round(rand*(BitLength-1))+1; %在[1,BitLength]范围内随机产生一个变异位snnew(chb)=abs(snew(chb)-1;%0变成1,1变成0endend%%%%%%%%新种群选择操作%%%%%%%%选择两个个体,返回个体的序号,有可能两个序号相同functionseln =slection(population,cumsump);%从种群中选择两个个体fori=1:2r=rand; %产生一个随机数prand=cumsump-r; %求出cumsump中第一个比r大的元素j=1;whileprand(j)<0j=j+1;endseln(i)=j; %选中个体的序号endend。