【问题标题】:cplex Is it possible to get an integer solution?cplex 是否有可能得到一个整数解?
【发布时间】:2020-12-22 05:08:43
【问题描述】:

我正在使用带有 Visual C++ 2015 的 Ilog Cplex 来解决我的 MILP 问题。我们知道 CPLEX 优化器实现传统的浮点算法来表示数字。我有以下问题。 (1) 是否可以在不使用函数 IloRound 的情况下从求解器获得精确的整数解? cplex.setParam(IloCplex::EpInt, 0) 有效吗?我发现一些整数变量是 0.999999 ......即使我使用 cplex.setParam(IloCplex::EpInt, 0)。 (2) 当我得到一个最优解时,我直接将一些整数变量赋值给一个int类型的数组,而不使用函数IloRound。然后我使用 setBounds 函数将这些变量修复为这个 int 类型数组中的值并重新运行模型求解。我尊重相同的最佳解决方案。但有时重新运行是不可行的。正确的做法是什么?

【问题讨论】:

    标签: cplex


    【解决方案1】:

    为了将整数变量的浮点值转换为实际的整数值,您必须使用某种舍入。或者甚至更好地使用像lrint() 这样的函数。在 C++ 中,如果将浮点值转换为整数值,则这些值将被截断,而不是四舍五入。这意味着像 0.999999 这样的值将被转换为 0 而不是 1。那当然会导致不可行。所以为了写出健壮的代码,你应该使用一个函数将浮点数显式转换为整数,不管浮点数是否完全是整数。

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

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

    【讨论】:

    • 这很有帮助。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多