cplex:通过缩放线性程序降低cplexlp的有效容差

时间:2014-10-30 22:16:16

标签: matlab mathematical-optimization linear-programming cplex

我在matlab(cplexlp)中使用cplex线性编程来解决问题

min f'u s.t. Au>=b, u>=lb
使用

[u,minima,flag] = cplexlp(f,-A,-b,[],[],lb);

但我需要一个低于1e-9的解决方案容差,这是文档中的最小容差。 我想我可以扩展问题(例如10000)并实现1e-13的有效容差。

scale=10000;
tolerance=1e-9;
options = cplexoptimset('cplex');
options.simplex.tolerances.feasibility = tolerance;
options.simplex.tolerances.optimality = tolerance;
[u,minima,flag] = cplexlp(scale*f,-scale*A,-scale*b,[],[],scale*lb,[], [], options);
minima = minima / scale;

它不起作用,公差提高到1e-11但不低于。下面的图像以log10的比例显示“真实解决方案”(使用不同的方法找到)和算法返回的不同参数的解决方案(每种颜色不同A,b和x轴是控制问题的问题的一些参数)解)。如您所见,只要高于1e-11,就可以实现真正的解决方案。

有关为何如此或如何避免此问题的任何建议?

Saturation of the minimial solution

2 个答案:

答案 0 :(得分:0)

与大多数其他代码一样,CPLEX使用双精度算法。在这种环境中,您通常只能信任您的结果,最多只有前9位或10位,可能是11位。这也是您无法在CPLEX中设置较小容差的原因。

要获得更准确的结果,您必须使用使用有理算术的求解器。 QSopt_exSoPlex (with iterative refinement)是两种可能性。我不知道在Matlab中如何做到这一点。

答案 1 :(得分:0)

其他答案offered in the cplex forum,但都没有解决。