Pyomo の PySP フレームワークを使用して確率的最適化を行いたいと考えています。このモデルには、シナリオ全体で同じでなければならない変数がいくつかあります (つまり、標準のルート ノード変数)。プログレッシブ ヘッジ アプローチの一環として、PySP は拡張ラグランジュを作成します。このラグランジュの乗数は、これらすべての変数がシナリオ間で等しくなるまで繰り返し調整されます。これまでのところすべて順調です。しかし、期待値に基づいて実施する必要があるいくつかの制約もあります。拡張形式では、これらは次のようになります。
sum(probability[s] * use[s] for s in scenarios) == resource
この複雑な制約は、ラグランジュの緩和によって取り除くことができます。これには、主な目的関数に次のような項を追加する必要があります (これは、各シナリオの目的関数の一部になります)。
(
lambda * (sum(probability[s] * use[s] for s in scenarios) - resource)
+ mu/2 * (sum(probability[s] * use[s] for s in scenarios) - resource)**2
)
これは、主な目的関数に既に含まれている非予測性制約のラグランジュ項と非常によく似ています。反復ごとに、PySP フレームワークは非予測性の項の乗数を自動的に更新し、その値を個々のシナリオに伝播します。
私の質問は、PySP によって管理されている標準のラグランジュに私の項を追加し、それ自体の乗数を自動的に更新する方法はありますか? 面倒な作業は気にしませんが、PySP の実装方法に関する詳細なドキュメントが見つからないため、どこから始めればよいかわかりません。