【问题标题】:Gurobi addConstr with MVar: Index 0 out of range for attribute 'X'带有 MVar 的 Gurobi addConstr:索引 0 超出属性“X”的范围
【发布时间】:2020-05-15 22:25:23
【问题描述】:

我是 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:索引 0 超出属性“X”的范围。

我哪里做错了?任何帮助表示赞赏。

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

【问题讨论】:

    标签: python gurobi


    【解决方案1】:

    首先,请注意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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-16
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      相关资源
      最近更新 更多