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