メインコンテンツへスキップ

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

·884 文字·2 分
目次

はじめに
#

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

参考
#

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

関連記事

Pyomoモデルの変数・制約の情報を一括で取得する
··1454 文字·3 分
Pythonの最適化モデリングツールであるPyomoで、modelに定義された変数や制約の情報を一括して取得する方法をまとめました。Pyomoの変数や制約がベクトル化された状態でも対応できます。
Pyomoの制約をベクトル化する
·1271 文字·3 分
Pyomoで多変数の最適化を簡潔に記述するため、制約をベクトル化する方法をまとめました。
PyomoのImplicitly replacing the Component attribute警告について
·514 文字·2 分
Pythonの最適化モデリングツールPyomoでImplicitly replacing the Component attributeという警告が表示される場合、Pyomoのモデルに重複した変数名や制約名が定義されています。異なる変数名や制約名にすることで、警告が表示されなくなります。
Pyomoの変数をベクトル化する
·1409 文字·3 分
Pyomoで多変数の最適化を簡潔に記述するため、変数をベクトル化する方法をまとめた。
PyomoでGDP最適化問題を解く
·1602 文字·4 分
PyomoでGDP (Generalized Disjunctive Programming) と呼ばれる最適化問題を解いた。GDPは論理的な制約を持つ最適化問題である。
PyomoとIPOPTで非線形計画問題を解く
·2785 文字·6 分
最適化モデリングツールPyomoと、最適化ソルバIPOPTを使って非線形計画問題を解く方法をまとめた。