2

==Gurobi Python是如何工作的?

在我创建了所需的变量 ( x[s,d,r]) 之后,我试图做出一个if类似x[s,d,r] == 1. x[s,d,r]==0问题是,这个陈述总是正确的,所以我将它设置为or并不重要x[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: 是始终评估为“真”的部分。

4

2 回答 2

2

grb.Expr的==运算符返回一个 grb.Constraint 对象。正如这个答案中提到的,约束对象总是真实的,所以你总是会得到'if'部分。

假设您已经优化,您想要优化解决方案中 x 值的实际值。这是由Xgrb.Variable 上的属性给出的。所以你应该用你的代码替换你的代码

                        if x[s,d,r].X>0.001:

它应该可以按您的预期工作。

于 2015-07-05T03:31:21.327 回答
0

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

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

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

于 2015-07-04T17:33:01.553 回答