Main Content

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

目的関数と制約関数をベクトル化する

スピードを上げるためにベクトル化

目的関数と非線形制約関数を ベクトル化 すると、直接検索の実行速度が速くなることがよくあります。つまり、関数は、ポイントを 1 つずつループ処理する必要なく、1 回の関数呼び出しで、ポーリングまたは検索パターン内のすべてのポイントを一度に評価します。したがって、オプション UseVectorized = true は、 UseCompletePoll または UseCompleteSearchtrue に設定されている場合にのみ機能します。ただし、UseVectorized = true を設定すると、patternsearch は、UseCompletePoll または UseCompleteSearch オプションの設定に関係なく、目的関数と非線形制約関数がベクトル化された計算に対して正しい形状の出力を与えるかどうかをチェックします。

非線形制約がある場合、アルゴリズムがベクトル化された方法で計算できるように、目的関数と非線形制約をすべてベクトル化する必要があります。

メモ

任意の数の点を持つ行列を受け入れるようにベクトル化された目的関数または非線形制約関数を記述します。patternsearch は、ベクトル化された計算中でも単一の点を評価することがあります。

ベクトル化された目的関数

ベクトル化された目的関数は、入力として行列を受け取り、関数値のベクトルを生成します。各関数値は、入力行列の 1 つの行または列に対応します。patternsearch は、行列の行または列がパターンのポイントを表すかどうかの曖昧さを次のように解決します。入力行列に m 行と n 列があるとします。

  • 初期点 x0 がサイズ m の列ベクトルである場合、目的関数は行列の各列をパターン内の点として受け取り、サイズ n の行ベクトルを返します。

  • 初期点 x0 がサイズ n の行ベクトルである場合、目的関数は行列の各行をパターン内の点として受け取り、サイズ m の列ベクトルを返します。

  • 初期点 x0 がスカラーの場合、patternsearchx0 が行ベクトルであると想定します。したがって、入力行列には 1 つの列 (n = 1、入力行列はベクトル) があり、行列の各エントリは評価する目的関数の 1 つの行を表します。この場合の目的関数の出力は、サイズが m の列ベクトルです。

図的に、マトリックスと計算は次の図で表されます。

ベクトル化された関数の構造

例えば、目的関数が

f(x)=x14+x244x122x22+3x1x2/2.

であるとします。初期ベクトルx0[0;0]のような列ベクトルである場合、ベクトル化された評価関数は次のようになります。

function f = vectorizedc(x)

f = x(1,:).^4+x(2,:).^4-4*x(1,:).^2-2*x(2,:).^2 ...
    +3*x(1,:)-.5*x(2,:);
初期ベクトルx0[0,0]のような行ベクトルである場合、ベクトル化された評価のための関数は
function f = vectorizedr(x)

f = x(:,1).^4+x(:,2).^4-4*x(:,1).^2-2*x(:,2).^2 ...
    +3*x(:,1)-.5*x(:,2);

ヒント

パターン検索と遺伝的アルゴリズムの両方に同じ目的 (適応度) 関数を使用する場合は、ポイントが行ベクトルで表されるように関数を記述し、x0 を行ベクトルとして記述します。遺伝的アルゴリズムでは、個体は常に行列の行として扱われます。これは設計上の決定でした。遺伝的アルゴリズムではユーザーが提供する集団は必要ないため、デフォルトの形式が必要です。

vectorizedc を最小化するには、次のコマンドを入力します。

options=optimoptions('patternsearch','UseVectorized',true,'UseCompletePoll',true);
x0=[0;0];
[x,fval]=patternsearch(@vectorizedc,x0,...
         [],[],[],[],[],[],[],options)

MATLAB® は次の出力を返します。

Optimization terminated: mesh size less than options.MeshTolerance.

x =
   -1.5737
    1.0575

fval =
  -10.0088

ベクトル化された制約関数

非線形制約のみをベクトル化する必要があります。境界と線形制約は自動的に処理されます。非線形制約がある場合、アルゴリズムがベクトル化された方法で計算できるように、目的関数と非線形制約をすべてベクトル化する必要があります。

制約関数についても目的関数と同じ考慮事項が当てはまります。つまり、初期ポイント x0 によって、投票または検索におけるポイントのタイプ (行ベクトルまたは列ベクトル) が決まります。初期点がサイズ k の行ベクトルである場合、制約関数に渡される行列 x には k 列があります。同様に、初期点がサイズ k の列ベクトルである場合、ポーリング ポイントまたは検索ポイントの行列には k 行が含まれます。図 ベクトル化された関数の構造 を見ればこれが明らかになるかもしれません。初期点がスカラーの場合、patternsearch はそれが行ベクトルであると想定します。

非線形制約関数は、不等式制約用と等式制約用の 2 つの行列を返します。nc 個の非線形不等式制約と nceq 個の非線形等式制約があるとします。行ベクトル x0 の場合、制約行列にはそれぞれ nc 列と nceq 列があり、行数は入力行列と同じです。同様に、列ベクトル x0 の場合、制約行列にはそれぞれ nc 行と nceq 行があり、列数は入力行列と同じです。図ベクトル化された関数の構造の「結果」にはncとnceqの両方が含まれます。

ベクトル化された目的と制約の例

非線形制約が

x129+x2241 (the interior of an ellipse),x2cosh(x1)1.

であると仮定します。行形式 x0 のこれらの制約に対する関数を次のように記述します。

function [c ceq] = ellipsecosh(x)

c(:,1)=x(:,1).^2/9+x(:,2).^2/4-1;
c(:,2)=cosh(x(:,1))-x(:,2)-1;
ceq=[];

制約 ellipsecosh に従って vectorizedr (ベクトル化された目的関数 で定義) を最小化します。

x0=[0,0];
options = optimoptions('patternsearch','UseVectorized',true,'UseCompletePoll',true);
[x,fval] = patternsearch(@vectorizedr,x0,...
         [],[],[],[],[],[],@ellipsecosh,options)

MATLAB は次の出力を返します。

Optimization terminated: mesh size less than options.MeshTolerance
 and constraint violation is less than options.ConstraintTolerance.

x =
   -1.3516    1.0612

fval =
   -9.5394

関連するトピック