このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
制約の作成
Optimization Toolbox ドキュメントを参照してください
多くの Global Optimization Toolbox 関数は、境界、線形制約、または非線形制約を受け入れます。これらの制約を問題に含める方法については、制約の作成 を参照してください。以下のセクションの関連リンクを参照してください。
メモ
surrogateopt
ソルバーは、非線形制約に対して他のソルバーとは異なる構文を使用し、すべてのコンポーネントに有限の境界を必要とします。詳細については、関数のリファレンス ページと 非線形制約を surrogateopt 形式と他のソルバー形式の間で変換する を参照してください。
範囲の設定
ローカル ソルバーよりもグローバル ソルバーの境界を設定することの方が重要です。グローバル ソルバーはさまざまな方法で境界を使用します。
GlobalSearch
は、散乱探索ポイント世代に境界を必要とします。境界を指定しない場合は、GlobalSearch
は各コンポーネントを-9999
で下方に、10001
で上に境界を設定します。ただし、これらの境界は不適切になる可能性が高くなります。境界を指定せず、カスタム開始点も指定しない場合は、
MultiStart
は各コンポーネントを-1000
より下、1000
より上に境界を設定します。ただし、これらの境界は不適切になる可能性が高くなります。ga
は、初期の母集団世代に境界と線形制約を使用します。非有界の問題の場合、ga
は、初期点世代の各次元の下限としてデフォルトの0
を使用し、上限として1
を使用します。境界付き問題および線形制約のある問題の場合、ga
は境界と制約を使用して初期母集団を作成します。simulannealbnd
とpatternsearch
は境界を使用することもできますが、境界は必要ありません。
ga
オプションが実現可能性を維持することを確認する
ga
ソルバーは一般に、境界と線形制約に関して厳密な実行可能性を維持します。これは、反復ごとに、母集団のすべてのメンバーが境界と線形制約を満たすことを意味します。
ただし、この実現可能性を失敗させるオプションを設定することもできます。たとえば、MutationFcn
を @mutationgaussian
または @mutationuniform
に設定すると、突然変異関数は制約を尊重せず、母集団が実行不可能になる可能性があります。同様に、デフォルトの gacreationlinearfeasible
は境界と線形制約を尊重しますが、一部の交叉関数は実行不可能な母集団を引き起こす可能性があります。また、ga
では、カスタム突然変異または交叉関数を使用する場合、実行不可能なポイントが発生する可能性があります。
実現可能性を確保するには、ga
のデフォルトの交叉関数と突然変異関数を使用します。カスタム関数が境界と線形制約に関して実行可能性を維持するように特に注意してください。
メモ
問題に整数制約がある場合、ga
は、すべての演算子 (突然変異、交叉、および作成) が各反復で境界、線形制約、および整数制約に関して実行可能な母集団を返すことを保証します。この実現可能性は小さな許容範囲内に留まります。
勾配とヘッシアン
GlobalSearch
または MultiStart
を fmincon
と一緒に使用すると、非線形制約関数は導関数 (勾配またはヘッシアン) を返すことができます。詳細は、勾配とヘッシアンを参照してください。
ベクトル化された制約
ga
および patternsearch
ソルバーは、オプションで 1 回の関数呼び出しでベクトルのコレクションの非線形制約関数を計算します。この方法は、ベクトルの目的関数を順番に計算するよりも時間がかかりません。この方法はベクトル化された関数呼び出しと呼ばれます。
ソルバーがベクトル化された方法で計算するには、目的 (適応度) 関数と非線形制約関数の両方をベクトル化する必要があります。詳細は、目的関数と制約関数をベクトル化するを参照してください。
例えば、3次元の問題に対する非線形制約が次のようなものであるとします。
次のコードは、入力行列 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
の方がはるかに迅速かつ正確に解を計算します。