Main Content

optimvalues

为优化问题创造价值

自 R2022a 起

说明

val = optimvalues(prob,dataname1,dataval1,...) 为问题 prob 创建了一个 OptimizationValues 对象。使用名称-值参量指定所有变量名称及其关联值,以及可选的目标或约束值。例如,要指定 x 取 1 至 99 之间的奇数值,

val = optimvalues(prob,x=1:2:99);

使用 val 作为 prob 的初始点或初始种群。

示例

示例

全部折叠

为了在基于问题的方法中为 ga (遗传算法求解器)创建初始点,请使用 optimvalues 创建 OptimizationValues 对象。

以罗森布洛克函数作为适应度(目标)函数,为二维问题创建优化变量。

x = optimvar("x",LowerBound=-5,UpperBound=5);
y = optimvar("y",LowerBound=-5,UpperBound=5);
rosenbrock = (10*(y - x.^2)).^2 + (1-x).^2;
prob = optimproblem(Objective=rosenbrock);

在边界内创建 100 个随机二维点。这些点必须是行向量。

rng default % For reproducibility
xval = -5 + 10*rand(1,100);
yval = -5 + 10*rand(1,100);

创建初始点值对象。由于您没有计算适应度值,因此该值在显示中显示为 NaN

vals = optimvalues(prob,x=xval,y=yval)
vals = 
  1x100 OptimizationValues vector with properties:

   Variables properties:
            x: [3.1472 4.0579 -3.7301 4.1338 1.3236 -4.0246 -2.2150 0.4688 4.5751 4.6489 -3.4239 4.7059 4.5717 -0.1462 3.0028 -3.5811 -0.7824 4.1574 2.9221 4.5949 1.5574 -4.6429 3.4913 4.3399 1.7874 2.5774 2.4313 -1.0777 1.5548 ... ] (1x100 double)
            y: [-3.3782 2.9428 -1.8878 0.2853 -3.3435 1.0198 -2.3703 1.5408 1.8921 2.4815 -0.4946 -4.1618 -2.7102 4.1334 -3.4762 3.2582 0.3834 4.9613 -4.2182 -0.5732 -3.9335 4.6190 -4.9537 2.7491 3.1730 3.6869 -4.1556 -1.0022 -2.4013 ... ] (1x100 double)

   Objective properties:
    Objective: [NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... ] (1x100 double)

从初始点 vals 开始,使用 ga 求解问题。将 ga 选项设置为种群为 100。

opts = optimoptions("ga",PopulationSize=100);
[sol,fv] = solve(prob,vals,Solver="ga",Options=opts)
Solving problem using ga.
ga stopped because it exceeded options.MaxGenerations.
sol = struct with fields:
    x: 1.0551
    y: 1.1133

fv = 0.0030

ga 返回一个非常接近真实解 x = 1, y = 1 的解,其适应度值接近 0

为了在基于问题的方法中为 surrogateopt 创建初始点,请使用 optimvalues 创建 OptimizationValues 对象。

为以罗森布洛克函数为目标函数的二维问题创建优化变量。

x = optimvar("x",LowerBound=-5,UpperBound=5);
y = optimvar("y",LowerBound=-5,UpperBound=5);
rosenbrock = (10*(y - x.^2)).^2 + (1 - x).^2;
prob = optimproblem(Objective=rosenbrock);

创建约束,使解位于以原点为中心半径为 2 的圆盘中,并位于直线 y = 1 + x 之下。

disc = x^2 + y^2 <= 2^2;
prob.Constraints.disc = disc;
line = y <= 1 + x;
prob.Constraints.line = line;

在边界内创建 40 个随机二维点。这些点必须是行向量。

rng default % For reproducibility
N = 40;
xval = -5 + 10*rand(1,N);
yval = -5 + 10*rand(1,N);

在随机点上评估罗森布洛克函数。函数值必须是行向量。此步骤是可选的。如果您不提供函数值,surrogateopt 将在点 (xval,yval) 处评估目标函数。当您拥有函数值时,您可以通过将这些值作为数据提供来节省求解器的时间。

fval = zeros(1,N);
for i = 1:N
    p0 = struct('x',xval(i),'y',yval(i));
    fval(i) = evaluate(rosenbrock,p0);
end

评估对这些点的约束。约束值必须是行向量。此步骤是可选的。如果不提供约束值,surrogateopt 将在点 (xval,yval) 处评估约束函数。

discval = zeros(1,N);
lineval = zeros(1,N);
for i = 1:N
    p0 = struct('x',xval(i),'y',yval(i));
    discval(i) = infeasibility(disc,p0);
    lineval(i) = infeasibility(line,p0);
end

创建初始点值对象。

