问题描述
我正在使用 pyomo 对问题进行建模,但在使用块中的数据构建约束时遇到了一些困难。我已经设置好块,完全调试。当我作为约束的一部分访问它的一些数据时,我收到一个错误,说 'generator' object has no attribute 'is_expression_type'
我设置的块是:
def block_variables(block,j):
demand_data = data['demand_data']
supply_data = data['supply_data']
I = block.model().I
J = block.model().J
G = block.model().G
model.quantity_demanded = pe.Param(J,initialize = demand_data["quantity_demanded"])
block.shipping_cost = pe.Param(J,initialize = demand_data["shipping_cost"])
block.max_supply = pe.Param(I,initialize = supply_data['max_supply'])
block.x = pe.Var(I,domain = pe.NonNegativeIntegers)
block.per_unit_costs = pe.Param(I,initialize = supply_data["per_unit_cost"])
block.fixed_costs = pe.Param(I,initialize = supply_data["fixed_cost"])
block.variable_costs = sum(block.per_unit_costs[i][g] * block.x[i] for g in G for i in I)
有问题的行如下:
def constraint_maximum_supply(model,i):
return sum(model.block_variables.x[i]) \
<= (model.block_variables[i].max_supply[j] * model.decision[i] for j in model.J)
model.constraint_maximum_supply = pe.Constraint(model.I,rule = constraint_maximum_supply)
我已多次观看有关此主题的 UT Austin INFORMS video,并且在他的约束下,他似乎已将块索引为 j,或 model.block_variables[j].x[i] for j in model.J
当我开始尝试此操作时,我收到错误 { {1}} 我确实注意到我们构建块的方式存在一些差异,但我不太明白这将如何导致此错误。
如果能提供任何帮助,我们将不胜感激。非常感谢您抽出时间阅读。
解决方法
你的“问题线”的这一部分是问题...
(model.block_variables[i].max_supply[j] * model.decision[i] for j in model.J)
你在这周围加上了括号,这将它变成了一个包含 for 循环的生成器,但你在这之前没有 sum
。这就是你的意图吗?像这样
... sum(model.block_variables[i].max_supply[j] * model.decision[i] for j in model.J)
pyomo
告诉您这里的“生成器”不能解释为合法的 pyomo
表达式。