从gurobipy获取矩阵格式的约束

时间:2016-07-28 21:43:33

标签: python sparse-matrix mathematical-optimization linear-programming gurobi

我在gurobipy编码我的模型,我想得到约束矩阵和成本向量。 有没有办法访问这些?

2 个答案:

答案 0 :(得分:16)

从python API中,没有单一的函数可以从Gurobi模型中获取矩阵系数,但是自己编写矩阵系数并不困难。

拥有变量和约束列表很方便。如果你有一个变量read

的gurobi模型
ldapsearch -xZZLLLD ... | while IFS= read -r line; do echo "$line"; done

将为您提供变量和约束的列表。然后,您可以使用m.getAttr检索与变量相关的属性。要获得目标函数系数,请查询“对象”。属性

m

这将为您提供模型中每个变量的目标系数列表。对于约束矩阵,您可能只想存储非零值。我只是将它们存储为COOrdinate格式

  • 行索引
  • 列索引
  • 系数

在这个例子中,方便的是拥有每个变量和约束对象的索引。我只是创建将对象映射到索引的字典

dvars = m.getVars()
constrs = m.getConstrs()

obj_coeffs = m.getAttr('Obj', dvars) 列表中的每个约束对象都对应于模型中的约束。每个约束都有一个

  • 左手边表达
  • sense(< =,==,> =)
  • 右侧常数

对于约束矩阵,您需要左侧。它由LinExpr对象表示,您可以使用模型上的getRow方法获取该对象。从Gurobi 6.x开始,获取列索引列表,系数元组需要如下函数

var_index = {v: i for i, v in enumerate(dvars)}
constr_index= {c: i for i, c in enumerate(constrs)}

要获取矩阵,您需要为每个约束应用此函数。

constrs

使用此功能,您可以将矩阵存储到像pandas dataframe

这样的结构中
def get_expr_coos(expr, var_indices):
    for i in range(expr.size()):
        dvar = expr.getVar(i)
        yield expr.getCoeff(i), var_indices[dvar]

从这个结构中,你可以做一个非零模式的基本情节。使用来自miplib aflow40b基准测试问题的问题。

def get_matrix_coo(m):
    dvars = m.getVars()
    constrs = m.getConstrs()
    var_indices = {v: i for i, v in enumerate(dvars)}
    for row_idx, constr in enumerate(constrs):
        for coeff, col_idx in get_expr_cos(m.getRow(constr), var_indices):
            yield row_idx, col_idx, coeff

aflow nonzeros

答案 1 :(得分:3)

由于声誉不足,无法评论@ david-nehme的答案,请随时将其添加到他的答案中并删除我的答案。

从Gurobi 9.0开始,您可以通过.getA()作为<class 'scipy.sparse.csr.csr_matrix'>来查询系数矩阵。

import matplotlib.pyplot as plt
import gurobipy as grb

m = grb.read("miplib/instances/miplib2010/aflow40b.mps.gz")
A = m.getA()
plt.spy(A) # different options, e.g. markersize=0.5
plt.show()

还可以使用betterspy检出矩阵图。