vals = optimvalues(prob,x=xval,y=yval,Objective=fval,disc=discval,line=lineval)
vals = 
  1x40 OptimizationValues vector with properties:

   Variables properties:
            x: [3.1472 4.0579 -3.7301 4.1338 1.3236 -4.0246 -2.2150 0.4688 4.5751 4.6489 -3.4239 4.7059 4.5717 -0.1462 3.0028 -3.5811 -0.7824 4.1574 2.9221 4.5949 1.5574 -4.6429 3.4913 4.3399 1.7874 2.5774 2.4313 -1.0777 1.5548 -3.2881 ... ] (1x40 double)
            y: [-0.6126 -1.1844 2.6552 2.9520 -3.1313 -0.1024 -0.5441 1.4631 2.0936 2.5469 -2.2397 1.7970 1.5510 -3.3739 -3.8100 -0.0164 4.5974 -1.5961 0.8527 -2.7619 2.5127 -2.4490 0.0596 1.9908 3.9090 4.5929 0.4722 -3.6138 -3.5071 ... ] (1x40 double)

   Objective properties:
    Objective: [1.1067e+04 3.1166e+04 1.2698e+04 1.9992e+04 2.3846e+03 2.6593e+04 2.9811e+03 154.8722 3.5498e+04 3.6362e+04 1.9515e+04 4.1421e+04 3.7452e+04 1.1541e+03 1.6457e+04 1.6510e+04 1.5914e+03 3.5654e+04 5.9109e+03 5.7015e+04 ... ] (1x40 double)

   Constraints properties:
         disc: [6.2803 13.8695 16.9638 21.8023 7.5568 12.2078 1.2024 0 21.3146 24.0987 12.7394 21.3751 19.3057 7.4045 19.5331 8.8248 17.7486 15.8313 5.2656 24.7413 4.7390 23.5542 8.1927 18.7982 14.4752 23.7379 2.1343 10.2207 10.7168 ... ] (1x40 double)
         line: [0 0 5.3853 0 0 2.9222 0.6709 0 0 0 0.1841 0 0 0 0 2.5648 4.3798 0 0 0 0 1.1938 0 0 1.1217 1.0155 0 0 0 0 0.3467 1.2245 4.3736 0.9735 7.3213 0 0 0 0 3.3884]

从初始点 vals 开始,使用 surrogateopt 求解问题。

[sol,fv] = solve(prob,vals,Solver="surrogateopt")
Solving problem using surrogateopt.

surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.
sol = struct with fields:
    x: 1.0031
    y: 1.0057

fv = 3.4923e-05

surrogateopt 返回一个稍微接近真实解 x = 1, y = 1 的解,其目标函数值接近 0

输入参数

全部折叠

优化问题,指定为 OptimizationProblem 对象。使用 optimproblem 创建 prob

为了从 optimvalues 获得有用的输出,您还必须在名称值参量中包含一些数据。

名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量后,但参量对组的顺序无关紧要。

示例: val = optimvalues(x=xvals,y=yvals)

变量、命名目标或命名约束的数据,指定为实数双精度数组。指定变量的所有数据名称。目标和约束函数名称是可选的。

当您指定 nval 点时,每个 dataname 参量的值必须具有以下维度。

prob.property.namesize(value)
标量或向量numel(prob.property.name)×nval
矩阵或数组size(prob.property.name)×nval

具体来说,如果 dataname 是一个向量,则 dataname 参量的值是一个具有 nval 列的矩阵。例如,如果 'x' 变量是长度为 2 的行向量,而 nval 为 3,则 'x' 变量规范可能是:

val = optimvalues(prob,'x',[1 2 3; 4 5 -6]);

这个规范意味着 'x' 取三个值 [1,4][2,5][3,-6]

示例: 对于标量 'x' 和二元素行向量 'y'nval = 2val = optimvalues(prob,x=[5,3],y=[1 2;3 4])。输出 val 有两个值: x = 5, y = [1 3]x = 3, y = [2 4]

数据类型: double

未命名目标函数的值,指定为实数双精度数组。值的大小与 dataname 中的相同。

您可以通过两种方式为优化问题指定多个目标函数的值:

  • 优化问题的 Objective 属性是一个函数句柄,其中函数返回一个向量或数组。在这种情况下,将值指定为矩阵。矩阵的每一行代表各个点的一个目标的值。每列代表某一点上各个目标的值。

  • 优化问题的 Objective 属性具有多个命名目标。在这种情况下,使用其名称作为 dataname 参量来指定每个命名目标的值。

这些求解器使用任何提供的目标函数值:

  • ga

  • gamultiobj

  • paretosearch

  • particleswarm

  • surrogateopt

示例: 对于一个目标和两分,val = optimvalues(prob,x=[3,5],Objective=[exp(3)+1,exp(5)-1])

数据类型: double

未命名约束函数的值,指定为实数双精度数组。值的大小与 dataname 中的相同。

您可以通过两种方式为优化问题指定多个约束函数的值:

  • 优化问题的 Constraints 属性是一个函数句柄,其中函数返回一个数组。在这种情况下,将值指定为一个数组,其维度比函数返回的维度多一个。

  • 优化问题的 'Constraints' 属性具有多个命名约束。在这种情况下,使用其名称作为 dataname 参量来指定每个命名约束的值。

这些求解器使用任何提供的非线性约束函数值:

  • paretosearch

  • surrogateopt

这些求解器确保在所有迭代或所有种群成员中满足线性约束:

  • ga

  • gamultiobj

  • paretosearch

  • patternsearch

  • surrogateopt

示例: 对于两点和三个约束,val = optimvalues(prob,x=[3,5],Objective=[exp(3)+1,exp(5)-1],Constraints=[4 5;-7 -2;0.2 12])

数据类型: double

输出参量

全部折叠

点和函数值,以 OptimizationValues 对象的向量返回。该向量有 nval 个条目,其中 nvalval 中的点数。

版本历史记录

在 R2022a 中推出

全部展开