在python中使用pyscipopt,我设置了一个连续变量和二进制变量:
For j in J:
x[j] = model.addVar(vtype="C", name="x(%s)"%j)
y[j] = model.addVar(vtype="B", name="y(%s)"%j)
我想做的是得到一个简单的指示符变量:
when x[j] = 0 -> y[j] = 0, and when x[j] > 0 -> y[j] = 1
但我不知道如何设置约束。我试着读大M,但似乎仍在挣扎
最终,目标是让优化模型在解决方案中只使用x[3]或x[7]中的一个,或两者都不使用,但不能同时使用
因此,一旦指标变量起作用,我最终会想到以下几点:
model.addCons(y[3] + y[7] <= 1)
如果有更好的方法,也可以提供任何建议
大M方法是:
基于指标约束的方法如下所示:
在pyscipot中,可以使用
model.addConsIndicator
来指定这一点。注意,当x没有好的上界时,可以使用这种方法。您可能还想看看model.addConsCardinality
以获得更简单的方法编码
这里是琐碎的部分。将数学公式转换成代码。SCIP Python接口的作者已经尽了最大努力使这一步骤变得非常简单。因此,对于专门从事复制粘贴的程序员来说:big-M方法可以编码为:
解决方案如下所示:
事实上,并非x[3]和x[7]都是非零的
使用
model.addConsCardinality
可以获得相同的结果:结果是:
同样,不是x[3]和x[7]都是非零的
我很困惑,为什么需要提供代码。答案中的详细描述应该足以让您走上正确的道路。在任何时候,我都喜欢在一堆代码之上建立一个精心制作、陈述良好的数学模型
相关问题 更多 >
编程相关推荐