0

我想使用 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 如何实现的详细文档,所以我不确定从哪里开始。

4

1 回答 1

1

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

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

于 2017-05-08T18:43:00.123 回答