JavaScriptを有効にしてください

Pyomoモデルの変数・制約・目的関数の数を取得する

 ·   2 min read

はじめに

Pythonの最適化モデリングツールであるPyomoで、最適化モデルに定義された変数や制約、目的関数の数を取得するには、nvariables(), nconstraints(), nobjectives()メソッドを用います(メンバ変数を用いる方法もあります)。Pyomoの変数や制約がベクトル化された状態でも対応できます。

検証環境は以下の通りです。

バージョン
Python 3.9.7
Pyomo 6.4.1

Pyomoのインストール方法は以下の記事を参照ください。
Pyomoで線形計画問題を解く – Helve Tech Blog

対象とするPyomoモデル

以下のようにPyomoモデルを作ります。適当な線形計画問題です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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()メソッドを用います。

1
2
3
print(f"変数: {m.nvariables()}")
print(f"制約: {m.nconstraints()}")
print(f"評価関数: {m.nobjectives()}")

実行結果

1
2
3
変数: 6
制約: 2
評価関数: 1

これら3つのメソッドの内部では、次項で説明するメンバ変数にアクセスして、その内容を返しています。メソッドを使用した方が簡潔に書くことができます。

メンバ変数

メンバ変数を使う方法では、まずcompute_statistics()メソッドを実行します。その後、statisticsに続けてnumber_of_variables, number_of_constraints, number_of_objectivesにアクセスします。

1
2
3
4
m.compute_statistics()
print(f"変数: {m.statistics.number_of_variables}")
print(f"制約: {m.statistics.number_of_constraints}")
print(f"評価関数: {m.statistics.number_of_objectives}")

実行結果

メソッドを使う方法を同じ結果となりました。

1
2
3
変数: 6
制約: 2
評価関数: 1

参考

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

サイト内検索