具有MVar的Gurobi addcontr:索引0超出属性“X”的范围

2024-04-18 20:49:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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作为向量,但没有效果


Tags: nameinformodelrange向量b1grid
1条回答
网友
1楼 · 发布于 2024-04-18 20:49:26

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

然后,据我所知,目前还没有办法像点积那样对Mvar对象进行“逐点”乘法。因此,您可以尝试以简单矩阵向量积的形式编写约束,或者使用已知的代数建模方法而不是矩阵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")

相关问题 更多 >