2014-10-08 182 views
0

我有一個量化的健身功能的GA,預期其工作原理:MATLAB:遺傳算法 - 失敗的初始用戶提供的健身功能評價

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不尊重最初的種羣播種範圍,即使它明顯在指定範圍內。有什麼辦法解決這個問題?

+1

您可以編輯您的'fitfun'和disp已輸入'N'那裏。然後你可以看到什麼值導致錯誤。也許如果你分享他們,我們(我)可以幫助你。 – MeMyselfAndI 2014-10-08 13:07:48

+0

@JandeGier我附上了我能找到的任何相關信息。謝謝。 – Slaiyer 2014-10-08 13:32:06

回答

1

我的第一個猜測是將CreationFcn設置爲@gacreationuniform,但這不起作用:ga實現仍然顯示默認行爲並評估其條目等於下限值的向量(如果這些值較低邊界是有限的)。

的溶液,它迫使不同的第一載體在各選項InitialPopulation字段提供這個矢量。 (注意:確保你的初始矢量確實滿足邊界和約束,否則,ga仍然會使用他的方法來評估下界)

我希望能解決你的問題。

順便說一句,你可能包括檢查,如果三角就可以了(使用nonlcon約束函數,該函數)的約束。

+0

非常感謝。我不得不正是這種做截至目前,因爲即使明確填充與有效邊界整個'InitPopRange'矢量似乎並不滿足求解。 有沒有辦法通過其適應度函數可以識別哪一代號目前正在處理?就像可以訪問的狀態結構一樣? – Slaiyer 2014-10-08 15:27:50

+1

您可以在該函數中包含一個持久變量,用於統計調用次數。像這樣:'persistent counter','if isempty(counter),counter = 1; else counter = counter + 1; end'。你也可以傳遞'options'結構來派生我猜想的世代數,但是你必須在選項struct中首先設置世代值etcetera。 ('clear all'刪除持久變量並因此重置計數器。) – MeMyselfAndI 2014-10-08 15:31:09