Main Content

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

制約の作成

Optimization Toolbox ドキュメントを参照してください

多くの Global Optimization Toolbox 関数は、境界、線形制約、または非線形制約を受け入れます。これらの制約を問題に含める方法については、制約の作成 を参照してください。以下のセクションの関連リンクを参照してください。

メモ

surrogateopt ソルバーは、非線形制約に対して他のソルバーとは異なる構文を使用し、すべてのコンポーネントに有限の境界を必要とします。詳細については、関数リファレンス ページと surrogateopt 形式と他のソルバー形式の間で非線形制約を変換する を参照してください。

範囲の設定

ローカル ソルバーよりもグローバル ソルバーの境界を設定することが重要です。グローバル ソルバーはさまざまな方法で境界を使用します。

  • GlobalSearch では、分散検索ポイントの生成に境界が必要です。境界を指定しない場合、GlobalSearch は各コンポーネントを -9999 で下方に、 10001 で上方に境界を設定します。ただし、これらの境界は不適切になる可能性が高くなります。

  • 境界を指定せず、カスタム開始点も指定しない場合、MultiStart は各コンポーネントを -1000 より下、 1000 より上に境界を設定します。ただし、これらの境界は不適切になる可能性が高くなります。

  • ga は、初期の人口生成に境界と線形制約を使用します。無制限の問題の場合、ga は、初期ポイント生成の各次元の下限としてデフォルトの 0 を使用し、上限としてデフォルトの 1 を使用します。境界のある問題や線形制約のある問題の場合、ga は境界と制約を使用して初期集団を作成します。

  • simulannealbndpatternsearch は境界を使用することもできますが、境界は必要ありません。

gaオプションの実現可能性の維持を確実にする

ga ソルバーは一般に、境界と線形制約に関して厳密な実行可能性を維持します。これは、反復ごとに、集団のすべてのメンバーが境界と線形制約を満たすことを意味します。

ただし、この実現可能性を失敗させるオプションを設定することもできます。たとえば、MutationFcn@mutationgaussian または @mutationuniform に設定すると、突然変異関数は制約を尊重せず、集団が実行不可能になる可能性があります。同様に、デフォルトの gacreationlinearfeasible は境界と線形制約を尊重しますが、一部の交差関数は実行不可能な集団を引き起こす可能性があります。また、ga では、カスタム突然変異または交差関数を使用する場合、実行不可能なポイントが発生する可能性があります。

実現可能性を確保するには、ga のデフォルトの交差関数と突然変異関数を使用します。カスタム関数が境界と線形制約に関して実行可能性を維持するように特に注意してください。

メモ

問題に整数制約がある場合、ga は、すべての演算子 (突然変異、交差、作成) が各反復で境界、線形制約、および整数制約に関して実行可能な集団を返すことを保証します。この実現可能性は小さな許容範囲内で維持されます。

勾配とヘッセ行列

GlobalSearch または MultiStartfmincon と一緒に使用すると、非線形制約関数は導関数 (勾配またはヘッセ行列) を返すことができます。詳細については、勾配とヘッセ行列 を参照してください。

ベクトル化された制約

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

ソルバーがベクトル化された方法で計算するには、目的 (適合度) 関数と非線形制約関数の両方をベクトル化する必要があります。詳細については、目的関数と制約関数をベクトル化する を参照してください。

例えば、3次元の問題に対する非線形制約が次の通りであるとする。

x124+x229+x32256x3cosh(x1+x2)x1x2x3=2.

次のコードは、入力行列 x の行が母集団または入力ベクトルであると仮定して、これらの非線形制約をベクトル化された形式で提供します。

function [c ceq] = nlinconst(x)

c(:,1) = x(:,1).^2/4 + x(:,2).^2/9 + x(:,3).^2/25 - 6;
c(:,2) = cosh(x(:,1) + x(:,2)) - x(:,3);
ceq = x(:,1).*x(:,2).*x(:,3) - 2;

例えば、ベクトル化された2次関数を最小化する

function y = vfun(x)
y = -x(:,1).^2 - x(:,2).^2 - x(:,3).^2;

制約条件 nlinconst を持つ領域上で patternsearch を使用する:

options = optimoptions('patternsearch','UseCompletePoll',true,'UseVectorized',true);
[x fval] = patternsearch(@vfun,[1,1,2],[],[],[],[],[],[],...
    @nlinconst,options)
Optimization terminated: mesh size less than options.MeshTolerance
 and constraint violation is less than options.ConstraintTolerance.

x =
    0.2191    0.7500   12.1712

fval =
 -148.7480

ga の使用:

options = optimoptions('ga','UseVectorized',true);
[x fval] = ga(@vfun,3,[],[],[],[],[],[],@nlinconst,options)
Optimization terminated: maximum number of generations exceeded.

x =
   -1.4098   -0.1216   11.6664

fval =
 -138.1066

この問題の場合、patternsearch ははるかに迅速かつ正確に解を計算します。

関連するトピック