Gurobi:放宽 Python 中的不可行模型
Gurobi: Relaxing Infeasible Model in Python
我在 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。任何建议表示赞赏。
feasRelaxS ( relaxobjtype, minrelax, vrelax, crelax )
参数:
relaxobjtype:寻找最小成本松弛时使用的成本函数。
minrelax: 要执行的可行性放宽类型。
vrelax:表示是否可以放宽变量边界。
crelax:表示是否可以放宽约束。
此函数修改模型对象以创建可行性松弛。
此方法提供了许多用于指定松弛的选项。
minrelax 参数是一个布尔值,它控制创建的可行性松弛类型。如果 minrelax=False,优化返回的模型会给出一个解决方案,使违规成本最小化。如果 minrelax=True,优化返回的模型会找到一个最小化原始 objective 的解决方案,但只能从那些最小化违规成本的解决方案中找到。 如果您希望模型放宽约束不可行的变量值,请将 vrelax 从 False 更改为 True。 您可以阅读给出的完整说明上:https://www.gurobi.com/documentation/7.5/refman/py_model_feasrelaxs.html
我在 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。任何建议表示赞赏。
feasRelaxS ( relaxobjtype, minrelax, vrelax, crelax )
参数:
relaxobjtype:寻找最小成本松弛时使用的成本函数。
minrelax: 要执行的可行性放宽类型。
vrelax:表示是否可以放宽变量边界。
crelax:表示是否可以放宽约束。
此函数修改模型对象以创建可行性松弛。 此方法提供了许多用于指定松弛的选项。 minrelax 参数是一个布尔值,它控制创建的可行性松弛类型。如果 minrelax=False,优化返回的模型会给出一个解决方案,使违规成本最小化。如果 minrelax=True,优化返回的模型会找到一个最小化原始 objective 的解决方案,但只能从那些最小化违规成本的解决方案中找到。 如果您希望模型放宽约束不可行的变量值,请将 vrelax 从 False 更改为 True。 您可以阅读给出的完整说明上:https://www.gurobi.com/documentation/7.5/refman/py_model_feasrelaxs.html