cplex是否有可能获得整数解?

时间:2020-09-03 01:30:22

标签: cplex

我将Ilog Cplex与Visual C ++ 2015结合使用来解决MILP问题。我们知道CPLEX Optimizer实现了传统的浮点算法来表示数字。我有以下问题。 (1)是否可以在不使用函数IloRound的情况下从求解器获取精确的整数解? cplex.setParam(IloCplex :: EpInt,0)是否有效?我发现一些整数变量是0.999999 ...即使我使用cplex.setParam(IloCplex :: EpInt,0)。 (2)获得最佳解后,无需使用函数IloRound就直接将一些整数变量分配给int类型的数组。然后,使用setBounds函数将这些变量固定为int类型数组中的值,然后重新运行模型求解。我尊重相同的最佳解决方案。但是在某些方面,重新运行是不可行的。正确的方法是什么?

1 个答案:

答案 0 :(得分:1)

为了将整数变量的浮点值转换为实际的整数值,您必须使用某种舍入方法。甚至最好使用lrint()之类的函数。在C ++中,如果将浮点值转换为整数值,则这些值将被截断而不是四舍五入。这意味着像0.999999这样的值将转换为0而不是1。这当然会导致不可行。因此,为了编写健壮的代码,无论浮点值是否完全是整数,都应使用一个将浮点数显式转换为整数的函数。

EpInt设置为0应该可以防止CPLEX返回整数变量的小数部分值。但是,这仅适用于 presolved 模型。当解开溶液时,很小的分数会爬入溶液中。

这也可能是由您的问题数据中的错误数字引起的。您应该检查您的模型是否具有应实际上为整数的小数部分,具有广泛的系数等。为了检查是否可以将DataCheck参数设置为2,并查看建模辅助功能是否产生日志中的所有警告。

相关问题