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