4

내 모델을 gurobipy로 코딩 했으므로 제약 조건 및 비용 벡터의 행렬을 얻고 싶습니다. 액세스 할 수있는 방법이 있습니까?gurobipy에서 행렬 형식으로 제약 조건 가져 오기

+0

당신은 목적 함수와 제약 조건을 제공 할 수 있습니까? for 변수를 사용하면 for 루프를 사용하여 model.getVars를 반복하여 모든 제약 조건을 얻을 수 있다고 생각합니다. 모델을 제공하면 모든 데이터를 모델에서 가져올 수 있으므로 자세한 출력을 제공 할 수 있습니다. – sb0709

답변

10

파이썬 API에서 Gurobi 모델의 행렬 계수를 구하는 함수는 하나도 없지만 직접 작성하는 것은 어렵지 않습니다.

변수 및 제약 조건 목록을 갖는 것이 편리합니다. 당신이 변수 m에서 gurobi 모델을 사용하는 경우에는

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

당신에게 변수와 제약의 목록을 제공합니다. 그런 다음 m.getAttr을 사용하여 변수와 관련된 속성을 검색 할 수 있습니다. 목적 함수의 계수를 얻으려면, 당신은이 모델의 각 변수에 대해 당신에게 목적 계수의 목록을 제공합니다

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

'의 Obj'속성 쿼리합니다. 제약 조건 행렬에 대해서는 아마도 nonzeros 만 저장하려고 할 것입니다. 난 그냥 COOrdinate 형식

  • 행 인덱스
  • 열 인덱스
  • 계수

Gurobi 파이썬에서 각 변수와 제약 객체가 인덱스가에 저장할 수 있습니다. 난 그냥 인덱스

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

constrs 목록에있는 각 제약 객체 모델의 제약에 해당 할 개체를 매핑 사전을 만들 것이다. 좌측 식 - - 센스 (< = ==> =) - 각 제약이 포함 제약 행렬

상수 오른쪽 측면에는 좌측을 원한다. 모델의 getRow 메서드로 얻을 수있는 LinExpr 개체로 표시됩니다. Gurobi 6.x에서 현재로, 열 인덱스, 계수 튜플의 목록을 획득하는 행렬을 얻으려면 다음

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 

이 기능을 사용하면이 구조에서을 팬더 dataframe

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

관련 문제