在matlab中intcon什么意思,GADST,你为何这么叼?(⼀)⼀周前,我的遗传算法在数值优化上再次失败。在此之前我尝试过遗传算法结合局部搜索(随机爬⼭、SQP、模式搜索),由于INTJ型⼈格认为结合局部信息的进化不是好进化,转⽽尝试了其他的⽅法:⼩⽣境技术(niching),以适应度共享的⼿段来维持种的多样性——在某些函数上取得了极好的效果,⽽参数的⾃适应控制却⾮常困难;多种技术(MPGA)——由于我的迁徙算法错误使得我的程序本质上就是⽤不同的控制参数进⾏多次计算;正交技术(OGA),通过构造正交矩阵,使得在初始化种和产⽣⼦代时能够均匀搜索整个解空间——在⼏个测试函数上都取得了不错的成果,但是后来我意识到这明明就是带启发式策略的⽹格搜索(grid
search),以及在⼀次离散事件仿真模拟的优化上得到了很糟糕的结果,加上计算开销⼤、运算速度慢,很快被我打⼊冷宫。再加上遗传算法在集合覆盖问题、TSP、Packing问题上令我蛋疼的表现,⼀度我对遗传算法的态度是“鸡肋,还不如⽤分⽀定界”,转⽽研究传统优化算法——序列⼆次规划(sequential
quadratic programming,SQP),在组合优化上也开始关注遗传算法结合回溯搜索。
由于在五⽉份的对仿真模拟的优化问题上,我使⽤的NPMEA算法在处理带约束的问题上让我印象深刻(之前我只⽤著名的G8函数做过测试),上周我怀着极⼤的信⼼采⽤它的单纯形交叉算⼦和⾃适应的⾼斯变异来做⽆约束优化(或者说是bound
constraint),但令⼈失望的是在某个五元函数上⼏乎连全局最优点的附近都搜索不到,增加了多种和
⼩⽣境运算速度⼜太慢,实在令⼈垂头丧⽓。
最后我抱着死马当活马医的态度打开gatool——我对这东西从来不屑⼀顾的,花⾥胡哨,不如⾃⼰coding来得快——结果太可怕了,⼀切参数采⽤默认设置,Schaffer函数以1的概率收敛到全局最优,颠覆三观!!我当时⼜是失落⼜是激动,⼼⾥只有两个字:“GADST,你为何这么叼?”⼀怒之下,把GADST的ga.m拆了,恍然⼤悟。
⼆、拆ga.m
step1:ga.m设置默认defaultopt
%-----------------------------e.g.---------------------------------
%代码取⾃ga.m 181th~202th rows
%默认编码类型为双精度编码
%默认⽣成初始种向量下界为0上界为1
%默认种⼤⼩为20
%默认使⽤gacreationuniform函数来⽣成均匀随机分布的初始种
defaultopt = struct('PopulationType', 'doubleVector', ...
'PopInitRange', [0;1],
...
'PopulationSize', 20,
...
'CreationFcn',@gacreationuniform);
step2:ga.m作各种检查和判断
%-----------------------------e.g.---------------------------------
%代码取⾃ga.m 251th~277th rows
%检查第⼗个输⼊变量,若存在且是结构体,则为整数约束规划
if nargin == 10 &&
isstruct(intcon)
options = intcon;
intcon = [];
end
%检查输⼊的FitnessFcn是不是function handles或者inlines,若不是则返回error
if isempty(FitnessFcn) ||
~(isa(FitnessFcn,'inline') ||
isa(FitnessFcn,'function_handle'))exit是什么意思英语
error(message('globaloptim:ga:needFunctionHandle'));
end
step3:ga.m对空的options结构域使⽤默认defaultopt
%-----------------------------e.g.---------------------------------
%代码取⾃ga.m 304th~308th rows
%若options为空,则使⽤默认的defaultopt
if ~isempty(options) &&
~isa(options,'struct')
error(message('globaloptim:ga:optionsNotAStruct'));
elseif isempty(options)
options =
defaultopt;
end
step4:ga.m调⽤⼦函数gacommon判断问题类型和种编码类型
%-----------------------------e.g.---------------------------------
%代码取⾃gacommon.m
14th~33th rows
%若结构体nonlcon⾮空则为⾮线性约束规划,若线性等式约束矩阵⾮空则为线性约束规划,若上下界矩阵⾮空%则为边界约束规划,若都为空则为⽆约束规划
if ~isempty(nonlcon)
type =
'nonlinearconstr';
elseif ~isempty(Aeq) || ~isempty(beq) || ~isempty(Aineq) ||
~isempty(bineq)
type =
'linearconstraints';
elseif ~isempty(lb) || ~isempty(ub)
type =
'boundconstraints';
else
type =
'unconstrained';
end
step5:ga.m对不同类型的问题调⽤不同⼦求解器
%-----------------------------e.g.---------------------------------
%代码取⾃ga.m 349th~359th rows
%'unconstrained'调⽤⽆约束规划求解器gaunc,'boundconstraints'和'linearconstraints'调⽤线性规划求解%器galincon,'nonlinearconstr'调⽤⾮线性规划求解器gacon。
switch (output.problemtype)
case
'unconstrained'
[x,fval,exitFlag,output,population,scores] =
gaunc(FitnessFcn,nvars, ...
options,output,Iterate);
case
{'boundconstraints', 'linearconstraints'}
[x,fval,exitFlag,output,population,scores] =
galincon(FitnessFcn,nvars, ...
Aineq,bineq,Aeq,beq,lb,ub,options,output,Iterate);
case
'nonlinearconstr'
[x,fval,exitFlag,output,population,scores] =
gacon(FitnessFcn,nvars, ...
Aineq,bineq,Aeq,beq,lb,ub,NonconFcn,options,output,Iterate,type);
end
(下⾯以boundconstraints为例,调⽤galincon)
step6:在galincon.m中调⽤⼦函数makeState来初始化结构数组state
%-----------------------------e.g.---------------------------------
%代码取⾃makeState.m 10th~30th rows
%初始化当前进化代数和当前停⽌代数
state.Generation = 0;
state.LastImprovement = 1;
%调⽤options.CreationFcn⾥的函数来⽣成初始种,见step7
state.Population =
feval_r(options.CreationFcn,GenomeLength,FitnessFcn,options,
options.CreationFcnArgs{:});
(下⾯以默认的gacreationuniform函数为例,⽣成初始种)
step7:在gacreationuniform.m⾥通过⽤户提供的初始种和初始种范围来随机⽣产种%-----------------------------e.g.---------------------------------
%代码取⾃gacreationuniform.m 42th~46th rows
%在PopInitRange范围内⽣成均匀分布的随机初始种
%等价于Population=
unifrnd(lb,ub,initPopProvided+1,PopSize);
range = options.PopInitRange;
lowerBound = range(1,:);
span = range(2,:) - lowerBound;
Population(initPopProvided+1:end,:) =
repmat(lowerBound,individualsToCreate,1) + ...
repmat(span,individualsToCreate,1) .*
rand(individualsToCreate,GenomeLength);
step8:在galincon.m中调⽤⼦函数gadsplot继续初始化结构数组state,为作图做准备略..
step9:在galincon.m中判断是否满⾜进化结束条件,若不满⾜则进化⼀次
%-----------------------------e.g.---------------------------------
%代码取⾃galincon.m 48th~91th rows
while isempty(exitFlag)
%进化代数加⼀
state.Generation =
state.Generation + 1;
%函数stepGA内完成排序\选择\交叉\变异和种的进化,见step10
[score,population,state]
=
stepGA(score,population,options,state,GenomeLength,FitnessFcn);
%记录最佳个体
best =
min(state.Score);
generation =
state.Generation;
state.Best(generation) =
best;
%判断和进⾏迁徙操作(仅针对多种)
state =
migrate(FitnessFcn,GenomeLength,options,state);
%更新图像输出
state =
gadsplot(options,state,currentState,'Genetic Algorithm');
end
step10:stepGA.m产⽣精英后代、交叉后代和变异后代
%-----------------------------e.g.---------------------------------
%代码取⾃stepGA.m 9th~36th rows
%精英后代数⽬
nEliteKids = options.EliteCount;
%交叉后代数⽬
nXoverKids = round(options.CrossoverFraction *
(size(thisPopulation,1) - nEliteKids));
%变异后代数⽬
nMutateKids = size(thisPopulation,1) - nEliteKids -
nXoverKids;
%⽤于产⽣交叉和变异所需的⽗代数⽬
nParents = 2 * nXoverKids + nMutateKids;
%适应度排序操作,见step11
state.Expectation =
feval_r(options.FitnessScalingFcn,thisScore,nParents,...
options.FitnessScalingFcnArgs{:});
%选择交叉和变异所需的后代,见step12
parents =
feval_r(options.SelectionFcn,state.Expectation,nParents,options,... options.SelectionFcnArgs{:});
[unused,k] = sort(thisScore);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论