有两种方法可以实现懒惰MIP模型的约束。
- 如果约束可以枚举前期,设置懒惰的属性的约束条件应该被视为懒惰。
- 如果约束必须在生成MIP搜索,您需要编写一个回调函数,设置LazyConstraint参数为1。详细信息参考手册中可以找到不同的api,明白了Model.cbLazy ()为例。此外,有一个旅行商问题(TSP)的例子说明了如何添加延迟约束通过回调(也可用Gurobi安装子目录的示例中)。
当决定列举延迟约束的前期和增加他们在搜索之间使用一个回调函数,有许多权衡要牢记:
内存:通常的数量级约束问题将决定他们是否可以枚举前期。以TSP为例。常见的每一对城市模型使用变量,约束以确保每个城市与其他两个城市,和一个指数的约束确保sub-tours不能发生。甚至与50个城市相对较小的情况下,消除sub-tour约束要求的数量是棘手的,因此必须添加的约束懒洋洋地通过一个回调函数。否则,机器就会耗尽内存。
方便:编写一个回调函数来检测如果违反条件,然后添加适当的约束来纠正这种违反是一个具有挑战性的问题,为用户耗费时间。如果约束可以枚举的前期,在需要时可以依靠Gurobi添加约束,而不必投资自己的努力开发一个回调函数。
控制:编写一个回调函数为用户提供完全控制哪些约束添加到模型和什么时候在搜索。枚举的懒惰少约束用户控制。约束只用于切断了可行的解决方案,即。,他们不能用来收紧线性松弛。在说,用户仍然可以指定如何积极Gurobi应该约束拉进模型使用懒惰的参数:
值为1,约束可以用来切断一个可行的解决方案,但它不一定会把如果另一个懒惰的约束也切断了解决方案。值为2,所有延迟约束违反的一个可行的解决方案将被拉到模型中。值为3,懒惰的约束,切断了放松在根节点也拉的解决方案。
- 通信开销:Gurobi即时云和Gurobi计算服务器工作在客户端-服务器模式,通过Gurobi API模型是建立在一台机器上(客户端),但实际上在另一个(服务器)来解决。重要的是要注意,在这样的场景在客户端机器上执行回调函数。如果经常调用的回调函数,那么这个可以创建延迟问题由于额外的通信要求。
不支持延迟约束在连续模型(QP, LP或二次)。懒惰约束添加到一个连续的模式,你必须等待,直到解决(或手动停止),添加新的约束和重新开始解决。
评论
0评论
文章是关闭了评论。