メインコンテンツ

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

run

マルチスタートソルバーを実行する

説明

x = run(gs,problem)GlobalSearch を実行して、problem の解または複数の局所解を見つけます。

x = run(ms,problem,k) は、k 開始ポイントで MultiStart を実行し、problem の解または複数の局所解を見つけます。

x = run(ms,problem,startpts) は、startpts で説明されている開始ポイントから problem 上で MultiStart を実行します。

[x,fval] = run(___) は、前の構文のいずれかの引数を使用して、見つかった最適なポイントである x での目的関数の値を返します。lsqcurvefit および lsqnonlin ローカル ソルバーの場合、fval には残差の 2 乗ノルムが含まれます。

[x,fval,exitflag,output] = run(___) は、戻り条件を記述する終了フラグと、実行の反復を記述する出力構造も返します。

[x,fval,exitflag,output,solutions] = run(___) は、実行中に見つかった個別の局所最小値を含むソリューションのベクトルも返します。solutions は、正のローカル ソルバーの終了フラグに対応します。

すべて折りたたむ

複数の局所最小値を持つ最適化問題を作成し、GlobalSearch を使用して大域的最小値を見つけてみます。目的は、6 つのこぶを持つラクダの背中の問題です (ソルバーを実行する を参照)。

rng default % For reproducibility
gs = GlobalSearch;
sixmin = @(x)(4*x(1)^2 - 2.1*x(1)^4 + x(1)^6/3 ...
    + x(1)*x(2) - 4*x(2)^2 + 4*x(2)^4);
problem = createOptimProblem('fmincon','x0',[-1,2],...
    'objective',sixmin,'lb',[-3,-3],'ub',[3,3]);
x = run(gs,problem)
GlobalSearch stopped because it analyzed all the trial points.

All 8 local solver runs converged with a positive local solver exit flag.
x = 1×2

   -0.0898    0.7127

次の構文を使用して、run を呼び出すときに x の目的関数値を要求できます。

[x,fval] = run(gs,problem)

ただし、fval を要求なかった場合、x で目的関数の値を計算できます。

fval = sixmin(x)
fval = 
-1.0316

デフォルトの MultiStart オブジェクトを使用して、6 つのこぶを持つラクダの背中の問題を解決します (ソルバーを実行する を参照)。

rng default % For reproducibility
ms = MultiStart;
sixmin = @(x)(4*x(1)^2 - 2.1*x(1)^4 + x(1)^6/3 ...
    + x(1)*x(2) - 4*x(2)^2 + 4*x(2)^4);
problem = createOptimProblem('fmincon','x0',[-1,2],...
    'objective',sixmin,'lb',[-3,-3],'ub',[3,3]);
[x,fval,exitflag,outpt,solutions] = run(ms,problem,30);
MultiStart completed the runs from all start points. 

All 30 local solver runs converged with a positive local solver exitflag.

最良の機能値と最良の機能値が達成される場所を調べます。

fprintf('The best function value is %f.\n',fval)
The best function value is -1.031628.
fprintf('The location where this value is attained is [%f,%f].',x)
The location where this value is attained is [-0.089842,0.712656].

各コンポーネントの範囲[-3,3] 内の MultiStart の初期 2D ポイントのセットを作成します。

v = -3:0.5:3;
[X,Y] = meshgrid(v);
ptmatrix = [X(:),Y(:)];
tpoints = CustomStartPointSet(ptmatrix);

MultiStarttpoints の点から開始して、6 つのこぶを持つキャメル バック問題 (ソルバーを実行する を参照) を最小化する点を見つけます。

rng default % For reproducibility
ms = MultiStart;
sixmin = @(x)(4*x(1)^2 - 2.1*x(1)^4 + x(1)^6/3 ...
    + x(1)*x(2) - 4*x(2)^2 + 4*x(2)^4);
problem = createOptimProblem('fmincon','x0',[-1,2],...
    'objective',sixmin,'lb',[-3,-3],'ub',[3,3]);
x = run(ms,problem,tpoints)
MultiStart completed the runs from all start points. 

All 169 local solver runs converged with a positive local solver exitflag.
x = 1×2

    0.0898   -0.7127

複数の局所最小値を持つ最適化問題を作成し、GlobalSearch を使用して大域的最小値を見つけてみます。目的は、6 つのこぶを持つラクダの背中の問題です (ソルバーを実行する を参照)。

rng default % For reproducibility
gs = GlobalSearch;
sixmin = @(x)(4*x(1)^2 - 2.1*x(1)^4 + x(1)^6/3 ...
    + x(1)*x(2) - 4*x(2)^2 + 4*x(2)^4);
problem = createOptimProblem('fmincon','x0',[-1,2],...
    'objective',sixmin,'lb',[-3,-3],'ub',[3,3]);
