遗传算法实例
遗传算法实例:要求解的函数最大值为f(x)kaiyun.ccm,其表达式为10乘以sin(5x)加上7乘以cos(4x),其中x的取值范围在0到10之间。为了将x的值表示为二进制形式,我们采用10位的二进制数,这样每个二进制位可以提供0.01的分辨率,即(10-0)除以(2的10次方减1)等于0.01。将变量域从0至10进行二值化处理,划分为0至1023的区间,计算公式为x等于0加上10乘以b除以1023,其中b代表一个介于0和1023之间的二值数。% 2.1 初始化过程 %,其中initpop.m函数负责完成群体初始化的任务,popsize参数定义了群体的规模,chromlength参数则指明了染色体的长度(即二进制数的长度),其长度大小由变量二进制编码的位数决定(在本例中,编码长度设定为10位)。% 此外,该函数还涉及到遗传算法的相关子程序,其名称为 %Name:
在初始化函数`fun_cTi_on_pop`时,我们执行以下步骤:首先,定义`pop`变量,其值由`in_itpop`函数计算得出,该函数接收`popsize`和`chromlength`作为参数;接着,使用`rand`函数随机生成一个矩阵,矩阵的行数为`popsize`,列数为`chromlength`,矩阵中的每个单元均为0或1;最后,通过`round`函数对矩阵中的每个单元进行四舍五入处理。由此得到的初始种群,接着计算目标函数值,具体步骤如下:首先,将二进制数转换成十进制数(步骤1),然后执行遗传算法子程序,其中子程序名为decodeb,位于ary.m文件中。该子程序的任务是生成一个由2的n次方、2的n-1次方、1组成的行向量,并对其进行求和,从而将二进制数转换为十进制数。函数定义如下:fun cti on pop2=decodeb。
在Ary(Pop)中,px和py的值设为Pop的大小;对每个i从1到py,pop1的第i列元素等于2的(py-i)次方乘以pop的第i列元素;然后计算pop1每一行的总和;函数decodechrom.m的作用是将染色体(或二进制编码)转换成十进制数,其中spoint参数指定了待解码的二进制串的起始位置;对于多个变量,如果用20表示,每个变量用10表示,那么第一个变量从1开始计数,第二个变量从11开始计数。本例中,参数“length”用于指定截取的长度(例如,在本例中为10)。该参数与遗传算法相关。
子程序名为“decodechrom.m”,其主要作用是将二进制编码转换成十进制数。具体实现方式为:函数接收参数pop、spoint和length,其中pop1是从pop矩阵中截取的子矩阵,截取范围从spoint开始,长度为length;接着对pop1进行二进制解码操作。至于计算目标函数值的函数“calobjvalue.m”,其功能是执行目标函数的计算,采用的公式参考了本文中的示例仿真,并且可以根据不同的优化问题进行相应的调整。遗传算法子程序,名为“calobjvalue.m”,它负责执行目标函数的计算。具体操作是,通过调用函数objvalue=calobjvalue(pop)来对种群pop进行计算。
将pop矩阵的每一行数据解码为十进制数值,x的值通过将temp1乘以10再除以1023得到;接着,将二值域的数值转换为变量域的数值,计算得到目标函数值objvalue;然后,计算个体的适应值,执行遗传算法的子程序;函数名为calfitvalue,用于计算个体的适应值;在全局变量Cmin中初始化为0;获取objvalue的行数px和列数py;从1到px进行循环;如果objvalue的第i行加上Cmin大于0,则进行以下操作:temp的值为Cmin加上objvalue的第i行。
在程序中,首先将elsetemp的值设为0.0,随后将endfitvalue(i)的值更新为temp,接着将endfitvalue的值设置为fitvalue。这个过程相当于执行了选择或复制的操作,以确定哪些个体能够进入下一代。程序运用了赌轮盘选择法来进行选择,这种算法相对简单易行。依据方程 pi=fi/ 刀fi=fi/fsum,选择步骤如下:首先,在第t代中,根据(1)式计算出fsum和pi;接着,生成0到1之间的随机数rand(.),并乘以fsum得到s;然后,找出刀fi罗中最小的k值,从而确定第k个个体被选中;最后,重复执行步骤2和3共N次,从而得到N个个体,构成第t=t+1代的种群。遗传算法子程序命名为selection.m,选择过程复
定义函数newpop,等于selection(pop, fitvalue),首先计算适应值之和totalfit;接着将fitvalue除以totalfit,得到每个个体被选择的概率;然后计算cumsum(fitvalue),若fitvalue为1 2 3 4,则cumsum(fitvalue)为1 3 6;设定py为pop的大小,ms为从小到大排列的rand(px,1);初始化fiti n为1,newin也为1;在while循环中,如果ms的第newi n个元素大于等于fitvalue的第fiti n个元素,则newinv等于px。
在执行交叉操作时kaiyun全站登录网页入口,首先从父代中选取新的个体,即通过pop函数从fiti n中获取;随后,将newin的值加一。若不满足条件,则fiti n的值增加。整个过程重复进行。此外,交叉操作以一定的概率pc在群体中每个个体之间进行,即两个个体从各自字符串的某一特定位置(通常随机决定)开始,相互交换部分基因序列,这一过程与生物进化中的基因分裂与重组相似。假设选取两个父代基因型x1和x2,其基因序列分别为:x1=0100110,x2=1010001。从这两个基因型的第三位起进行基因重组,经过交叉操作后,生成了两个新的子代基因型y1和y2,具体序列为:y1=0100001,y2=1010110。这两个子代基因型分别继承了它们各自父代基因型中的某些特定基因特征。通过这种交叉方式,我们有可能从父代基因型中提取并组合出新的遗传特性。
子代个体通过组合展现出更高的适应性。实际上,交配是遗传算法与其它传统优化策略相区分的关键特性之一。遗传算法中的子程序名为“crossover.m”,其功能在于执行交叉操作,生成新的种群。新种群的表示为“newpop=crossover(pop,pc)”,其中种群大小为“px,py=size(pop)”。在生成新种群的过程中,通过循环遍历种群中的个体,每次循环迭代中,以概率“randpc”决定是否进行交叉。若决定交叉,则随机选择两个个体,并从中截取一段基因序列进行交换,形成新的个体。具体操作为:首先,在种群中随机选择两个个体“pop(i)和pop(i+1)”,然后,从这两个个体中分别截取从第1个基因到第cpoint个基因的序列,以及从第cpoint+1个基因到第py个基因的序列,将这两段序列分别赋值给newpop中的对应位置,从而完成交叉操作。
在执行int+1:py语句后,若条件不满足,则执行else部分,此时新种群的第i个个体基因序列保持不变,即newpop(i,:)等于pop(i);同时,新种群的第i+1个个体基因序列也保持不变,即newpop(i+1,:)等于pop(i+1);此过程实现了变异操作。变异,即基因突变,是生物进化过程中的一个普遍现象。变异过程涉及父代个体中每一个基因位点的随机翻转,这意味着“1”可能转变为“0”或“0”变为“1”。遗传算法的这种变异机制能够使搜索过程在解的潜在空间中随机探索,从而有助于在一定程度上找到全局最优解。遗传算法模块中的子程序名为“mutation.m”,其功能在于对新种群进行变异操作。新种群的生成过程如下:首先确定种群规模,即px,py的值等于种群pop的大小;接着,调用ones函数,以种群规模为参数,生成新种群newpop。
执行e(pop);对于i从1到px,如果ran dpm成立,则mpoint等于round(ra nd*py);如果mpoint是最佳拟合,则bestfitbesti ndividual等于pop(i,:);bestfit等于fitvalue(i);结束;结束;这是主程序,遗传算法的主程序,命名为genmainO 5.m,清除clf,设置popsize为20;设定chromlength为10;交叉概率pc为0.6;变异概率pm为0.001;生成初始群体pop,随机产生,群体大小为popsize,个体长度为chromlength;进行20次迭代,i从1到20。
对染色体进行去色操作,将pop5的第1个染色体长度乘以10后除以1023,得到新的种群pop;执行endfplot函数,绘制函数10*sin(5*x)+7*cos(4*x)在0到10区间的图像,保持图像显示状态;接着关闭图像保持状态;计算y值中的最大值及其索引位置,将索引位置赋值给x5,以获取最大值对应的x值;对于函数f(x)=x^10*sin(5x)-7*cos(4x),在区间0≤x≤9内,采用二进制编码,种群个体数为10,编码长度为20,设置交叉概率为0.95,变异概率为0.08;编写目标函数sol,用于评估函数的值。
将函数存储于名为"fitness.m"的文件中,并置于工作目录中;初始化种群,种群规模为10x;执行遗传算法,参数设置包括:适应度函数为fitness,初始种群为initPop,容许误差为1e-6,最大迭代次数为11,最大遗传代数为25,选择策略为正常几何选择,交叉概率为0.08,变异策略为算术交叉,交叉次数为2,变异次数为2至25次,最终得到的解为x=7.856224。
当x等于7.8562时,函数f(x)达到其最大值,即24.8553。值得注意的是,遗传算法通常应用于寻找近似的最优解,而非绝对的最优解。遗传算法实例2【问题】针对5=Xi=5,i=1,2的区间,需找出函数f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.A2 x2.A2)-exp(0.5*(cos(2*pi*x1) cos(2*pi*x2) 22.71282))的最小值。
适应度函数的MATLAB代码如下:计算适应度值,首先对x向量中每个元素与A2矩阵对应元素相乘求和,然后除以numv得到平均值,接着计算该平均值的平方根,再乘以0.2,然后从指数函数中减去另一个由cos函数计算得到的平均值,该平均值是x向量中每个元素乘以2π后求和再除以numv,最后乘以-20,得到val值。适应度函数的MATLAB代码定义了一个函数fitness,它接受解sol和选项options作为输入,计算并返回适应度值eval。在遗传算法的MATLAB代码中,定义了参数bounds,它是一个2行1列的矩阵,所有元素均为-5到5之间的值。接着,执行遗传算法ga函数,传入bounds和fitness函数,得到种群p、终止种群pendPop、最佳解bestSols和追踪trace。注意:相关代码文件应保存为m文件,并放置在工作目录中,执行后得到的种群p的值为0。
大家可以直接绘制出函数f(x)的图像,从而对f(x)的最大值或最小值有一个大致的了解;同时,也可以通过运用优化函数来进行验证。在MATLAB的命令行中,执行fplot函数绘制曲线,其参数为x、10乘以sin(5x)、7乘以cos(4x),并指定y轴范围为从0到9。其中,evalops代表传递给适应度函数的参数,而opts表示二进制编码的精度。termops则是在选择maxGenTerm作为结束函数时,所传递的maxGenTerm参数,这实际上是指遗传算法的代数次数。xoverops是用于传递给交叉函数的参数,而mutops则是传递给变异函数的参数。在求解函数f(x)=x+10*sin(5x)+7*cos(4x)在区间0到9内的最大值时,我们采用了二进制编码的方法,并构建了种群。
个体数量达到10个,二进制编码的长度设定为20位,交叉率设定为0.95,变异率设定为0.08。在程序清单中,目标函数命名为`fun cti on sol`,其评估函数为`eval=fit ness(sol,opti ons)`。其中,`x=sol(1)`表示从解向量`sol`中提取第一个元素。评估函数的具体表达式为`eval=x+10*si n(5*x)+7*cos(4*x)`。该函数将被保存在名为`fitness.m`的文件中,并放置在工作目录下。接着,通过调用`initializega(10,0 9,fitness)`函数生成初始种群kaiyun全站网页版登录,种群大小为10x。随后,执行`ga(0 9,fitness,initPop,1e-6 11,maxGe nTerm,25, no rmGeomSelect,`函数进行遗传算法操作。
在0.08的遗传算法迭代中,当达到第25次运算时,变量x的值被确定为7.8562,此时函数f(x)达到了最大值24.8553。值得注意的是,遗传算法通常用于寻找近似的最优解,而非绝对的最优解。在5=Xi=5,i=1,2的指定区间内,我们需要找到函数f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.A2+x2.A2)-exp(0.5*(cos(2*pi*x1)+cos(2*pi* x2)+22.71282))的最小值。种群规模设定为10,最大迭代次数为1000,变异概率设定为0.1,交叉概率为0.3。【程序清单】
20、在Matlab中,对于源函数的编写,可以使用以下代码:eval=f(sol),其中,sol的大小为num v,即sol的列数;x是从sol中提取的前num v个元素;eval的值计算为-20乘以指数函数,指数部分为-0.2乘以x的平方根除以num v,再减去指数函数,其参数为x的余弦值乘以2π除以num v,最后加上22.71282。而对于适应度函数的编写,则采用以下代码:sol,eval=fitness(sol,options),其中,sol的列数减去1得到num v,即x的长度;x为sol的前num v个元素;eval通过调用f(x)函数得到,之后取其相反数。至于遗传算法的Matlab代码,则设定边界为ones(2,1)*-5 5,p和end作为后续操作使用。
弹出最佳解,追踪记录=遗传算法(bo un ds,适应度),注意:前两个文件以m格式保存,并置于当前工作目录,执行后得到的P值为0.0000,-0.0000,0.0055,您可以直接绘制f(x)的图像,对f(x)的最大值和最小值有个大致了解,或者也可以运用优化函数进行验证。在MATLAB命令行中运行fplot函数,其参数为x+10*sin(5*x)+7*cos(4*x),绘制图形的范围从0到9。其中,evalops参数用于传递给适应度函数,而opts参数则代表二进制编码的精度。另外,termops参数用于在达到最大遗传代数maxGenTerm时终止选择过程。xoverops是用于传递给交叉函数的参数,而mutops则是传递给变异函数的参数。