Main Content

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

混合整数代理最適化、問題ベース

この例では、整数変数を含む最適化問題を解決する方法を示します。この例では、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

参考

|

関連するトピック