cplex 是否有可能得到整数解?
cplex Is it possible to get an integer solution?
我正在使用 Ilog Cplex 和 Visual C++ 2015 来解决我的 MILP 问题。我们知道 CPLEX 优化器实现传统的浮点算法来表示数字。我有以下问题。
(1) 是否可以在不使用函数 IloRound 的情况下从求解器获得精确的整数解? cplex.setParam(IloCplex::EpInt, 0) 有效吗?我发现一些整数变量是 0.999999... 即使我使用 cplex.setParam(IloCplex::EpInt, 0)。
(2)当我得到一个最优解时,我直接将一些整型变量赋值给一个int类型的数组,而没有使用函数IloRound。然后,我使用 setBounds 函数将这些变量固定为此 int 类型数组中的值,并重新运行模型求解。我尊重相同的最佳解决方案。但有时重新运行是不可行的。正确的做法是什么?
为了将整数变量的浮点值转换为实际整数值,您必须使用某种舍入。或者甚至更好地使用 lrint()
这样的函数。在 C++ 中,如果将浮点值转换为整数值,则值会被截断,而不是四舍五入。这意味着像 0.999999 这样的值将被转换为 0 而不是 1。这当然会导致不可行。因此,为了编写健壮的代码,您应该使用一个将浮点数显式转换为整数的函数,无论浮点值是否为整数。
将 EpInt
设置为 0 应该可以防止 CPLEX 返回整数变量的小数值。但是,这仅适用于 presolved 模型。当解压解决方案时,小的分数可能会进入解决方案。
也有可能是你的问题数据中的数字错误造成的。您应该检查您的模型是否有实际上应该是整数的小数,系数范围很广等。为了检查您是否可以将 DataCheck
参数设置为 2 并查看建模辅助功能是否产生日志中的任何警告。
我正在使用 Ilog Cplex 和 Visual C++ 2015 来解决我的 MILP 问题。我们知道 CPLEX 优化器实现传统的浮点算法来表示数字。我有以下问题。 (1) 是否可以在不使用函数 IloRound 的情况下从求解器获得精确的整数解? cplex.setParam(IloCplex::EpInt, 0) 有效吗?我发现一些整数变量是 0.999999... 即使我使用 cplex.setParam(IloCplex::EpInt, 0)。 (2)当我得到一个最优解时,我直接将一些整型变量赋值给一个int类型的数组,而没有使用函数IloRound。然后,我使用 setBounds 函数将这些变量固定为此 int 类型数组中的值,并重新运行模型求解。我尊重相同的最佳解决方案。但有时重新运行是不可行的。正确的做法是什么?
为了将整数变量的浮点值转换为实际整数值,您必须使用某种舍入。或者甚至更好地使用 lrint()
这样的函数。在 C++ 中,如果将浮点值转换为整数值,则值会被截断,而不是四舍五入。这意味着像 0.999999 这样的值将被转换为 0 而不是 1。这当然会导致不可行。因此,为了编写健壮的代码,您应该使用一个将浮点数显式转换为整数的函数,无论浮点值是否为整数。
将 EpInt
设置为 0 应该可以防止 CPLEX 返回整数变量的小数值。但是,这仅适用于 presolved 模型。当解压解决方案时,小的分数可能会进入解决方案。
也有可能是你的问题数据中的数字错误造成的。您应该检查您的模型是否有实际上应该是整数的小数,系数范围很广等。为了检查您是否可以将 DataCheck
参数设置为 2 并查看建模辅助功能是否产生日志中的任何警告。