我有一个带矢量化适应度函数的GA,它按预期工作:
objFunc = @(N) -fitfun(N, foo, NUM);
[ N, ~, ~, ~, ~, ~ ] = ga(objFunc, 3 * NUM, [], [], [], [], ...
[], [], [], options);
当引入界限时,它不再是:
UB = Inf(1, 3 * NUM);
LB = -UB;
for i = 3 : 3 : 3 * NUM
LB(i) = 3000;
UB(i) = 9000;
end
objFunc = @(N) -fitfun(N, foo, NUM);
[ N, ~, ~, ~, ~, ~ ] = ga(objFunc, 3 * NUM, [], [], [], [], ...
LB, UB, [], options);
相应的堆栈跟踪:
> Error using delaunayTriangulation/convexHull
The triangulation is empty.
> Error in fitfun (line 66)
[ facets, volume(i) ] = convexHull(DT);
> Error in run_fitfun>@(N)-fitfun(N,foo,NUM) (line 127)
objFunc = @(N) -fitfun(N, foo, NUM);
> Error in createAnonymousFcn>@(x)fcn(x,FcnArgs{:}) (line 11)
fcn_handle = @(x) fcn(x,FcnArgs{:});
> Error in makeState (line 64)
Score = FitnessFcn(state.Population(initScoreProvided+1:end,:));
> Error in galincon (line 17)
state = makeState(GenomeLength,FitnessFcn,Iterate,output.problemtype,options);
> Error in ga (line 359)
[x,fval,exitFlag,output,population,scores] =
galincon(FitnessFcn,nvars, ...
> Error in run_fitfun (line 140)
[ N, ~, ~, ~, ~, ~ ] = ga(objFunc, 3 * NUM, [], [], [], [], ...
> Caused by:
Failure in initial user-supplied fitness function evaluation. GA cannot
continue.
要说清楚,我已设置'MutationFcn', @mutationadaptfeasible
,并且还使用'Vectorized', 'off'
进行了尝试。
修改
事实证明,我在选项中设置了'PopInitRange', [ 5000; 7000 ]
,但GA的第一个(零?)生成显示传入的向量为每个第三个变量设置了LB(3000),导致{ {1}}显然是空的。
delaunayTriangulation
这似乎是GA不遵守初始种群播种范围的情况,即使它明显在指定范围内。有什么可以绕过这个?
答案 0 :(得分:1)
我的第一个猜测是将CreationFcn
设置为例如@gacreationuniform
,但这不起作用:ga实现仍然显示默认行为并评估条目等于的向量下限值(如果这些下限是有限的)。
强制使用不同的第一个向量的解决方案是在选项的InitialPopulation
字段中提供此向量。 (注意:确保你的初始向量确实满足边界和约束,否则,ga
仍将使用他评估下界的方法)
我希望能解决你的问题。
顺便说一句,您可以包含一个约束来检查三角测量是否有效(使用nonlcon
约束函数)。