【问题标题】:How do you write Ranged Inequality Constraint in Pyomo你如何在 Pyomo 中编写远程不等式约束
【发布时间】: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)

笔记:

  1. 方程中的所有下标都是 3 个不同集合的元素。 s 集合 S 的元素 (model.chargers), b 集合 B 的元素 (model.boats), t 集合 T 的元素 (model.time)。

  2. 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


【解决方案1】:

这个解决方案对我有用:

model.amount_of_energy_con = pe.ConstraintList()
    for t in model.time:
        for b in model.boats:
            for s in model.chargers:
                lhs = model.charge_energy[b, t, s]
                rhs = model.c_rating[s] * model.boat_battery_capacity * boats_availability[b, t] * model.charging[b, t, s]
                model.amount_of_energy_con.add(expr= (lhs <= rhs))

我在上面发布的那些先前版本的问题是:

  1. sum() 函数/方法将对变量和参数求和,这不是我想要的,因为方程没有求和。如果我们尝试分别对右侧和左侧的变量求和,则上述 2 个版本将起作用。

  2. 写入charge_energy 变量时,范围方程/左侧的0 被“参数内”覆盖,如下model.charge_energy = pe.Var(model.boats, model.time, model.chargers, within=pe.NonNegativeReals)。

    谢谢你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2018-05-29
    • 1970-01-01
    • 2020-03-29
    • 2017-07-17
    • 1970-01-01
    相关资源
    最近更新 更多