Gurobi Python ==和变量

时间:2015-07-04 17:20:36

标签: python if-statement gurobi

==如何在Gurobi Python中运作?

在我创建了所需的变量(x[s,d,r])后,我正在尝试制作if语句,如x[s,d,r] == 1。问题是,这个陈述总是正确的,所以如果我把它设置为x[s,d,r]==0x[s,d,r]==2并不重要,它总是一样的。

x[s,d,r]是由x[s,d,r] = m.addVar(0.0,1.0,1.0,GRB.BINARY,"x_"+ s+"_"+ d +"_" + r)定义的二进制变量。

z = 0.0
for s in students:
    for d in dates:
        if (s,d) in preferences:        
            if preferences[s,d]!=0:
                for r in rooms:
                    if (d,r) in tutorials:
                        if x[s,d,r]>0.001:
                            print('%s:%s:%s:%s '%(s,d,r,preferences[s,d]))
                            z = z + preferences[s,d]
                        else:
                            print('no')                                 

 m.setObjective((z), GRB.MAXIMIZE)

因此,如果x [s,d,r]> 0.001:是始终评估为“true”的部分。

2 个答案:

答案 0 :(得分:2)

grb.Expr的==运算符返回一个grb.Constraint对象。正如本answer中所提到的,约束对象总是很简洁,所以你总是会得到' if'一部分。

假设您已经优化,您需要优化解决方案中x值的实际值。由X attrubutes给出的grb.Variable。 所以你应该用

替换你的代码
                        if x[s,d,r].X>0.001:

它应该按预期工作。

答案 1 :(得分:0)

要对此进行调查,您应该在Python shell中单独评估x[s,d,r] == 1。我相信你会发现结果永远不是布尔值,而是另一个Gurobi对象。 (我期待LinExpr之类的东西。)

Gurobi(明智地)重载变量的所有算术运算,以便更容易构造约束。这导致非常人类可读的模型构建代码。 (恕我直言,几乎与OPL或AMPL一样好,具有Python的所有其他优点)。

您是否尝试检查此变量的解决方案值是否为1?为此,我认为你想要x[s,d,r].x == 1,它将评估为布尔值。 (但只有有模型的解决方案)。