带有 MVar 的 Gurobi addConstr:索引 0 超出属性 'X' 的范围

Gurobi addConstr with MVar: Index 0 out of range for attribute 'X'

我是 Gurobi 的新手,目前正在研究一个可行性优化问题,作为我的变量的一部分,我有一个 MVar 网格(矩阵)grid_values,另一个 b1定义如下:

grid_values = model.addMVar( (n, n), lb=1, ub=9, vtype=GRB.INTEGER, name="grid_values")
b1 = model.addMVar((n, n), vtype=GRB.BINARY, name='b1')

现在,我试图添加一些约束,其中每个约束涉及一行 grid_values 和一行 b1:

model.addConstrs(((grid_values[i, :] - j ).getValue() @ b1[i, :] == 0 
                  for i in range(n)
                  for j in range(n)), name='row_constr')

其中 j 是全 1,然后全 2,...全 n 的向量。但是,当我 运行 上面的代码时,我得到:

GurobiError: Index 0 out of range for attribute 'X'.

我哪里做错了?感谢任何帮助。

我也尝试使用 np.full((n,), j) 而不是 j 作为矢量,但无济于事。

首先,请注意 getValue() 方法计算当前解中的 MLinExpr 对象(线性矩阵表达式)的值,即在您解决优化问题之后。

然后,据我所知,目前还没有办法像使用 Mvar 对象的点积那样执行 "pointwise" 乘法。因此,您可以尝试以简单的矩阵向量乘积的形式编写约束,或者使用已知的代数建模方法代替矩阵 api:

from gurobipy import Model, GRB, quicksum

model = Model()
grid_values = model.addVars(n, n, lb=1, ub=9, vtype=GRB.INTEGER, name="grid_values")
b1          = model.addVars(n, n, vtype=GRB.BINARY, name="b1")

model.addConstrs((quicksum((grid_values[i,j]-j)*b1[i,j] for j in range(n)) == 0 for i in range(n)), name="row_constr")