我在我的c ++代码中使用SCIP Optimization Suite 3.0.2来实现调度程序,我想问一下实现约束的最佳方法是什么,如:
t_i*p + d*p + t_i <=0
其中t_i
是连续变量,p
是二进制变量,d
是常量。我找到了所有受支持的约束类型的概述:scip constraints我以某种方式将我的问题实现为更多线性约束的层次结构以及它们之间的连接和分离,但我有一种怀疑,这使得难以搜索解决方案。因此,如果有一些更简单的方法,我感兴趣,特别是对于两个变量的乘法。
答案 0 :(得分:2)
您可以将其表示为二次约束。请参阅“可调用库”示例
http://scip.zib.de/doc/examples/CallableLibrary/
在particalur文件string.c中,有关如何使用可调用库实现此操作的示例,以及一般文档
http://scip.zib.de/doc/html/cons__quadratic_8h.php#ad3707e7f7166bea83b7713cf2e52b0db
玩得开心, AMBROS
答案 1 :(得分:2)
考虑到你提到的约束,甚至有一个线性公式,至少如果t_i
被限制为非负的:
由于p
应该是二进制的,因此它会分解为
p = 0
=&gt; t_i
&lt; = 0,由于上面假定的非负性而迫使t_i
为0 p = 1
=&gt; 2 * t_i
&lt; = - d
您可以将其折叠为单个线性约束,其中p
基本上强加t_i
的上限:
t_i + d / 2 * p <= 0
使用SCIP的可调用库,您可以直接将此约束创建为varbound约束。