Java调用cplex出现的精度丢失问题

本人,cplex新手,java新手,编程新手。
目前,需要求解一个非线性规划,求解思路是:将非线性规划-转为线性规划,线性规划为非线性规划提供了下界,然后通过分支定界方法找非线性规划的最优解。 其中,分支定界是用java写的。转化后的线性规划是java调用cplex求解的。

但是,求解过程遇到了下面的问题:pi 为输出的决策变量,ibpi和ubpi分别为输入的决策变量的上下界。
Java调用cplex出现的精度丢失问题_第1张图片
部分求解结果(描红)超出了所设置的上下界,且超出部分出现在了小数点后17、18位。
当将相同的上下界输入到cplex软件中直接求解时,发现cplex对输入的参数进行了处理,强行转为了float精度,且输出的结果也是float精度。所以,在java中输出cplex的结果,java会把cplex的输入强行转为double。 这样一个double-float-double的转换过程,出现了上述图片中所得到的决策变量大于上下界的情况。

查看Cplex教程,发现cplex能保证的精度是9位有效,对于9位以后的数字,cplex不能保证其有效性。
虽然我不需要这么高的精度,但是一旦出现决策变量值在上下界限外,后续的分支过程就会出现死循环。

目前,已经尝试了下面的方法:
方法1. 在java中就设置所有参数或变量为float,但是cplex中的java API 好像不支持针对float决策变量的定义? 感觉很奇怪,也可能是我不会用。
方法2. cplex的解传给Java的过程中,强行保留几位小数。这样的话,后续的计算以及分支定界过程中,精度丢失的问题会进一步扩大,以至于得到的最优解并未真正的最优解。
方法3. 在cplex传解给java的过程中,加入了一个判断。如果决策变量的值大于了上界,就把上界的值赋给决策变量,如果小于了下界,就把下界的值赋给决策变量。但是会出现和方法2一样的问题。

各位路过的大神,求解决方法或思路!!!

你可能感兴趣的:(java小白正在学写代码)