我可以在 Pyomo/PySP 中的拉格朗日计算中添加一项吗?
Can I add a term to the Lagrangian calculation in Pyomo/PySP?
我想使用 Pyomo 的 PySP 框架做一些随机优化。在这个模型中,我有一些变量在不同场景中必须相同(即标准根节点变量)。作为 Progressive Hedging 方法的一部分,PySP 创建了一个增广的拉格朗日量,其乘数会迭代调整,直到所有这些变量在不同场景中都相等。到目前为止一切都很好。但我也有一些必须在预期值基础上强制执行的约束。在扩展形式中,这些看起来像这样:
sum(probability[s] * use[s] for s in scenarios) == resource
这个复杂的约束可以通过拉格朗日松弛来分解。这需要在主 objective 函数中添加这样的术语(然后它将成为每个场景的 objective 函数的一部分):
(
lambda * (sum(probability[s] * use[s] for s in scenarios) - resource)
+ mu/2 * (sum(probability[s] * use[s] for s in scenarios) - resource)**2
)
这与主 objective 函数中已有的非预期约束的拉格朗日项非常相似。在每次迭代中,PySP 框架自动更新非预期项的乘数,然后将它们的值传播到各个场景中。
所以我的问题是,有没有什么方法可以将我的项添加到由 PySP 管理的标准拉格朗日量中,并让它自动更新我的乘数和它自己的乘数?我不介意做一些繁重的工作,但我找不到任何关于如何实现 PySP 的详细文档,所以我不确定从哪里开始。
我想使用 Pyomo 的 PySP 框架做一些随机优化。在这个模型中,我有一些变量在不同场景中必须相同(即标准根节点变量)。作为 Progressive Hedging 方法的一部分,PySP 创建了一个增广的拉格朗日量,其乘数会迭代调整,直到所有这些变量在不同场景中都相等。到目前为止一切都很好。但我也有一些必须在预期值基础上强制执行的约束。在扩展形式中,这些看起来像这样:
sum(probability[s] * use[s] for s in scenarios) == resource
这个复杂的约束可以通过拉格朗日松弛来分解。这需要在主 objective 函数中添加这样的术语(然后它将成为每个场景的 objective 函数的一部分):
(
lambda * (sum(probability[s] * use[s] for s in scenarios) - resource)
+ mu/2 * (sum(probability[s] * use[s] for s in scenarios) - resource)**2
)
这与主 objective 函数中已有的非预期约束的拉格朗日项非常相似。在每次迭代中,PySP 框架自动更新非预期项的乘数,然后将它们的值传播到各个场景中。
所以我的问题是,有没有什么方法可以将我的项添加到由 PySP 管理的标准拉格朗日量中,并让它自动更新我的乘数和它自己的乘数?我不介意做一些繁重的工作,但我找不到任何关于如何实现 PySP 的详细文档,所以我不确定从哪里开始。