我在gurobipy编码我的模型,我想得到约束矩阵和成本向量。 有没有办法访问这些?
答案 0 :(得分:16)
从python API中,没有单一的函数可以从Gurobi模型中获取矩阵系数,但是自己编写矩阵系数并不困难。
拥有变量和约束列表很方便。如果你有一个变量read
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)
列表中的每个约束对象都对应于模型中的约束。每个约束都有一个
对于约束矩阵,您需要左侧。它由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
答案 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检出矩阵图。