logo资料库

matlab goat 工具箱的例子.doc

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
首先要添加路径。 应该点击 file->set path->add folder 选择你的 gaot 工具箱所在的文件夹,添加完了再点击 save.不过在添 加前要注意的是打开你电脑里的 GAOT 工具箱,里面有一个 startup.m 文件,双击打开,要将路径改为当 前路径,复制地址栏就可以了 第二,自己需要编写目标函数, function[sol,eval]=函数名[sol,options] 或者 function[val]=函数名[sol] (来自 coranaEval 范例) numv=size(sol,2) (返回数组 sol 的列数) startPop = initializega(20,bounds,'fitq',[],[1e-6 1]) 例:问题】在-5<=Xi<=5,i=1,2 区间内,求解 f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2+x2.^2)))-exp(0.5*(cos(2*pi*x1)+cos(2*pi*x2)))+22.71282 的 【分析】种群大小 10,最大代数 1000,变异率 0.1,交叉率 0.3 最小值。 【程序清单】 %源函数的 matlab 代码 function [eval]=f(sol) numv=size(sol,2); x=sol(1:numv); eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x))/numv)+22.71282; %适应度函数的 matlab 代码 function [sol,eval]=fitness(sol,options) numv=size(sol,2)-1; (输入矩阵 sol 的列数-1,?因为最后一列是适应度值) x=sol(1:numv); eval=f(x); eval=-eval; %遗传算法的 matlab 代码 bounds=ones(2,1)*[-5 5]; [p,endPop,bestSols,trace]=ga(bounds,'fitness') 注:前两个文件存储为 m 文件并放在工作目录下,运行结果为 p = 0.0000 -0.0000 0.0055 遗传算法中 sol(1)的解释 要理解 sol 的含义首先要了解 initPop 的结构,它的每行代表种群中的一个个体,假如有 n 个变量,那么每 行的前 n 列就代表每个变量的值,如 x1,x2....,xn,最后一列代表的是这些变量的适应值,也就是 eval。由 于 intializega 函数执行时,要调用 fitness 函数,并且传递给 fitness 函数一个个体的信息,该个体信息是 1
行 n+1 列的向量,所以 sol 得到的值实际是 1 行 n+1 列的向量,但是计算适应值只有用到前 n 个信息就行 了,即用到(x1,x2....,xn)的值,因此 fitness 调用 sol(1:n). 一般情况下 x 只是单变量,即 n=1,所以就会出现调用 sol(1)了 (1)初始化(必须有) 初始化的程序存在 initialize.m 文件中,初始化函数用法如下: Function[pop]= initialize(num,bounds,evalFN,evalops,options) 主要输入参数有:Num:群体数目;Bounds:变量上限和下限组成的矩阵;evalFN:评价函数的文件名,通常是.m 文件; Options:一个向量[epsilon float\binary prec],这里 epsilon 表示两代之间的差距;第二个参数取 0 表示 采用二进制编码,取 1 表示采用实数本身;prec 表示变量的精度;默认值为[le-6 1 ](可选择的)。输出参数 pop 中包含有初始群体的变量值和适应值。 chushihuapop=initializega(50,ones(vnum,1)*[上限,下限],适应函数,) bounds=ones(vnum,1)*[下限,上限]; [le-6 0 0] (2)选择操作 选择或复制操作是决定哪些个体可以进入下一代。 工具包中提供了赌轮盘选择法(roulette),锦标赛选择法(tournSelect)和几何规划排序选择 (normGeomSelect)。 如采用几何规划排序选择可用:function[newPop] =normGeomSelect(oldPop,options),其中 options 为选择 概率;oldpop 为旧群体。 (3)交叉操作 交叉过程是选取 2 个个体作为父代 parent1,parent2,产生出 2 个新的子代个体 child1 和 child2。 GAOT 中提供了:arithXover,heuristicXover,simpleXover 三种交叉方式。 如算术交叉(arithXover)的实现可通过调用 function [c1,c2] =arithXover(p1,p2,bounds,ops)得到。该函数会 机数 a;然后通过父代 p1 和 p2:p1*a+ p2*(1-a),p1*(1-a) + p2*a 得到子代个体 c1 和 c2。 产生一个随 (4)变异操作 GAOT 提供了几个变异操作的 M 文件:binaryMutation.m, boundaryMutation.m, multiNonUnifMutation.m, nonUnifMutation.m, unifMutation.m, 在各个不同的M 文件中包含了不同的变异操作,如nonUnifMutation.m 文件中包含了非统一变异函数:function [parent]= nonUnifMutate(parent,bounds,ops);其输入参数有 parent: 父代对应的变量值和适应值,bounds:变量上限和下限组成的矩阵,ops:nonUnifMutate 的参数[当前代…]。 (5)评价函数(必须有) *eval.m 是遗传算法与具体应用问题的惟一接口,是进行自然选择的惟一依据。改变种群内部结构的遗传操
作均要通过评价函数加以控制。许多类型的评价函数都可以用于遗传算法,但他应至少要满足一个条件:函数 值部分有序地分布。在*eval.m 应包含有这样一行: function [val,sol]=gaFxeval(sol,options), 其中 sol 为群体中各个个体的值,val 为个体的适应值。 如求函数 F(x)=x*sin(10*π*x)+1,在 x∈[-1,2]范围内的极大值。F(x)为 x 的评价函数。那么编写评价函数 M 文件的代码应有以下 3 行: function [val,sol]=gaFxeval(sol,options) %sol:群体中各个个体的值,val:个体的适应值 x=sol(:,1); val= x*sin(10*pi*x)+1; %获取各变量的值 %计算出各变量的评价值 (6)终止函数 在 GAOT 中提供了这 2 个终止文件:maxGenTerm.m(到某一最大的代数停止)和 optMaxGenTerm.m(偏差 作为终止条件)。如采用最大代数终止,可以在 maxGenTerm.m 文件中添加: function [done] = maxGenTerm(ops,bPop,endPop) % ops 一个参数向量 % bPop-最优解组成的一个数组 % endPop-当前代的个体和对应的适应值 currentGen = ops(1); maxGen= ops(2); done= currentGen >= maxGen; (7)主程序函数 [x,endPop,bPop,trace]= ga(bounds,Min ); 主程序函数的作用是调用相应的遗传操作函数,完成遗传优化,主程序函数是 ga.m,其用法如下: function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts, termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps) =ga(变量上下界的矩阵,适应度函数,传递给适应度函数的参数,初始种群,options 参数,终止函数的名称,传递 给终止函数的参数,选择函数的名称,传递给选择函数的参数,交叉函数名称表,传递给交叉函数的参数 表,变异函数表,传递给交叉函数的参数表) 【输出参数】 x--求得的最优解 endPop--最终得到的种群 bPop--最优种群的一个搜索轨迹 【输入参数】 bounds--代表变量上下界的矩阵 evalFN--适应度函数 evalOps--传递给适应度函数的参数 startPop-初始种群 opts[epsilon prob_ops display]--opts(1:2)等同于 initializega 的 options 参数,第三个参数控制是否输出, 一般为 0。如[1e-6 1 0] termFN--终止函数的名称,如['maxGenTerm'] termOps--传递给终止函数的参数,如[100]
selectFN--选择函数的名称,如['normGeomSelect'] selectOps--传递给选择函数的参数,如[0.08] xOverFNs--交叉函数名称表,以空格分开,如['arithXover heuristicXover simpleXover'] xOverOps--传递给交叉函数的参数表,如[2 0;2 3;2 0] mutFNs--变异函数表,如['boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation'] mutOps--传递给交叉函数的参数表,如[4 0 0;6 100 3;4 100 3;4 0 0]
分享到:
收藏