【问题标题】:Pyomo: is possible to assign to a design variable only defined values?Pyomo:是否可以仅将定义的值分配给设计变量?
【发布时间】:2019-10-15 12:25:04
【问题描述】:

我希望设计变量在优化过程中只假设指定的值。

例如: 令 x 为只能取特定值的变量,例如:

x = [0.1,0.5,1.0,1.7,2.3]

如何使用 pyomo 用 python 编写(如果可能的话)?

我希望我是清楚的。

【问题讨论】:

  • 您可能需要编辑您的问题以明确表明您正在寻找一种允许您自动定义此类变量的语法 - 而不是用于声明新变量的建模技巧完成这个。

标签: python python-3.x optimization pyomo coin-or


【解决方案1】:

您必须使用整数变量来执行此操作。例如,如果有N 的可能值x,则如果x 等于nth 可能值,则让x[n] = 1,否则0。只要您的原始模型中有 x,请将其替换为

sum {n=1,...,N} v[n] * x[n]

其中v[n]nth 可能的值。最后,添加一个约束:

sum {n=1,...,N} x[n] == 1 

我不是用 Pyomo 语法编写这些,但这是一种通用的建模方法,无论您使用什么建模语言/包,它都是相同的。

【讨论】:

  • 感谢您的回答。我已经将问题建模为 MINLP,我已经将变量定义为整数变量。但现在我想更具体一点。
  • 更具体的是什么?您是否在问是否可以在 Pyomo 中对来自离散集的变量进行建模, 声明新的整数变量?
  • 也许我没有解释清楚,对不起。我要做的是声明我的变量只能采用特定值,例如列表中的值,我个人填写。
  • 在这种情况下,我认为不可能自动执行此操作。例如,如果你声明model.A = Set(initialize=[0.1,0.5,1.0,1.7,2.3]),然后声明你的变量像model.x = Var(domain=model.A),Pyomo 会给出一个错误,即域不是连续的、整数或二进制的——这表明这些是唯一允许的域。但是,请注意,即使 Pyomo 可以按照您的要求进行操作,它仍会“在幕后”转换为整数变量,因此在语法上可能更容易,但在计算上不会更快。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多