【问题标题】:Octave genetic algorithm not using lower bounds八度遗传算法不使用下限
【发布时间】:2018-04-27 19:52:24
【问题描述】:

是否有让 Octave 的遗传算法求解器尊重上限和下限的技巧?例如,

options = gaoptimset('Generations', 10);
nvars = 6;
LB = ones(1,nvars);
UB = LB*10;
[soln, fval, exitflag] = ga(@fitnessfcn, nvars, [], [], [], [], LB, UB, [], options)

求解器返回一个边界未定的解。例如,

soln = 0.551420   1.369775  -0.313379  -0.038621   0.274696   1.359802

更新:我检查了 Octave 包中的脚本。我很确定 ga 函数不使用上限和下限参数。它似乎确实从 gaoptim 集中读取了一些上限/下限信息。有时间我会玩弄它的。

【问题讨论】:

  • 嗨!如果您确实发现了问题并加以解决,能否请您向 Octave Forge 开发者提交补丁?

标签: octave genetic-algorithm


【解决方案1】:

根据 0.10 版,作为参数传递给 ga 的边界几乎被忽略了。目前,指定边界的唯一方法是通过gaoptimset 的参数PopInitRange,它需要一个包含第一行中的LB 和第二行中的UB 的2xN 矩阵。如果提供了 2x1 向量。

LB 和 UB 参数应该是模仿原始 Matlab 的 ga 函数,但显然实现是他自己的方式。

【讨论】:

    【解决方案2】:

    问题

    我可以确认八度 ga 数据包中的 ga() 实现没有使用参数边界。

    解决方法

    我通过检查我的 score 函数中的边界并在违反边界时给出恒定的高罚分 ParaOutOfRangePenalty 来解决这个限制。您可以在 fitnessfcn() 中类似地实现这一点:

    % Your problem specific score calculation goes here:
    score = myfitnessfcn(data,parameters);
    
    % Add score for each parameter outside limits to create a "soft" punishment
    score = score + sum(parameters(:) < lowerBound))*ParaOutOfRangePenalty;
    score = score + sum(parameters(:) > upperBound))*ParaOutOfRangePenalty;
    

    结果

    我发现 octave ga() 算法使用这种方法显然尊重边界。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 2020-05-12
      • 1970-01-01
      • 2011-01-11
      • 2015-02-16
      • 2016-03-10
      • 1970-01-01
      相关资源
      最近更新 更多