4

私はgurobipyで私のモデルをコーディングしました。制約とコストベクトルの行列を求めたいと思います。 アクセスする方法はありますか?gurobipyから行列形式の制約を取得します

+0

あなたは、目的関数と制約を提供することができますか?変数に対しては、forループを使用してmodel.getVarsを繰り返してすべての制約を得ることができると思います。モデルを提供すると、モデルからすべてのデータを取得できるため、詳細な出力を提供できます。 – sb0709

答えて

10

Python APIから、Gurobiモデルから行列係数を取得する関数はありませんが、自分で書くことは難しいことではありません。

変数と制約のリストを持つと便利です。あなたは、変数m

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

でgurobiモデルを持っている場合は、あなたの変数と制約のリストが表示されます。次に、m.getAttrを使用して、変数に関連する属性を取得できます。目的関数係数を取得するには、 'Obj'属性をクエリします。

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

これは、モデル内の各変数の目的係数のリストを提供します。制約行列については、おそらくnonzerosだけを格納したいと思うでしょう。私はちょうどGurobiパイソンの各変数および制約オブジェクトは、インデックスを持つ

  • 係数
  • COOrdinateフォーマット

    • 行インデックス
    • 列インデックスに格納します。私はちょうど指標

      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 
      

      この機能を使用すると、あなたはこのような構造から、パンダのデータフレーム

      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

    関連する問題