我可以在 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 的详细文档,所以我不确定从哪里开始。

PySP 中的 PH 实现支持通过使用用户定义的扩展进行某种程度的自定义。这些是 类 您可以实现的方法,它们的方法在算法的不同点被 PH 调用。您可以通过将命令行选项“--user-defined-extension”设置为包含实现的文件来告诉 PH 使用扩展。可以找到许多示例 here(查找包含 IPHExtension 的文件并复制它们的作用)。

不幸的是,没有任何特定的代码可以使您想做的事情变得容易。您将不得不查看源代码以了解 PH 如何更新和管理这些 objective 参数(请参阅 ph.py 了解算法中调用不同扩展方法的位置)。