このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
GlobalSearch および MultiStart の出力関数
出力関数とは何ですか?
出力関数を使用すると、最適化の中間結果を調べることができます。さらに、ソルバーをプログラムで停止することもできます。
2 種類の 出力構造 と同様に、出力関数にも 2 種類あります。
グローバル出力関数は、各ローカル ソルバーの実行後に実行されます。これらは、グローバル ソルバーの開始時と終了時にも実行されます。
ローカル出力関数は、ローカル ソルバーの各反復後に実行されます。Optimization Toolbox の出力関数を参照してください。
グローバル出力関数を使用するには:
出力関数 で説明されている構文を使用して出力関数を記述します。
GlobalSearch
またはMultiStart
ソルバーのOutputFcn
プロパティを出力関数の関数ハンドルに設定します。OutputFcn
プロパティを関数ハンドルのセル配列に設定することで、複数の出力関数を使用できます。
組み込みの @savelocalsolutions
出力関数は、すべてのローカル ソリューションをベース ワークスペースの localSolTable
変数に保存します。この出力関数は、実行可能なローカル ソリューションだけでなく実行不可能なローカル ソリューションも保存します。run
の solutions
出力は、終了フラグが正のローカル ソリューションのみを返します。
すべてのローカルソリューションを収集
この例では、savelocalsolutions
出力関数を MultiStart
と共に使用して、実行中に見つかったすべてのローカル ソリューションを収集する方法を示します。まず、 MultiStart
の出力関数として savelocalsolutions
を指定します。
ms = MultiStart(OutputFcn=@savelocalsolutions);
この例の最後にある 補助関数 にリストされている bigtoleft
目的関数と twocone
非線形制約関数を使用して、MultiStart
の 3 つの変数の問題を作成します。各成分の下限を – 1e5
に設定し、上限を 1e5
に設定します。この目的関数と非線形制約関数の詳細については、解析的ヘッシアンを使用した fmincon の内点法アルゴリズム を参照してください。
fun = @bigtoleft; lb = -1e5*ones(1,3); ub = -lb;
目的関数と制約関数には導関数情報が含まれます。導関数を使用するためのオプションを設定します。
opts = optimoptions(@fmincon,SpecifyObjectiveGradient=true,...
SpecifyConstraintGradient=true);
初期点を[–10,–10,–10]に設定し、最適化問題を作成します。
x0 = -10*ones(1,3); prob = createOptimProblem("fmincon",x0=x0,... lb = lb,ub = ub,... objective=fun,nonlcon=@twocone,options=opts);
再現性のために、ランダムシードを設定します。35 個の開始ポイントで MultiStart
を実行します。
rng default
[x,fval,eflag,output,solns] = run(ms,prob,35)
MultiStart completed some of the runs from the start points. 11 out of 35 local solver runs converged with a positive local solver exitflag. x = -6.5000 -0.0000 -3.5000 fval = -2.8941e+03 eflag = 2 output = struct with fields: funcCount: 73904 localSolverTotal: 35 localSolverSuccess: 11 localSolverIncomplete: 23 localSolverNoSolution: 1 message: 'MultiStart completed some of the runs from the start points. ↵↵11 out of 35 local solver runs converged with a positive local solver exitflag.' solns = 1×2 GlobalOptimSolution array with properties: X Fval Exitflag Output X0
ワークスペースには、35 個のローカル ソリューションすべてを含む localSolTable
変数が含まれています。対照的に、出力構造は、11 回のローカル ソルバー実行のみが成功したことを示しています。
size(localSolTable)
ans = 35 4
出力関数によって返される情報の種類を確認するには、localSolTable
の最初の行を表示します。
disp(localSolTable(1,:))
X fval exitflag constrviolation ________________________________ _______ ________ _______________ -6.5 2.3432e-07 -3.5 -2894.1 1 0
出力関数は、ローカル ソリューション X
、それに関連付けられた目的関数値 fval
、そのローカル ソルバーの実行に対応する終了フラグ、および制約違反 (制約違反がない場合は 0
) を返します。
補助関数
次のコードは、補助関数 bigtoleft
を作成します。
function [f,gradf] = bigtoleft(x) % This is a simple function that grows rapidly negative % as x(1) becomes negative % f = 10*x(:,1).^3+x(:,1).*x(:,2).^2+x(:,3).*(x(:,1).^2+x(:,2).^2); if nargout > 1 gradf=[30*x(1)^2+x(2)^2+2*x(3)*x(1); 2*x(1)*x(2)+2*x(3)*x(2); (x(1)^2+x(2)^2)]; end end
次のコードは、補助関数 twocone
を作成します。
function [c,ceq,gradc,gradceq] = twocone(x) % This constraint is two cones, z > -10 + r % and z < 3 - r ceq = []; r = sqrt(x(1)^2 + x(2)^2); c = [-10+r-x(3); x(3)-3+r]; if nargout > 2 gradceq = []; gradc = [x(1)/r,x(1)/r; x(2)/r,x(2)/r; -1,1]; end end
カスタム GlobalSearch 出力関数
この出力関数は、正の終了フラグを持つ 5 つの異なる局所最小値を見つけた後、または 0.5
未満の局所最小値を見つけた後に、 GlobalSearch
を停止します。出力関数は、永続的なローカル変数 foundLocal
を使用してローカルの結果を保存します。foundLocal
により、出力関数は、ローカル ソリューションが他のソリューションと異なるかどうかを 1e-4
の許容範囲内で判断できます。
永続変数の代わりにネストされた関数を使用してローカル結果を保存するには、入れ子構造の出力関数の例 を参照してください。
出力関数 で説明されている構文を使用して出力関数を記述します。
function stop = StopAfterFive(optimValues, state) persistent foundLocal stop = false; switch state case 'init' foundLocal = []; % initialized as empty case 'iter' newf = optimValues.localsolution.Fval; exitflag = optimValues.localsolution.Exitflag; % Now check if the exit flag is positive and % the new value differs from all others by at least 1e-4 % If so, add the new value to the newf list if exitflag > 0 && all(abs(newf - foundLocal) > 1e-4) foundLocal = [foundLocal;newf]; % Now check if the latest value added to foundLocal % is less than 1/2 % Also check if there are 5 local minima in foundLocal % If so, then stop if foundLocal(end) < 0.5 || length(foundLocal) >= 5 stop = true; end end end
StopAfterFive.m
を MATLAB® パスのフォルダーにファイルとして保存します。目的関数を記述し、全体的または複数の局所的最小値を見つける のような最適化問題構造を作成します。
function f = sawtoothxy(x,y) [t r] = cart2pol(x,y); % change to polar coordinates h = cos(2*t - 1/2)/2 + cos(t) + 2; g = (sin(r) - sin(2*r)/2 + sin(3*r)/3 - sin(4*r)/4 + 4) ... .*r.^2./(r+1); f = g.*h; end
sawtoothxy.m
を MATLAB パスのフォルダーにファイルとして保存します。コマンドラインで、問題の構造を作成します。
problem = createOptimProblem('fmincon',... 'objective',@(x)sawtoothxy(x(1),x(2)),... 'x0',[100,-50],'options',... optimoptions(@fmincon,'Algorithm','sqp'));
出力関数として
@StopAfterFive
を使用してGlobalSearch
オブジェクトを作成し、反復表示プロパティを'iter'
に設定します。gs = GlobalSearch('OutputFcn',@StopAfterFive,'Display','iter');
(オプション) この例と同じ回答を得るには、デフォルトの乱数ストリームを設定します。
rng default
問題を実行します。
[x,fval] = run(gs,problem)
Num Pts Best Current Threshold Local Local Analyzed F-count f(x) Penalty Penalty f(x) exitflag Procedure 0 200 555.5 555.5 0 Initial Point 200 1463 1.547e-15 1.547e-15 1 Stage 1 Local GlobalSearch stopped by the output or plot function. 1 out of 2 local solver runs converged with a positive local solver exit flag. x = 1.0e-07 * 0.0414 0.1298 fval = 1.5467e-15
GlobalSearch
が関数値が 0.5
より小さい点を見つけたため、実行は早期に停止しました。
並列出力機能なし
MultiStart
は並列実行できますが、グローバル出力関数とプロット関数の並列実行はサポートされていません。さらに、MultiStart
が並列実行される場合、ローカル出力関数とプロット関数はワーカー上で実行されますが、その効果は直列実行の場合とは異なります。ローカル出力およびプロット関数は、ワーカー上で実行されている場合、表示を作成しません。ワーカーが結果をクライアント (MultiStart
並列ジョブの発信元) に渡すまで、出力関数とプロット関数の他の効果は表示されません。
MultiStart
を並列で実行する方法の詳細については、 並列計算 を参照してください。