主要内容

检查优化解决方案

获取数字解决方案

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

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

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解决问题。找到最优解。x: 0.6667 y: 1.3333

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

[溶胶,fval] =解决(问题)
使用linprog解决问题。找到最优解。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因(k, J) =不可行“若干”num2str (j)], pt);结束结束

结果infeas (a, b)在关联点的任何地方都有非零值pt{一}约束是不可行的吗b

解决方案耗时太长

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

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

  • 混合整数线性规划的求解速度很慢.有时你可以通过设置选项来加速整数问题。你也可以重新规划问题,让它更快地解决。看到整定整数线性规划

  • 非线性规划的求解是缓慢的.建议,请参阅解算耗时太长.要了解更多的建议,请参见当求解器失败时

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

另请参阅

||

相关的话题