检查优化解
获得数值解
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
的单一连续优化变量,该变量对所有分量都有有限边界,并且您有约束 constr1
到 constr20
。
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
可能需要超过默认的解步骤数。对于具有整数约束的问题,通过将LPMaxIterations
、MaxNodes
、MaxTime
或RootLPMaxIterations
选项增加到高于默认值来增加允许的步数。要设置这些选项,请使用optimoptions('intlinprog',...)
。对于非整数问题,使用MaxIterations
增加optimoptions('linprog','MaxIterations',...)
选项。请参阅选项
。
另请参阅
evaluate
| infeasibility
| solve