Main Content

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

検索とアンケート、問題ベース

メッシュ ポイントをポーリングすることに加えて、パターン検索アルゴリズムは、反復ごとに検索と呼ばれるオプションのステップを実行できます。各反復で、検索ステップは現在のポイントに別の最適化方法を適用します。この検索で現在のポイントが改善されない場合は、ポーリング手順が実行されます。

この例を実行すると、目的関数 lincontest7 が使用可能になります。

投票方式による検索

次の例は、patternsearch と Optimize を使用した制約付き最小化ライブ エディター タスク で説明されている問題に対する検索方法の使用を示しています。この場合の検索方法は、GSS Positive Basis 2N ポーリングです。比較のために、まず検索方法なしで問題を実行します。

x = optimvar("x",1,6);
prob = optimproblem("Objective",lincontest7(x));
x0.x = [2 1 0 9 1 0];
Aineq = [-8 7 3 -4 9 0];
bineq = 7;
Aeq = [7 1 8 3 3 3; 5 0 -5 1 -5 8; -2 -6 7 1 1 9; 1 -1 2 -2 3 -3];
beq = [84 62 65 1];
prob.Constraints.Aineq = Aineq*x' <= bineq;
prob.Constraints.Aeq = Aeq*x' == beq';
options = optimoptions('patternsearch',...
    'PlotFcn',{@psplotbestf,@psplotfuncount});
[x,fval,exitflag,output] = solve(prob,x0,...
    "Options",options,"Solver","patternsearch");
Solving problem using patternsearch.
patternsearch stopped because the mesh size was less than options.MeshTolerance.

GSS Positive Basis 2N ポーリングを検索方法として使用するには、SearchFcn オプションを変更します。

rng default % For reproducibility
options.SearchFcn = @GSSPositiveBasis2N;
[x2,fval2,exitflag2,output2] = solve(prob,x0,...
    "Options",options,"Solver","patternsearch");
Solving problem using patternsearch.
patternsearch stopped because the mesh size was less than options.MeshTolerance.

両方の最適化は同じ目的関数値に到達しました。検索メソッドを使用すると、関数の評価回数は減りますが、反復回数は減りません。

table([output.funccount;output2.funccount],[output.iterations;output2.iterations],...
    'VariableNames',["Function Evaluations" "Iterations"],...
    'RowNames',["Without Search" "With Search"])
ans=2×2 table
                      Function Evaluations    Iterations
                      ____________________    __________

    Without Search            696                 76    
    With Search               777                182    

別のソルバーを使用して検索する

patternsearch は、ローゼンブロック関数を最小化するのに長い時間がかかります。関数は次のようになります。

f(x)=100(x2-x12)2+(1-x1)2.

Rosenbrock 関数は [最適化] ライブ エディター タスクまたはソルバーを使用した制約付き非線形問題 で説明され、プロットされています。ローゼンブロック関数の最小値は 0 であり、点 [1,1] で達成されます。patternsearch はこの関数を最小化するのに効率的ではないため、別の検索方法を使用してください。

目的関数を作成します。

dejong2fcn = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

2 つの変数を使用したパターン検索のデフォルトの最大反復回数は 200 で、関数評価のデフォルトの最大回数は 4000 です。これらの値を MaxFunctionEvaluations = 5000 および MaxIterations = 2000 に増やします。

opts = optimoptions("patternsearch","MaxFunctionEvaluations",5000,"MaxIterations",2000);

[-1.9 2] から始まるパターン検索を実行します。

x = optimvar("x",1,2);
prob = optimproblem("Objective",dejong2fcn(x));
x0.x = [-1.9,2];
[sol,feval,eflag,output] = solve(prob,x0,...
    "Options",opts,"Solver","patternsearch");
Solving problem using patternsearch.
patternsearch stopped because it exceeded options.MaxFunctionEvaluations.
disp(feval)
    0.8560
disp(output.funccount)
        5000

5000 回の関数評価後も最適化が完了しず、結果は最適値 0 にあまり近くありません。

関数評価と反復のデフォルト数を使用して、検索方法として fminsearch を使用するようにオプションを設定します。

opts = optimoptions("patternsearch","SearchFcn",@searchneldermead);

最適化を再実行します。

[sol2,feval2,eflag2,output2] = solve(prob,x0,...
    "Options",opts,"Solver","patternsearch");
Solving problem using patternsearch.
patternsearch stopped because the mesh size was less than options.MeshTolerance.
disp(feval2)
   4.0686e-10
disp(output2.funccount)
   291

この検索方法を使用すると、解における目的関数の値が大幅に向上し (低くなり)、関数評価の回数も大幅に減ります。fminsearch は、Rosenbrock 関数の最小値に近づくのに効率的です。

参考

|

関連するトピック