Main Content

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

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 には残差の二乗ノルムが含まれます。

[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 の初期 2-D ポイントのセットを作成します。

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....'
  • GlobalSearch は目的関数を 2261 回評価しました。

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

  • すべての fmincon 実行はローカル ソリューションに正常に収束しました。

disp(solutions)
  1x4 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 で導入