【问题标题】:Why is the objective object in my pyomo code have an unknown type 'generator'?为什么我的 pyomo 代码中的目标对象具有未知类型的“生成器”?
【发布时间】:2019-01-31 02:26:45
【问题描述】:

我正在使用 Python 中的 pyomo 库创建一个包含无数约束的优化问题,但我在看似简单的目标定义中仍然出现错误,并且不明白为什么。

我正在创建一个抽象模型,其目标是最小化成本(ab_mdl.c) 乘以每小时(i) 和每个资源(j) 的功率(ab_mdl.x)。这是写在下面的目标函数:

def TOU_rule(ab_mdl):
    return(summation(ab_mdl.c[i]*ab_mdl.x[j,i]) for i in ab_mdl.hours for j in ab_mdl.num_of_cars)

ab_mdl.cost_obj=Objective(rule=TOU_rule)

但是,当我运行完整的代码时,我得到了这个错误:

不能处理值'。 在 0x21427670>' 作为常量,因为它具有未知类型 'generator'

我不明白代码到底有什么问题,特别是因为这是一个相对简单的目标,而且我遵循了使用 Pyomo 看到的类似示例的语法。有人对我接下来应该做什么有任何想法吗?

【问题讨论】:

  • 改进格式

标签: python mathematical-optimization pyomo


【解决方案1】:

也许这是您的问题中的拼写错误,但如果不是,我认为您应该进行 3 项改进以使您的代码正常工作。

  1. return(thing) 语句应该写成return thing。那是因为return 是一个单独的单词,括号没有用处。

  2. 在同一行中,summation 不是正确的词,您必须使用sum

  3. 在调用构建目标时不要忘记添加优化意义(maximizeminimize)。

然后,您的代码将是:

def TOU_rule(ab_mdl): 
    return sum(ab_mdl.c[i]*ab_mdl.x[j,i]) for i in ab_mdl.hours for j in ab_mdl.num_of_cars
ab_mdl.cost_obj=Objective(rule=TOU_rule, sense=minimize)

【讨论】:

  • 对不起,我使用的是求和,而不是求和(那是我没有删除的旧代码,抱歉)。我将其更改为空格,但现在我得到一个单独的错误:我的参数值 c[1] 未定义。将查看我用来创建实例的字典。再次感谢您的帮助!
  • 我在查看自己的代码时编辑了答案。有一个新点。很抱歉听到您未定义的参数值。我可以肯定地告诉你,这与你提到的问题无关。这是最常见的错误之一,它告诉您数据不足,或者参数域(集)太宽。只有你能发现。祝你好运。
  • 我也解决了另一个问题。将 ab_mdl.c 设置为参数时,我设置了 within=PostiveReals,但随后设置了 c[1] =0。所以需要改变 ab_mdl.c=Param(ab.Index,within=NonNegativeReals)
猜你喜欢
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多