主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

基于问题的混合整数替代优化

此示例说明如何解决涉及整数变量的优化问题。在此示例中,找到点 x,使 multirosenbrock 函数在 10 个维度中从 -3 到 6 的整数值参量上最小化。multirosenbrock 函数是一个缩放较差且难以优化的函数。它的最小值为 0,在点 [1,1,...,1] 处达到。multirosenbrock 函数的代码在此示例末尾

创建一个 10 维行向量变量 x,类型为整数,边界为 -3 到 6。当您指定标量边界时,该边界将应用到所有变量分量。

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.

Figure Optimization Plot Function contains an axes object. The axes object with title Best Function Value: 0, 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: [1 1 1 1 1 1 1 1 1 1]

fval = 
0

这样一来,surrogateopt 就达到了正确的解。

混合整数问题

假设只有前六个变量是整数值。为了重新表述这个问题,创建一个 6 维整数变量 xint 和一个 4 维连续变量 xcont

xint = optimvar("xint",1,6,"LowerBound",-3,"UpperBound",6,"Type","integer");
xcont = optimvar("xcont",1,4,"LowerBound",-3,"UpperBound",6);

使用输入 multirosenbrock[xint xcont] 转换为优化表达式。

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.

Figure Optimization Plot Function contains an axes object. The axes object with title Best Function Value: 0.00711877, 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:
    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

另请参阅

|

主题