微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

混合整数线性规划中的整数除法

如何解决混合整数线性规划中的整数除法

在 MILP 程序中对整数除法进行编码的求解器友好方式是什么?目前我正在使用以下编码(在 Gurobi python 中),这可能不完全正确,我希望不是最佳的。

# res is an integer variable in the solver
# val is an integer variable in the solver
# divVal is just a python variable,a constant for solver
offset = 0.999
divRes = val / divVal
model.addConstr(divRes - offset <= res)
model.addConstr(res <= divRes)

上面的编码本质上是说 res 应该被分配一个介于 divRes - offsetdivRes间的值,因为 offset 是 0.999,所以范围内应该只有 1 个整数,并且求解器被迫将其分配给 res。有没有更好(更快)的编码方式?

编辑:通过整数除法我的意思是除法的结果是一个整数。如果除法后有任何小数部分,我想丢弃它并将结果舍入将存储在 res 中。我本质上想做的是将一个数字移动一些 x 位。在 MILP 求解器中,这归结为将一个数除以 (1 << x),但除法后有一些我想去掉的小数部分。

解决方法

model.addRange(val - divVal*res,0.99999,name="Range")

我更愿意只使用上面提到的范围约束。 将更严格的边界(给定范围内只有整数,我们需要)直接合并到模型中不仅可以改善数值行为,但它也加快了优化过程(因为 gurobi 使用分支定界算法来获得解决方案) https://www.gurobi.com/documentation/9.1/refman/improving_ranges_for_varia.html

最优性 - 模型的微小变化可以轻松计算出最优结果,如果 divVal* res 将变为整数。 Gurobi 不提供小于约束。此外,当变量的值距离最近的整数值小于 IntFeasTol 时,Gurobi 认为该变量的完整性限制得到满足。 IntFeasTol 容差的默认值为 1e-5,为了更好的结果,可以进一步减小到 1e-9。然而,制作多目标模型,给模型增加了额外的复杂性。我不想推荐它。

model.addRange(val - divVal*res,1,name="Range")

model.setObjective(res,GRB.MINIMIZE)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?