我在Gurobi的数学符号中设置了以下约束。 x
变量是二进制的。 sigmaplus
和sigmaminus
变量是正面和连续的。
Subject To
858 x[1,_2] + 1092 x[1,_3] - sigmaplus[1] + sigmaminus[1] = -200 # Constraint 1
858 x[1,_2] + 1092 x[1,_3] >= -1800 # Constraint 2
858 x[1,_2] + 1092 x[1,_3] <= 0 # Constraint 3
x[1,_2] + x[1,_3] = 1 # Constraint 4
720 x[2,_1] + 990 x[2,_2] - sigmaplus[2] + sigmaminus[2] = 2000 # Constraint 5
720 x[2,_1] + 990 x[2,_2] >= -500 # Constraint 6
720 x[2,_1] + 990 x[2,_2] <= 3000 # Constraint 7
x[2,_1] + x[2,_2] = 1 # Constraint 8
...
...
您可以注意到,constraint 2
和constraint 3
使解决方案变得不可行。当我的x
变量出现这种情况时,我希望Gurobi通过将那些有冲突的x
值设置为0来进行优化。因此,对于此示例,我想要x [1,2]
并且x[1,3]
等于0,以便找到没有这些变量的可行解。有没有办法为Gurobi 7.0.2
编码。
另外,我正在使用2.7.12 Anaconda 4.2.0(64-bit)
。以下是我用来放松问题以找到解决方案的代码。
if m.status == GRB.INFEASIBLE:
m.feasRelaxS(1, False, False, True)
在某些情况下这很好用。我的意思是,它将创建变量的不可行性设置为0.但是,在constraints 1,2,
和3
不创建任何不可行性的某些其他情况下,constraint 4
会产生不可行性,求解器会增加权限 - Constraint 4
的一面。所以,我需要找到一种在这种情况下将它们设置为0的方法。任何建议都表示赞赏。
答案 0 :(得分:1)
feasRelaxS ( relaxobjtype, minrelax, vrelax, crelax )
<强>参数:强>
relaxobjtype:找到最低成本放宽时使用的成本函数。
minrelax:要执行的可行性放宽类型。
vrelax:表示是否可以放宽变量边界。
crelax:表示是否可以放宽约束。
此函数修改Model对象以创建可行性松弛。 该方法提供了许多用于指定放松的选项。 minrelax 参数是一个布尔值,用于控制创建的可行性松弛的类型。如果 minrelax = False,则优化返回的模型可提供最小化违规成本的解决方案。如果 minrelax = True,则优化返回的模型会找到最小化原始目标的解决方案,但只能从最小化违规成本的解决方案中找到解决方案。 如果您希望模型放宽约束不可行的变量值,请将 vrelax 从False更改为True。您可以阅读上面给出的完整说明:{{3} }