首先要添加路径。
应该点击 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]