このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
目的関数を計算する
目的(適応度)関数
Global Optimization Toolbox 関数を使用するには、まず最適化する関数を計算するファイル (または匿名関数) を作成します。これは、ほとんどのソルバーでは目的関数と呼ばれ、ga
では適合度関数と呼ばれます。この関数は、長さが独立変数の数であるベクトルを受け入れ、スカラーを返す必要があります。gamultiobj
の場合、関数は目的関数の値の行ベクトルを返す必要があります。ベクトル化されたソルバーの場合、関数は各行が 1 つの入力ベクトルを表す行列を受け入れ、目的関数値のベクトルを返す必要があります。このセクションでは、ファイルの書き込み方法を示します。
関数ファイルを書く
この例では、最適化する関数のファイルを作成する方法を示します。関数を最小化したいとします
この関数を計算するファイルは、変数 x1 と x2 に対応する長さ 2 のベクトル x
を受け入れ、x
の関数の値に等しいスカラーを返す必要があります。
MATLAB® File メニューから New > Script (Ctrl+N) を選択します。エディターで新しいファイルが開きます。
次の 2 行のコードを入力します。
function z = my_fun(x) z = x(1)^2 - 2*x(1)*x(2) + 6*x(1) + 4*x(2)^2 - 3*x(2);
ファイルを MATLAB パスのフォルダーに保存します。
ファイルが正しい値を返すことを確認します。
my_fun([2 3]) ans = 31
gamultiobj
の場合、3 つの目的があるとします。目的関数は、3 つの目的関数値で構成される 3 要素のベクトルを返します。
function z = my_fun(x) z = zeros(1,3); % allocate output z(1) = x(1)^2 - 2*x(1)*x(2) + 6*x(1) + 4*x(2)^2 - 3*x(2); z(2) = x(1)*x(2) + cos(3*x(2)/(2+x(1))); z(3) = tanh(x(1) + x(2));
ベクトル化された関数を書く
ga
、gamultiobj
、paretosearch
、particleswarm
、および patternsearch
ソルバーは、オプションで 1 回の関数呼び出しでベクトルのコレクションの目的関数を計算します。この方法は、ベクトルの目的関数を順番に計算するよりも時間がかかりません。この方法はベクトル化された関数呼び出しと呼ばれます。
ベクトル化された方法で計算するには:
目的関数を次のように記述します。
任意の行数の行列を受け入れます。
各行の関数値のベクトルを返します。
gamultiobj
またはparetosearch
の場合、各行に、対応する入力行列行の目的関数値が含まれる行列を返します。
非線形制約がある場合は、必ず制約をベクトル化された形式で記述してください。詳細については、ベクトル化された制約 を参照してください。
optimoptions
を使用してUseVectorized
オプションをtrue
に設定します。patternsearch
またはparetosearch
の場合は、UseCompletePoll
もtrue
に設定します。必ずオプションをソルバーに渡してください。
例えば、関数ファイルを書くの目的関数をベクトル化して記述すると、
function z = my_fun(x) z = x(:,1).^2 - 2*x(:,1).*x(:,2) + 6*x(:,1) + ... 4*x(:,2).^2 - 3*x(:,2);
my_fun
を patternsearch
のベクトル化された目的関数として使用するには:
options = optimoptions('patternsearch','UseCompletePoll',true,'UseVectorized',true); [x fval] = patternsearch(@my_fun,[1 1],[],[],[],[],[],[],... [],options);
my_fun
を ga
のベクトル化された目的関数として使用するには:
options = optimoptions('ga','UseVectorized',true); [x fval] = ga(@my_fun,2,[],[],[],[],[],[],[],options);
gamultiobj
またはparetosearch
の場合、
function z = my_fun(x) z = zeros(size(x,1),3); % allocate output z(:,1) = x(:,1).^2 - 2*x(:,1).*x(:,2) + 6*x(:,1) + ... 4*x(:,2).^2 - 3*x(:,2); z(:,2) = x(:,1).*x(:,2) + cos(3*x(:,2)./(2+x(:,1))); z(:,3) = tanh(x(:,1) + x(:,2));
my_fun
を gamultiobj
のベクトル化された目的関数として使用するには:
options = optimoptions('ga','UseVectorized',true); [x fval] = gamultiobj(@my_fun,2,[],[],[],[],[],[],options);
patternsearch
のベクトル化された関数の記述の詳細については、目的関数と制約関数をベクトル化する を参照してください。ga
のベクトル化された関数の記述の詳細については、適応度関数をベクトル化する を参照してください。
勾配とヘッセ行列
GlobalSearch
または MultiStart
を使用する場合、目的関数は導関数 (勾配、ヤコビアン、またはヘッセ行列) を返すことができます。この構文を目的関数に含める方法の詳細については、勾配とヘッシアンを含める を参照してください。optimoptions
を使用して、ソルバーが導関数情報を使用するようにオプションを設定します。
ローカルソルバー = fmincon、fminunc
条件 | オプション設定 |
---|---|
目的関数には勾配が含まれる | 'SpecifyObjectiveGradient' = true ; 勾配を含める方法 を参照 |
目的関数にはヘッセ行列が含まれる | 'HessianFcn' = 'objective' または関数ハンドル。ヘッシアンを含める を参照 |
制約関数には勾配が含まれる | 'SpecifyConstraintGradient' = true ; 制約関数に勾配を含める を参照 |
ローカル ソルバー = lsqcurvefit、lsqnonlin
条件 | オプション設定 |
---|---|
目的関数にはヤコビアンが含まれる | 'SpecifyObjectiveGradient' = true |