1

我在 Matlab 上运行遗传算法优化脚本,但最后会产生以下消息:“优化终止:惩罚适应度值的平均变化小于 options.TolFun 但不满足约束条件。”

为什么会这样说?我用一个什么都不做但返回一个常数的函数替换了我的适应度函数,没有任何改变。可能是我的约束定义不正确,尽管我找不到错误。这是代码的相关部分:

nGenerators = 9;
monthlyHours = 24*daysInJanuary;

(some irrelevant code here)

steamCapacities = [31.46*ones(1,2) 5.5*ones(1,3) 4*ones(1,4)];

nVars = xSize;
IntCon = 1:nVars;
LB = zeros(1, nVars);
UB = ones(1, nVars);

b = -1*steamLoad; % Ax <= b

A = zeros(monthlyHours, xSize);
for p = 1:monthlyHours
    A(p, 9*p-8:9*p) = -1*steamCapacities;
    % disp(p);
end

(some more code here)

anonFitness = @(x)mosb_test(x, fitnessData);

gaOptions = gaoptimset('Vectorized', 'off', 'UseParallel', 'always', ...
'Display', 'diagnose', 'PlotFcn', @gaplotbestf, 'Generations', 300, ...
'TolFun', 1e-15, 'StallGenLimit', 200);

[x, fval, exitFlag] = ga(anonFitness, nVars, A, b,[],[], LB, UB, [], IntCon, gaOptions);

在这里,x 表示每月每个小时一组 9 个发电机的开/关状态。它们的蒸汽生产能力与可变蒸汽能力一样,并且每小时必须满足恒定的蒸汽负荷。这由不等式约束表示。

任何帮助表示赞赏。

4

1 回答 1

0

有趣的问题!太糟糕了,它无法确定性地解决。:-( 无论如何,你的数学作品TolFun定义为:

正标量。如果 StallGenLimit 代的最佳适应度函数值的加权平均相对变化小于或等于 TolFun,则算法停止

并且StallGenLimit具有相同的描述。一个常数会给你同样的错误是完全有道理的。在我看来,遗传算法无法收敛到StallGenLimit200 代的解决方案。您可以尝试制作TolFun更具限制性的模型,例如 1e-12,或者尝试为 GA 开发一个更简单的模型,它只会让您找到解决方案。然后在此模型上构建复杂性,直到它与您的实际系统匹配。很可能,它会在某个时候失败,您将能够看到为什么无法解决问题,例如太多的自由度、太紧的约束等等。HTH!

于 2013-06-19T13:59:57.960 回答