廖貅武教授的软计算方法课程,作业包括两个小作业和一个大作业。这是其中的一个小作业,花费时间大约2.5h。
考虑到我是以一种应付差事的心态来做作业,因而我选择了一种最省力最没有技术含量的方法。使用Matlab的GAOT工具箱。
基于Matlab的遗传算法工具箱有好多种,是不同的人在不同的时间开发的,现在已知的有:
(1)GAOT,中国学术期刊网上大部分研究遗传算法的中文论文都是使用的这个工具箱这个工具箱用的似乎是最广的,虽然不是Matlab自带的,但在网上也很容易下载到。然而它的版本实在是太老了,是适用于Matlab5.0版的,因为它的全名是The Genetic Algorithm Optimization Toolbox (GAOT) for Matlab 5,而且似乎到目前为止还没有更新版本发布。
(2)SGALAB 是在研学论坛上看到的,我对它并不了解,只是知道个名字而已,研学论坛的”遗传算法”板上有一些帖子是介绍这个工具箱的,有兴趣的话可以去看看。
(3)GADS 这个是Matlab7.0版本自带的工具箱,全名叫Genetic Algorithm and Direct Search Toolbox。在Matlab7.0的Help里面有对这个工具箱的详细介绍,还有很多例子作演示。
GAOT工具箱可以在http://www.ise.ncsu.edu/mirage/GAToolBox/gaot/ 下载。按照其中的readme所说,将压缩包解压到任意目录,然后在matlab的命令行输入如 >>path(path,’E:/GAToolBox/gaot’); ,其中引号内部分改为你的gaot文件夹位置。然后GAOT工具箱就可用了。
GAOT工具箱中有一个求函数f(x)=x+10*sin(5*x)+7*cos(4*x)最大值的示例,网上讲GAOT的中文资料几乎全都拿这个例子来说事。考虑到作业应该有那么一点原创性,因而我把它改成了求f(x)=x+30*sin(0.5x)+16*cos(0.4x)的最大值……
建立m文件fitness.m,内容为
function[sol,eval]=fitness(sol,options)
x=sol(1);
eval=x+30*sin(0.5*x)+16*cos(0.4*x);
建立m文件Gene.m,内容为
initPop=initializega(20,[0 100],’fitness’);%生成初始种群,大小为20
[x endPop,bPop,trace]=ga([0 100],’fitness’,[],initPop,[1e-4 1 1], ‘maxGenTerm’, 100, ‘normGeomSelect’,…
[0.08],['arithXover'],[2],’nonUnifMutation’,[2 100 3])
运行Gene.m,结果就出来了。
Plot(:,2:3);就画出了历史最优值和当前代最优值的曲线。计算出最优结果为
x = 91.9436 129.0239
即当x= 91.9436时,有最大值129.0239。
附上关于GAOT的简易说明:
核心函数:
(1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)–初始种群的生成函数
【输出参数】
pop–生成的初始种群
【输入参数】
num–种群中的个体数目
bounds–代表变量的上下界的矩阵
eevalFN–适应度函数
eevalOps–传递给适应度函数的参数
options–选择编码形式(浮点编码或是二进制编码)[precision F_or_B],如
precision–变量进行二进制编码时指定的精度
F_or_B–为1时选择浮点编码,否则为二进制编码,由precision指定精度)
(2)function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,…
termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)–遗传算法函数
【输出参数】
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 02 32 0]
mutFNs–变异函数表,如[boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation]
mutOps–传递给交*函数的参数表,如[4 0 06 100 34 100 34 0 0]



今天听某老师讲了这个算法,云里雾里的..
[回复]
@nuorilang, 呵呵
[回复]
真是发现了好东西啊
[回复]
技术贴啊……
[回复]
按你方法加载工具箱后,运行出现:
??? Error using ==> ga
Too many input arguments.
如何改正?
[回复]
@wu, 就按错误提示的改啊,“Too many input argument”,那就是输入参数过多呗,你自己看看多了哪个。
[回复]