1

私は、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,:)));

ありがとう!数百の変数があるため、目的関数を手で書くことはできません。

4

1 に答える 1