【发布时间】:2022-08-21 20:15:40
【问题描述】:
我是 Pyomo 的新手,我需要帮助在 Pyomo 中编写这个等式。
我正在尝试在 Pyomo 中编写一个(范围不等式)约束方程。
这是等式:
到目前为止,我写了这两个版本:
版本 1:不确定这是否正确
model.amount_of_energy_con = pe.ConstraintList()
for t in model.time:
lhs = 0
rhs = sum(model.c_ratings[s] * model.boat_capacity * model.charging[b, t, s] * model.boats_availability[b][t] for b in model.boats for s in model.chargers)
body = sum(model.charge_energy[b, t, s] for b in model.boats for s in model.chargers)
model.amount_of_energy_con.add(lhs <= body)
model.amount_of_energy_con.add(body <= rhs)
版本2:我认为这是不正确的
model.amount_of_energy_con = pe.ConstraintList()
for t in model.time:
lhs = 0
rhs = sum(model.c_ratings[s] * model.boat_capacity * model.charging[b, t, s] * model.boats_availability[b][t] for b in model.boats for s in model.chargers)
body = sum(model.charge_energy[b, t, s] for b in model.boats for s in model.chargers)
#model.amount_of_energy_con.add(expr=pe.inequality(lhs, body, rhs))
model.amount_of_energy_con.add(lhs, body, rhs)
笔记:
-
方程中的所有下标都是 3 个不同集合的元素。 s 集合 S 的元素 (model.chargers), b 集合 B 的元素 (model.boats), t 集合 T 的元素 (model.time)。
-
C-rate、可用性、电池容量是给定的参数,而 E 和充电是 Pyomo 中的变量。
请让我知道您的想法以及如何在 Pyomo 中编写它。一般来说,如果你认为我做错了什么,请告诉我,如果你需要我的完整代码、数据和进一步的解释,也请告诉我。
非常感谢你的帮助
-
您的第二个版本看起来不错,但需要注意的是,我会避免范围不等式并将其分解为 2 个不等式,或者更简洁地说,在您声明它时,只需在
E上设置 0 的下限。我不确定,但我似乎记得范围不等式有一些怪癖,并且在引擎盖下,无论如何它只是将它分成 2。是不是有些东西不能与第二个一起工作?当您pprint()模型时,它看起来准确吗? -
谢谢@AirSquid,按照我的建议,我打破了版本 1 中的范围不等式,我得到了这些:
amount_of_energy_con_index : Size=1, Index=None, Ordered=Insertion Key : Dimen : Domain : Size : Members None : 1 : Any : 48 : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48} amount_of_energy_con : Size=48, Index=amount_of_energy_con_index, Active=True Key : Lower : Body不确定我是否理解pprint() -
另外,我怀疑我的代码中还有其他问题。让我看看是否可以上传带有数据的完整代码。
-
那是调用它的索引,但不是约束产生的产物。还有更多吗?您应该编辑上面的帖子以包含错误消息和输出(更易于阅读),而不是填充评论。 ;)
-
我试图运行您的代码,但有多个错误......习惯上包含一个最低限度可重现的示例。如果你能做到,我(或其他人)可以提供帮助。最小意味着足够的数据使其运行,因此将其减少到 3 个时间段和 1 或 2 艘船。现在它太大了,无法排除故障。然后在代码中包含数据,并在您的机器上运行它——就像发布的那样——并确保没有语法错误,它会产生您需要帮助的错误或问题。
标签: python linear-programming pyomo mixed-integer-programming