2013-06-19 106 views
1

我的遺傳算法優化腳本在Matlab上運行,但最終會產生以下消息:「優化終止:懲罰適應值的平均變化小於選項.TolFun但約束不滿足。MATLAB優化錯誤

爲什麼會這麼說?我用一個什麼都不做,但是返回一個常數的函數取代了我的健身函數,沒有任何改變。可能是我的約束沒有被正確定義,雖然我找不到這個錯誤。下面是代碼的相關部分:

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臺發電機。他們的蒸汽生產能力與可變蒸汽容量相同,每小時必須滿足恆定的蒸汽負荷。這由不平等約束來表示。

任何幫助表示讚賞。

回答

0

有趣的問題!太糟糕了,它不能被確定性地解決。 :-(無論如何,您的TolFunthe mathworks定義爲:

正標量的算法停止,如果超過StallGenLimit最好適應度函數值的加權平均相對變化 世代 小於或等於TolFun

StallGenLimit具有相同的描述。它的意義是恆定會給你同樣的錯誤。在我看來,該GA無法收斂到解在StallGenLimit,這裏200代。你可以嘗試製作TolFun更具限制性,比如1e-12,或者嘗試爲GA開發一個更簡單的模型,一個可以讓你找到解決方案的模型。然後在此模型上構建複雜性,直到它符合您的實際系統。可能的話,它會在某個時候失敗,你就會明白爲什麼這個問題不能像自由度太高,約束太緊等等來解決。HTH!