主要内容

检查优化方案

获取数值解

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

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

X = optimvar(' X ');Y = optimvar(' Y ');Prob =优化问题;概率。目标= -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

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

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

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

fval = evaluate(probe . objective,sol)
Fval = -1.1111

检查溶液质量

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

[sol,fval,exitflag,output,lambda] = solve(prob);
  • 检查出口标志。exitflag = OptimalSolution通常意味着解决收敛到解。另一个的解释exitflag值,请参阅exitflag

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

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

不可行解

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

N = 100;%检查100分infeas = 0 (N,20);%分配L = x下界;U = x.UpperBound;S =数字(L);pthist = cell(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’,…).看到选项

另请参阅

||

相关的话题