主要内容

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

检查优化解

获得数值解

solve 函数以结构体形式返回解,其中问题中的每个变量在结构体中都有一个字段。为了从该结构轻松获取问题中表达式的数值,请使用 evaluate 函数。

例如,求解两个变量的线性规划问题。

x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
prob.Objective = -x -y/3;
prob.Constraints.cons1 = x + y <= 2;
prob.Constraints.cons2 = x + y/4 <= 1;
prob.Constraints.cons3 = x - y <= 2;
prob.Constraints.cons4 = x/4 + y >= -1;
prob.Constraints.cons5 = x + y >= 1;
prob.Constraints.cons6 = -x + y <= 2;

sol = solve(prob)
Solving problem using linprog.

Optimal solution found.

sol = 

  struct with fields:

    x: 0.6667
    y: 1.3333

假设您想要解中的目标函数值。您可以重新运行该问题,这次要求目标函数值和解。

[sol,fval] = solve(prob)
Solving problem using linprog.

Optimal solution found.

sol = 

  struct with fields:

    x: 0.6667
    y: 1.3333


fval =

   -1.1111

或者,对于耗时的问题,可以使用 evaluate 评估解中的目标函数来节省时间。

fval = evaluate(prob.Objective,sol)
fval =

   -1.1111

检查解质量

要检查报告的解是否准确,您可以查看 solve 的输出。返回所有 solve 输出

[sol,fval,exitflag,output,lambda] = solve(prob);
  • 检查退出标志。exitflag = OptimalSolution 通常意味着 solve 收敛到解。有关其他 exitflag 值的解释,请参阅 exitflag

  • 检查命令行或输出结构体中的退出消息。当退出消息表明求解器已收敛到一个解时,通常该解是可靠的。该消息对应于 exitflag = OptimalSolution

  • 当您有整数约束时,请检查退出消息或输出结构体中的绝对间隙和相对间隙。当这些间隙为零或接近于零时,解是可靠的。

不可行解

如果 solve 报告您的问题不可行(退出标志为 NoFeasiblePointFound),请从各个点检查问题不可行性,以查看哪些约束可能过于严格。假设您有一个名为 x 的单一连续优化变量,该变量对所有分量都有有限边界,并且您有约束 constr1constr20

N = 100; % check 100 points
infeas = zeros(N,20); % allocate
L = x.LowerBound;
U = x.UpperBound;
S = numel(L);
pthist = cell(N);
for k = 1:N
    pt = L + rand(size(L)).*(U-L);
    pthist{k} = pt;
    for j = 1:20
        infeas(k,j) = infeasibility(['constr',num2str(j)],pt);
    end
end

当关联点 infeas(a,b) 对于约束 pt{a} 不可行时,结果 b 具有非零值。

解耗时太长

如果 solve 花费很长时间,则可能存在以下几种原因及补救措施。

  • 问题表示缓慢。如果您在嵌套循环中定义了目标或约束表达式,那么 solve 可能需要很长时间才能将问题内部转换为矩阵形式。为了加快解,请尝试以向量化的方式构造表达式。请参阅创建有效的优化问题

  • 混合整数线性规划解很慢。有时您可以通过设置选项来加快整数问题的速度。您还可以重新表述问题,以便更快地求解它。请参阅调整整数线性规划

  • 非线性规划解很慢。如需建议,请参阅 求解器耗时过长。如需更多建议,请参阅 当求解器失败时

  • 超出求解器限制。为了求解某些问题,solve 可能需要超过默认的解步骤数。对于具有整数约束的问题,通过将 LPMaxIterationsMaxNodesMaxTimeRootLPMaxIterations 选项增加到高于默认值来增加允许的步数。要设置这些选项,请使用 optimoptions('intlinprog',...)。对于非整数问题,使用 MaxIterations 增加 optimoptions('linprog','MaxIterations',...) 选项。请参阅选项

另请参阅

| |

主题