Main Content

このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。

目的関数を計算する

目的(適応度)関数

Global Optimization Toolbox 関数を使用するには、まず最適化する関数を計算するファイル (または匿名関数) を作成します。これは、ほとんどのソルバーでは目的関数と呼ばれ、ga では適合度関数と呼ばれます。この関数は、長さが独立変数の数であるベクトルを受け入れ、スカラーを返す必要があります。gamultiobj の場合、関数は目的関数の値の行ベクトルを返す必要があります。ベクトル化されたソルバーの場合、関数は各行が 1 つの入力ベクトルを表す行列を受け入れ、目的関数値のベクトルを返す必要があります。このセクションでは、ファイルの書き込み方法を示します。

関数ファイルを書く

この例では、最適化する関数のファイルを作成する方法を示します。関数を最小化したいとします

f(x)=exp((x12+x22))(x122x1x2+6x1+4x223x2).

この関数を計算するファイルは、変数 x1 と x2 に対応する長さ 2 のベクトル x を受け入れ、x の関数の値に等しいスカラーを返す必要があります。

  1. MATLAB® File メニューから New > Script (Ctrl+N) を選択します。エディターで新しいファイルが開きます。

  2. 次の 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);
  3. ファイルを 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));

ベクトル化された関数を書く

gagamultiobjparetosearchparticleswarm、および patternsearch ソルバーは、オプションで 1 回の関数呼び出しでベクトルのコレクションの目的関数を計算します。この方法は、ベクトルの目的関数を順番に計算するよりも時間がかかりません。この方法はベクトル化された関数呼び出しと呼ばれます。

ベクトル化された方法で計算するには:

  • 目的関数を次のように記述します。

    • 任意の行数の行列を受け入れます。

    • 各行の関数値のベクトルを返します。

    • gamultiobj または paretosearch の場合、各行に、対応する入力行列行の目的関数値が含まれる行列を返します。

  • 非線形制約がある場合は、必ず制約をベクトル化された形式で記述してください。詳細については、ベクトル化された制約 を参照してください。

  • optimoptions を使用して UseVectorized オプションを true に設定します。patternsearch または paretosearch の場合は、 UseCompletePolltrue に設定します。必ずオプションをソルバーに渡してください。

例えば、関数ファイルを書くの目的関数をベクトル化して記述すると、

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_funpatternsearch のベクトル化された目的関数として使用するには:

options = optimoptions('patternsearch','UseCompletePoll',true,'UseVectorized',true);
[x fval] = patternsearch(@my_fun,[1 1],[],[],[],[],[],[],...
    [],options);

my_funga のベクトル化された目的関数として使用するには:

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_fungamultiobj のベクトル化された目的関数として使用するには:

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

関連するトピック