[x,fval,exitflag,output,solutions] = run(gs,problem);
GlobalSearch stopped because it analyzed all the trial points.

All 8 local solver runs converged with a positive local solver exit flag.

この問題を解決するために GlobalSearch が何をしたかを理解するには、output 構造と solutions オブジェクトを調べます。

disp(output)
                funcCount: 2245
         localSolverTotal: 8
       localSolverSuccess: 8
    localSolverIncomplete: 0
    localSolverNoSolution: 0
                  message: 'GlobalSearch stopped because it analyzed all the trial points.↵↵All 8 local solver runs converged with a positive local solver exit flag.'
  • GlobalSearch は目的関数を 2261 回評価しました。

  • GlobalSearch は 8 つの異なるポイントから fmincon を実行しました。

  • すべての fmincon 実行は、局所解に正常に収束しました。

disp(solutions)
  1×4 GlobalOptimSolution array with properties:

    X
    Fval
    Exitflag
    Output
    X0
arrayfun(@(x)x.Output.funcCount,solutions)
ans = 1×4

    31    34    40     3

8 回のローカル ソルバー実行で 4 つの解が見つかりました。funcCount の出力は、fmincon が 4 つのソリューションのそれぞれに到達するまでに 40 回以下の関数評価を要したことを示しています。出力には、fmincon 実行のうち 4 回で実行された関数評価の回数は表示されません。2261 の関数評価のほとんどは、GlobalSearch が試行ポイントを評価するためのものであり、fmincon がそれらのポイントから実行を開始するためのものではないようです。

入力引数

すべて折りたたむ

GlobalSearch ソルバー。GlobalSearch オブジェクトとして指定されます。GlobalSearch コマンドを使用して gs を作成します。

MultiStart ソルバー。MultiStart オブジェクトとして指定されます。MultiStart コマンドを使用して ms を作成します。

問題構造として指定された最適化問題。createOptimProblem を使用して、problem を作成します。詳細については、問題構造を作成する を参照してください。

例: problem = createOptimProblem('fmincon','objective',fun,'x0',x0,'lb',lb)

データ型: struct

開始点の数。正の整数として指定します。MultiStart は、RandomStartPointSet オブジェクトと同じアルゴリズムを使用して k - 1 開始点を生成します。MultiStart は、problem 構造の x0 ポイントも使用します。

例: 50

データ型: double

MultiStart の開始点。CustomStartPointSet オブジェクト、RandomStartPointSet オブジェクト、またはそのようなオブジェクトのセル配列として指定されます。

例: {custompts,randompts}

出力引数

すべて折りたたむ

見つかった最適なポイントが実数配列として返されます。最適なポイントは、目的関数の値が最も低いポイントです。

遭遇した最低の目的関数値が、実数スカラーとして返されます。lsqcurvefit および lsqnonlin の場合、目的関数は平方和、つまり残差の平方ノルムです。

終了条件の概要。整数として返されます。

グローバルソルバー終了フラグ

2少なくとも 1 つの実行可能な局所的最小値が見つかりました。ローカル ソルバーの一部の実行が収束しませんでした。
1少なくとも 1 つの実行可能な局所的最小値が見つかりました。ローカル ソルバーのすべての実行が収束しました (終了フラグが正でした)。
0局所的最小値が見つかりませんでした。ローカル ソルバーが少なくとも 1 回呼び出され、少なくとも 1 つのローカル ソルバーが MaxIterations または MaxFunctionEvaluations 許容値を超えました。
-1ローカル ソルバーの出力またはプロット関数によって 1 つ以上のローカル ソルバーの実行が停止されました。
-2実行可能な局所的最小値が見つかりませんでした。
-5MaxTime 制限を超えました。
-8解が見つかりませんでした。すべての実行で、ローカル ソルバーの終了フラグが -2 以下であり、すべてが -2 と等しいわけではありません。
-10ユーザー提供の関数で発生した障害。

ソリューション プロセスの詳細。次のフィールドを持つ構造体として返されます。

フィールド意味
funcCount関数評価回数。
localSolverIncomplete0 終了フラグを指定したローカル ソルバー実行回数。
localSolverNoSolution負の終了フラグを持つローカル ソルバー実行の数。
localSolverSuccess終了フラグが正であるローカル ソルバー実行回数。
localSolverTotalローカル ソルバーの実行回数の合計。
message終了メッセージ。

個別の局所解は、GlobalOptimSolution オブジェクトのベクトルとして返されます。これらのソリューションは、正のローカル ソルバーの終了フラグに対応します。つまり、ローカル ソルバーの終了フラグが非正の場合、対応するソリューションは solutions に記録されません。すべての局所解を取得するには、@savelocalsolutions GlobalSearchとMultiStartの出力関数 を使用します。

バージョン履歴

R2010a で導入