【问题标题】:Gurobi Python == and VariablesGurobi Python == 和变量
【发布时间】:2015-07-05 11:31:21
【问题描述】:

== 在 Gurobi Python 中如何工作?

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

【问题讨论】:

  • x[s,d,r]==0x[s,d,r]==2 是相等测试,而不是赋值。你没有改变价值。使用单个 = 分配:x[s,d,r] = 0
  • 所以这是我真正打算检查变量 x[s,d,r] 是设置为 1 还是仍为 0。 “x[s,d,r]==0”表示我已经更改了 if 语句,因此它会检查 x == 0。
  • 对不起,这似乎是一个令人困惑的问题。 x[s,d,r] 是一个 gurobi 变量。这不是一个数字。解决方案值x[s,d,r].x 是一个数字,但您需要优化才能拥有它。目前还不清楚您要做什么。

标签: python if-statement gurobi


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回答。使用 x[s,d,r].x == 1 作为解决方案不起作用,因为事实上 x[s,d,r] == 1 是应该使用 GRB.MAXIMIZE 优化的值的一部分,所以 x[s,d,r] 的值仍然没有被计算。我会尝试在我的第一个帖子中发布问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多