※記事内に商品プロモーションを含むことがあります。
はじめに
Pythonの最適化モデリングツールPyomoで、WARNING: Implicitly replacing the Component attribute <variable>
という警告が表示される場合、Pyomoのモデルに重複した変数名や制約名が定義されています。異なる変数名や制約名にすることで、警告が表示されなくなります。
検証環境は以下の通りです。
バージョン | |
---|---|
Python | 3.7.9 |
Pyomo | 6.4.1 |
重複した変数・制約
2つの変数を持つPyomoモデルを考えます。まず、誤った例として、以下のようにx1
が2回定義されたコードを実行します。
|
|
これを実行すると、以下の警告が表示されます。原因となる行番号が表示されないため、大規模なコードでは発生個所の特定に苦労しそうです。また、同じ名前の変数を重複して定義すると、後のものに置き換えられる仕様です。
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
などと異なる変数名にします。
|
|
制約についても同様に、異なる変数名を定義します。重複した制約名を定義すると、変数の場合と似た警告が表示されます。
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