1

我在我的 c++ 代码中使用 SCIP Optimization Suite 3.0.2 来实现调度程序,我想问你实现约束的最佳方法是什么,例如:

t_i*p + d*p + t_i <=0

其中t_i是连续变量,p是二进制变量,d是常数。我找到了所有支持的约束类型的概述:scip 约束,并且我以某种方式将我的问题实现为更线性约束以及它们之间的连接和分离的层次结构,但我有一个怀疑,这使得寻找解决方案变得困难。因此,如果有更直接的方法,我很感兴趣,特别是对于两个变量的乘法。

4

2 回答 2

2

您可以将其表述为二次约束。请参阅“可调用库”示例,

http://scip.zib.de/doc/examples/CallableLibrary/

在特别是文件 string.c 中,有关如何使用可调用库实现此功能的示例,以及一般文档

http://scip.zib.de/doc/html/cons__quadratic_8h.php#ad3707e7f7166bea83b7713cf2e52b0db

玩得开心,安布罗斯

于 2014-04-24T21:36:18.770 回答
2

考虑到您提到的约束,甚至有一个线性公式,至少如果t_i有界是非负的:由于p应该是二元的,因此它分解为

  • p = 0=> <= 0,由于上面假设的非负性而t_i强制为 0t_i
  • p = 1=> 2 * t_i<= -d

您可以将其折叠成单个线性约束,其中p基本上是对 施加上限t_i

t_i + d / 2 * p <= 0

使用 SCIP 的可调用库,您可以直接将此约束创建为varbound约束。

于 2014-04-25T10:13:59.220 回答