このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
混合整数代理最適化、問題ベース
この例では、整数変数を含む最適化問題を解決する方法を示します。この例では、10 次元で -3 から 6 までの範囲の整数値の引数に対して multirosenbrock
関数を最小化する点 x
を見つけます。multirosenbrock
関数はスケーリングが不十分な関数であり、最適化が困難です。その最小値は 0 であり、点 [1,1,...,1]
で達成されます。関数 multirosenbrock
のコードは、この例の終わりに掲載しています。
境界が -3 から 6 の整数型の 10 次元行ベクトル変数 x
を作成します。スカラー境界を指定すると、その境界はすべての変数コンポーネントに適用されます。
x = optimvar("x",1,10,"LowerBound",-3,"UpperBound",6,"Type","integer");
multirosenbrock
を目的関数として使用するには、 fcn2optimexpr
を使用して関数を最適化式に変換します。
fun = fcn2optimexpr(@multirosenbrock,x);
目的関数 multirosenbrock
を使用して最適化問題を作成します。
prob = optimproblem("Objective",fun);
関数評価の最大数を 200 に設定します。
opts = optimoptions("surrogateopt","MaxFunctionEvaluations",200);
問題を解きます。
rng(1,'twister') % For reproducibility [sol,fval] = solve(prob,"Solver","surrogateopt","Options",opts)
Solving problem using surrogateopt.
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
sol = struct with fields:
x: [1 1 1 1 1 1 1 1 1 1]
fval = 0
この場合、surrogateopt
は正しい解決策に到達します。
混合整数問題
最初の 6 つの変数のみが整数値であると仮定します。問題を再定式化するには、6 次元の整数変数 xint
と 4 次元の連続変数 xcont
を作成します。
xint = optimvar("xint",1,6,"LowerBound",-3,"UpperBound",6,"Type","integer"); xcont = optimvar("xcont",1,4,"LowerBound",-3,"UpperBound",6);
入力 [xint xcont]
を使用して multirosenbrock
を最適化式に変換します。
fun2 = fcn2optimexpr(@multirosenbrock,[xint xcont]);
問題を作成して解決します。
prob2 = optimproblem("Objective",fun2); rng(1,'twister') % For reproducibility [sol2,fval2] = solve(prob2,"Solver","surrogateopt","Options",opts)
Solving problem using surrogateopt.
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
sol2 = struct with fields:
xcont: [1.0496 1.1061 1.0507 1.1050]
xint: [1 1 1 1 1 1]
fval2 = 0.0071
今回は整数変数は正しい解に到達し、連続変数は解に近づいていますが完全に正確ではありません。
補助関数
次のコードは、補助関数 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