主要内容

检查优化解决方案

获取数字解决方案

解决函数以结构的形式返回一个解,问题中的每个变量在结构中都有一个字段。为方便地从该结构中获得问题中表达式的数值,可以使用评估函数。

例如,求解一个双变量线性规划问题。

x = optimvar(“x”);y = optimvar (y);概率= optimproblem;概率。客观= -x -y/3;prob.Constraints。con1 = x + y <= 2;prob.Constraints。con2 = 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)
使用linprog解决问题。找到最优解。Sol = struct与字段:x: 0.6667 y: 1.3333

假设你想要目标函数在解处的值。您可以重新运行这个问题,这次询问目标函数值和解。

[溶胶,fval] =解决(问题)
使用linprog解决问题。找到最优解。Sol = struct with fields: x: 0.6667 y: 1.3333 fval = -1.1111

或者,对于一个耗时的问题,通过在使用的解处评估目标函数来节省时间评估

fval =评估(prob.Objective sol)
fval = -1.1111

检查解决方案质量

要检查所报告的解决方案是否准确,可以查看解决.返回所有解决输出

[溶胶,fval exitflag、输出λ)=解决(问题);
  • 检查出口标志。exitflag = OptimalSolution通常意味着解决收敛到解决方案。另一种解释exitflag值,请参阅exitflag

  • 在命令行或输出结构中检查退出消息。当退出消息声明解算器收敛到某个解时,则该解通常是可靠的。此消息对应于exitflag = OptimalSolution

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

不可行解

如果解决报告您的问题是不可行的(退出标志是NoFeasiblePointFound),从不同的角度审视问题的不可行性,看看哪些限制可能过于严格。假设有一个连续优化变量x它在所有分量上都有有限的界限,并且有约束条件constr1通过constr20

N = 100;%检查100点infeas = 0 (N, 20);%分配L = x.LowerBound;U = x.UpperBound;S =元素个数(L);pthist =细胞(N);k = 1:N pt = L + rand(size(L)).*(U-L);pthist {k} = pt;J = 1:20 infas (k, J) =不可行([“若干”num2str (j)], pt);结束结束

结果infeas (a, b)在相关点处是否有非零值pt{一}对于约束是不可行的b

解决方案耗时太长

如果解决需要很长时间,有几个可能的原因和补救措施。

  • 问题的形成是缓慢的.如果在嵌套循环中定义了目标或约束表达式,那么解决将问题内部转化为矩阵形式可能需要很长时间。为了加快求解速度,请尝试以向量化的方式表达表达式。看到创建有效的优化问题

  • 混合整数线性规划求解速度慢.有时,通过设置选项可以加快整数问题的速度。您还可以重新定义问题,使其更快地解决。看到整型线性规划调优

  • 非线性规划求解速度慢.建议,请参阅求解花费太长时间.有关进一步的建议,请参见当求解器失败时

  • 解算器限制超过.为了解决一些问题,解决可以采用多于默认的解决步骤数。对于整数约束的问题,增加允许的步骤数LPMaxIterationsMaxNodesMaxTime,或RootLPMaxIterations选项设置为高于默认值的。要设置这些选项,请使用optimoptions (intlinprog,…).对于非整数问题,增加MaxIterations选择使用optimoptions(‘linprog’,‘MaxIterations’,…).看到选项

另请参阅

||

相关的话题

Baidu
map