带有 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")
我是 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")