如何在Pyomo中以开放间隔定义Var?

问题描述

Pyomo提供了一些功能,可将约束添加到变量中,例如the document中的波纹管代码

model.LumberJack = Var(within=NonNegativeReals,bounds=(0,6),initialize=1.5)

但是,我想定义一个具有打开间隔约束的变量,例如(0,1]。根据我的理解,bounds参数表示封闭间隔,因此,如果将参数设置为bounds=(0,1),则表示[0,1]

我认为封闭间隔约束很常见,Pyomo提供了这种功能,但我找不到。这是实施问题吗?还是理论上的问题?

解决方法

开放时间间隔意味着模型中的“严格较少”约束,即

variable < upper bound

代替

variable <= upper bound

根据您的求解算法,基础理论可能不支持此方法。例如,在线性和混合整数规划理论中,不支持严格的不等式。您唯一可以拥有的是<=>=。 因此,即使Pyomo支持(半)打开间隔,解决该问题的算法也可能不会。

解决此问题的常用方法是使用一个小的epsilon进行书写

variable <= upper bound - epsilon

“模仿”严格的不平等。当然,这可能会带来数值上的困难。

最后,鉴于大多数算法都具有有限的精度和数值公差,因此存在一个问题,即变量边界上的严格不等式意味着什么。只要公差大于0,就允许该变量达到上限,并且在公差范围内认为是可行的。