はじめに #
Pythonの最適化モデリングツールPyomoで、WARNING: Implicitly replacing the Component attribute <variable>
という警告が表示される場合、Pyomoのモデルに重複した変数名や制約名が定義されています。異なる変数名や制約名にすることで、警告が表示されなくなります。
検証環境は以下の通りです。
- Python 3.7.9
- Pyomo 6.4.1
重複した変数・制約 #
2つの変数を持つPyomoモデルを考えます。まず、誤った例として、以下のようにx1
が2回定義されたコードを実行します。
import pyomo.environ as pyo
model = pyo.ConcreteModel()
model.x1 = pyo.Var(domain=pyo.Reals)
model.x1 = pyo.Var(domain=pyo.Reals)
これを実行すると、以下の警告が表示されます。原因となる行番号が表示されないため、大規模なコードでは発生個所の特定に苦労しそうです。また、同じ名前の変数を重複して定義すると、後のものに置き換えられる仕様です。
WARNING: Implicitly replacing the Component attribute x1 (type=<class
'pyomo.core.base.var.ScalarVar'>) on block unknown with a new Component
(type=<class 'pyomo.core.base.var.AbstractScalarVar'>). This is usually
indicative of a modelling error. To avoid this warning, use
block.del_component() and block.add_component().
正しいコードでは、x1
, x2
などと異なる変数名にします。
import pyomo.environ as pyo
model = pyo.ConcreteModel()
model.x1 = pyo.Var(domain=pyo.Reals)
model.x2 = pyo.Var(domain=pyo.Reals)
制約についても同様に、異なる変数名を定義します。重複した制約名を定義すると、変数の場合と似た警告が表示されます。
WARNING: Implicitly replacing the Component attribute const1 (type=<class
'pyomo.core.base.constraint.ScalarConstraint'>) on block unknown with a
new Component (type=<class
'pyomo.core.base.constraint.AbstractScalarConstraint'>). This is usually
indicative of a modelling error. To avoid this warning, use
block.del_component() and block.add_component().
参考 #
pyomo Implicitly replacing the Component attribute - Stack Overflow