2014-10-30 131 views
0

我使用在MATLAB(cplexlp)CPLEX线性规划来解决使用CPLEX:通过缩放线性规划

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

,但我需要的问题

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

降低cplexlp的有效公差小于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

回答

0

CPLEX,像大多数其他码,使用的双精度运算。在这种环境下,你通常只能相信你的结果只有前9位或10位,也许11位数字。这也是您无法在CPLEX中设置较小容差的原因。

为了获得更准确的结果,您将不得不使用使用有理算术的求解器。 QSopt_exSoPlex (with iterative refinement)是两种可能性。我不知道这是如何从Matlab内部实现的。