【问题标题】:MATLAB: Genetic algorithm - Failure in initial user-supplied fitness function evaluationMATLAB:遗传算法 - 初始用户提供的适应度函数评估失败
【发布时间】:2014-10-08 23:23:08
【问题描述】:

我有一个带有矢量化适应度函数的 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),导致delaunayTriangulation显然是空的。

N2 = reshape(N(i,:), 3, NUM).'

N2 =
   1.0e+03 *
   -0.0009   -0.0007    3.0000
    0.0007   -0.0002    3.0000
   -0.0005    0.0019    3.0000
    0.0002    0.0005    3.0000
    0.0021   -0.0009    3.0000
    0.0009    0.0015    3.0000
   -0.0007   -0.0005    3.0000
   -0.0008   -0.0013    3.0000
   -0.0004    0.0020    3.0000
   -0.0001    0.0003    3.0000
    0.0011    0.0010    3.0000
    0.0015    0.0010    3.0000
    0.0009    0.0013    3.0000
   -0.0008   -0.0010    3.0000
   -0.0005    0.0010    3.0000
   -0.0002    0.0020    3.0000
   -0.0003   -0.0001    3.0000
    0.0002    0.0015    3.0000
   -0.0008    0.0010    3.0000
   -0.0007    0.0017    3.0000
    0.0005    0.0018    3.0000
   -0.0002   -0.0003    3.0000
   -0.0006    0.0010    3.0000
   -0.0000    0.0008    3.0000
   -0.0006   -0.0012    3.0000

这似乎是 GA 不尊重初始种群播种范围的情况,即使它显然在指定的范围内。有什么办法可以解决这个问题?

【问题讨论】:

  • 您可以编辑您的fitfun 并在那里显示输入N。然后您可以查看导致错误的值。也许如果你分享它们,我们(我)可以帮助你。
  • @JandeGier 我已经附加了我能找到的任何相关信息。谢谢。

标签: matlab vectorization genetic-algorithm


【解决方案1】:

我的第一个猜测是将CreationFcn 设置为例如@gacreationuniform,但这不起作用:ga 实现仍然表现出默认行为并评估其条目等于下限值的向量(如果这些下界是有限的)。

强制使用不同的第一个向量的解决方案是在选项的InitialPopulation 字段中提供此向量。 (注意:确保你的初始向量确实满足边界和约束,否则,ga 仍将使用他的评估下限的方法)

希望能解决你的问题。

顺便说一句,您可以包含一个检查三角测量是否有效的约束(为此使用nonlcon 约束函数)。

【讨论】:

  • 非常感谢。到目前为止,我必须这样做,因为即使使用有效边界显式填充整个 InitPopRange 向量似乎也不能满足求解器的要求。有没有一种方法可以让适应度函数识别当前正在处理的代号?类似于可以访问的状态结构?
  • 您可以在该函数中包含一个持久变量,用于计算调用次数。像这样:persistent counterif isempty(counter), counter = 1; else counter = counter + 1; end。你也可以通过options 结构来推导我猜的世代号,但是你必须首先在选项结构中设置世代值等等。 (clear all 删除持久变量并因此重置计数器。)
猜你喜欢
  • 2016-02-02
  • 1970-01-01
  • 2019-12-26
  • 2020-05-12
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2023-02-20
  • 2012-04-27
相关资源
最近更新 更多