メインコンテンツ

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

surrogateoptを使った多次元関数の最適化、問題ベース

この例では、問題ベースのアプローチでサロゲート最適化を使用して多次元関数を最小化する方法を示します。最小化する関数 multirosenbrock(x) は、この例の最後に表示されます。multirosenbrock 関数には、点 [1,1,...,1]0 の単一の局所的最小値があります。この関数は、ソルバーにとって最小化するのが困難になるように設計されています。

メモ: multirosenbrock ヘルパー関数のコードは、この例の最後に記載されています。コードがスクリプトの最後またはパス上のファイルに含まれていることを確認してください。

4D 最適化変数 x を作成します。multirosenbrock 関数は変数が行ベクトルであると想定しているため、x を 4 要素の行ベクトルとして指定します。

x = optimvar("x",1,4);

surrogateopt ソルバーでは、すべての問題変数に有限の境界が必要です。下限を -3、上限を 3 に指定します。スカラー境界を指定すると、それはすべての問題変数に適用されます。

x.LowerBound = -3;
x.UpperBound = 3;

multirosenbrock を目的関数として使用するには、fcn2optimexpr を使用して関数を最適化式に変換します。

fun = fcn2optimexpr(@multirosenbrock,x);

目的関数 multirosenbrock を使用して最適化問題を作成します。

prob = optimproblem("Objective",fun);

surrogateopt ソルバーを指定して問題を解きます。

rng default % For reproducibility
[sol,fval] = solve(prob,"Solver","surrogateopt")
Solving problem using surrogateopt.

Figure Optimization Plot Function contains an axes object. The axes object with title Best Function Value: 0.683137, xlabel Iteration, ylabel Function value contains an object of type scatter. This object represents Best function value.

surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.
sol = struct with fields:
    x: [0.2895 0.0882 0.5829 0.3348]

fval = 
0.6831

ソリューションの改善の試み

目的関数の値が 0 にあまり近くないため、返されたソリューションは適切ではありません。さらに評価するために surrogateopt を実行してソリューションを改善してみてください。前のソリューションを開始点として使用します。

options = optimoptions("surrogateopt","MaxFunctionEvaluations",1000);
[sol2,fval2] = solve(prob,sol,"Solver","surrogateopt","Options",options)
Solving problem using surrogateopt.

Figure Optimization Plot Function contains an axes object. The axes object with title Best Function Value: 0.0145162, xlabel Iteration, ylabel Function value contains an object of type scatter. This object represents Best function value.

surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.
sol2 = struct with fields:
    x: [1.0410 1.0844 0.8870 0.7865]

fval2 = 
0.0145

今回は、ソルバーは良い解決策に到達しました。

補助関数

次のコードは、補助関数 multirosenbrock を作成します。

function F = multirosenbrock(x)
% This function is a multidimensional generalization of Rosenbrock's
% function. It operates in a vectorized manner, assuming that x is a matrix
% whose rows are the individuals.

% Copyright 2014 by The MathWorks, Inc.

N = size(x,2); % assumes x is a row vector or 2-D matrix
if mod(N,2) % if N is odd
    error('Input rows must have an even number of elements')
end

odds  = 1:2:N-1;
evens = 2:2:N;
F = zeros(size(x));
F(:,odds)  = 1-x(:,odds);
F(:,evens) = 10*(x(:,evens)-x(:,odds).^2);
F = sum(F.^2,2);
end

参考

| |

トピック