はじめに #
Pythonの最適化モデリングツールであるPyomoで、最適化モデルに定義された変数や制約、目的関数の数を取得するには、nvariables()
, nconstraints()
, nobjectives()
メソッドを用います(メンバ変数を用いる方法もあります)。Pyomoの変数や制約がベクトル化された状態でも対応できます。
検証環境は以下の通りです。
- Python 3.9.7
- Pyomo 6.4.1
Pyomoのインストール方法は以下の記事を参照ください。 Pyomoで線形計画問題を解く – Helve Tech Blog
対象とするPyomoモデル #
以下のようにPyomoモデルを作ります。適当な線形計画問題です。
import pyomo.environ as pyo
m = pyo.ConcreteModel()
m.x0 = pyo.Var(bounds=(0, 5))
m.x1 = pyo.Var(bounds=(0, 5))
m.x2 = pyo.Var(bounds=(0, 5))
m.x3 = pyo.Var(range(3), bounds=(0, 5))
m.const0 = pyo.Constraint(expr = m.x0+2*m.x1 <= 7)
m.const1 = pyo.Constraint(expr = 2*m.x0+m.x1+m.x2 <= 8)
m.obj = pyo.Objective(expr=m.x0+m.x1+m.x2, sense=pyo.maximize)
このモデルの変数は6個、制約は2個、目的関数は1個です。ここで、変数x0
, x1
, x2
はスカラー、x3
は3次元のベクトルです。
変数・制約の数の取得方法 #
変数と制約、目的関数の数を取得する方法は2つあります。1つはメソッドを使う方法、もう1つはメンバ変数にアクセスする方法です。どちらも同じ結果となります。
メソッド #
メソッドを使う方法では、以下のようにnvariables()
, nconstraints()
, nobjectives()
メソッドを用います。
print(f"変数: {m.nvariables()}")
print(f"制約: {m.nconstraints()}")
print(f"評価関数: {m.nobjectives()}")
実行結果
変数: 6
制約: 2
評価関数: 1
これら3つのメソッドの内部では、次項で説明するメンバ変数にアクセスして、その内容を返しています。メソッドを使用した方が簡潔に書くことができます。
メンバ変数 #
メンバ変数を使う方法では、まずcompute_statistics()
メソッドを実行します。その後、statistics
に続けてnumber_of_variables
, number_of_constraints
, number_of_objectives
にアクセスします。
m.compute_statistics()
print(f"変数: {m.statistics.number_of_variables}")
print(f"制約: {m.statistics.number_of_constraints}")
print(f"評価関数: {m.statistics.number_of_objectives}")
実行結果
メソッドを使う方法を同じ結果となりました。
変数: 6
制約: 2
評価関数: 1