私は、matlab でグローバル最適化ツールボックスの完全にパラメーター化されたフィットネス関数を書くのに苦労しています。
アプローチ:
[x fvall,exitflag,output]=ga(fitnessfcn,nvars,A,b,Aeq,beq,lb,ub)
呼び出すフィットネス関数があります
fitnessfcn=@fitnessTest;
したがって、関数は別のファイルに記載されています。
問題: 私の問題は、私の最適化が単純ですが、次のような非常に長い合計であることです
cost=f1*x1+f2x2+...fnxn
n はパラメータ化する必要があります (現時点では 384)。すべての matlab ヘルプ ファイルで、目的関数は常に短くてきれいです。
y = 100 * (x(1)^2 - x(2)) ^2 + (1 - x(1))^2;
目的関数をインテリジェントに「書く」いくつかのアプローチを試しましたが、関数を正しく呼び出すことができません。
フィットネス関数を手動で記述した場合 (fi=1 の場合)
function y = simple_fitness(x)
y = x(1)+ x(2)+ x(3)+ x(4)+ x(5)+ x(6)+ x(7)+ x(8);
グローバル最適化が機能します
しかし、自動化されたアプローチを使用すると、次のようになります。
n = 8; %# number of function handles
parameters = 1:1:n;
store = cell(2,3);
for i=1:n
store{1,i} = sprintf('x(%i)',parameters(i));
store{2,i} = '+'; %# operator
end
%# combine such that we get
%# sin(t)+sin(t/2)+sin(t/4)
funStr = [store{1:end-1}];%# ignore last operator
endFunction=';';
%functionHandle = str2func(funStr)
y=strcat(funStr,endFunction)
matlab は関数を正しく認識しません。
エラー:
添字付きの代入次元が一致しません。
fcnvectorizer のエラー (14 行目) y(i,:) = feval(fun,(pop(i,:)));
ありがとう!数百の変数があるため、目的関数を手で書くことはできません。