首页 文章

Gurobi:在Python中放松不可行的模型

提问于
浏览
0

我在Gurobi的数学符号中设置了以下约束 . x 变量是二进制的 . sigmaplussigmaminus 变量是正的和连续的 .

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 2constraint 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的方法 . 任何建议表示赞赏 .

1 回答

  • 1
    feasRelaxS ( relaxobjtype, minrelax, vrelax, crelax )
    

    Arguments:

    relaxobjtype: 找到最低成本放宽时使用的成本函数 .

    minrelax: 要执行的可行性放宽类型 .

    vrelax: 指示是否可以放宽变量边界 .

    crelax: 表示是否可以放宽约束 .

    此函数修改Model对象以创建可行性松弛 . 该方法提供了许多用于指定放松的选项 . minrelax参数是一个布尔值,用于控制创建的可行性松弛的类型 . 如果minrelax = False,则优化返回的模型可提供最小化违规成本的解决方案 . 如果minrelax = True,则优化返回的模型会找到最小化原始目标的解决方案,但只能从最小化违规成本的解决方案中找到解决方案 . If you want your model to relax variable value for which the constraint is infeasible, change vrelax from False to True. 您可以阅读以下内容的完整说明:https://www.gurobi.com/documentation/7.5/refman/py_model_feasrelaxs.html

相关问题