检查优化方案
获取数值解
的解决
函数返回一个作为结构的解决方案,问题中的每个变量在结构中都有一个字段。为了方便地从这个结构中获得问题中表达式的数值,可以使用评估
函数。
例如,求解两个变量的线性规划问题。
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
.
解决方案耗时太长
如果解决
需要很长时间,有一些可能的原因和补救措施。
问题制定缓慢.如果在嵌套循环中定义了目标或约束表达式,则
解决
将问题内部转换为矩阵形式需要很长时间。为了加快解决的速度,试着用向量化的方式来表达你的表达式。看到创造有效的优化问题.混合整数线性规划求解速度较慢.有时你可以通过设置选项来加快整型问题的速度。你还可以重新制定问题,使其更快地解决。看到整型线性规划.
超过求解器限制.为了解决一些问题,
解决
可以采取多于默认数量的解决步骤。对于具有整数约束的问题,通过增加LPMaxIterations
,MaxNodes
,MaxTime
,或RootLPMaxIterations
选项设置为高于默认值的值。若要设置这些选项,请使用optimoptions (intlinprog,…)
.对于非整数问题,增加MaxIterations
选择使用optimoptions(‘linprog’,‘MaxIterations’,…)
.看到选项
.