メインコンテンツ

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

制約の作成

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;

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

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 の方がはるかに迅速かつ正確に解を計算します。

参考

トピック