4

我在gurobipy中對我的模型進行了編碼,我想獲得約束矩陣和成本向量。 有什麼方法可以訪問這些嗎?從gurobipy獲取矩陣格式的約束條件

+0

可以提供目標函數和約束?對於變量,我認爲你可以使用for循環迭代通過model.getVars來獲得所有的約束,如果你提供了模型,我可以提供詳細的輸出,因爲可以從模型中獲取所有數據。 – sb0709

回答

10

從python API中,沒有一個函數可以從Gurobi模型中獲得矩陣係數,但是您自己寫一個矩陣係數並不難。

列出變量和約束條件很方便。如果你有可變m一個gurobi模型

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

會給你的變量和約束的列表。然後可以使用m.getAttr來檢索與變量相關的屬性。爲了獲得目標函數的係數,你查詢「的OBJ」屬性

obj_coeffs = m.getAttr('Obj', dvars) 

這會給你的目標係數的列表模型中的每個變量。對於約束矩陣,您可能只需要存儲非零值。我只是把它們存儲在COOrdinate格式

  • 行索引
  • 列索引
  • 係數

在Gurobi蟒蛇每個變量和約束對象有一個索引。我就創建對象映射到指數

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

constrs列表中的每個約束對象對應於模型的約束字典。每個約束包括其 - 左手邊表達 - 感(< =,==,> =) - 右手側恆定

對於約束矩陣,想要的左手側。它由一個LinExpr對象表示,您可以通過該模型上的getRow方法獲得該對象。作爲6.x的Gurobi的,獲得列索引,係數元組的列表,需要像下面

def get_expr_coos(expr, var_indices): 
    for i in range(expr.size()): 
     dvar = expr.getVar(i) 
     yield expr.getCoeff(i), var_indices[dvar] 

一個函數來獲取的矩陣,則需要應用此功能,每約束。

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 

使用此功能,您可以將矩陣存儲到一個結構類似熊貓數據幀

nzs = pd.DataFrame(get_matrix_coos(m), 
        columns=['row_idx', 'col_idx', 'coeff']) 

從這個結構,你可以做的非零模式的基本情節。使用miplib aflow40b基準測試問題。

import matplotlib.pyplot as plt 
import pandas as pd 
import gurobipy as grb 
m = grb.read("miplib/instances/miplib2010/aflow40b.mps.gz") 
nzs = pd.DataFrame(get_matrix_coo(m), 
        columns=['row_idx', 'col_idx', 'coeff']) 
plt.scatter(nzs.col_idx, nzs.row_idx, 
     marker='.', lw=0) 

aflow nonzeros