Pyomo 在构造之前无法迭代抽象集
Pyomo Cannot iterate over abstract Set before it has been constructed
我在 Pyomo 中构建了一个抽象模型,效果很好。
但是,当我尝试使用字典实例化抽象模型时,出现以下错误“错误:为 objective 值生成表达式时规则失败:
RuntimeError:无法迭代抽象集 'I' 之前
构造(初始化)。
具体来说,问题如下:
from pyomo.environ import *
model = AbstractModel()
model.D = Set()
model.I = Set()
model.w = Param(model.D)
model.S_0 = Param(model.D)
model.x = Var(real_model.I, model.D)
def sum_cubic(m):
return sum(w[j]*(m.x[i][j]-m.S_0[j])**3 for i in model.I for j in model.D)
model.value = Objective(rule = sum_cubic, sense = maximize)
model.pprint()
上面的代码运行得很好。但是当我在名称和 S_0 是预定义字典的地方添加以下代码时会出现错误:
data = {None:{
'D':{None: names},
'I':{None: list(range(1,4))},
'w':[0.3,0.3,0.4],
'S_0':S_0,
}
}
real_model = model.create_instance(data)
错误:为 objective 值生成表达式时规则失败:
RuntimeError:无法迭代抽象集 'I' 之前
构造(初始化)。
错误:从数据=None 构建组件'value' 失败:
RuntimeError:无法迭代抽象集 'I' 之前
构造(初始化).
有人可以帮我吗?谢谢
这里有一些问题...
- 您在函数中混合了
m.
和 model.
,您应该在其中使用 m.
,因为那是函数签名的 self-referencing 参数
- 您索引
m.x
不正确。应该是tuple-indexed(看我的)
- 您的数据字典没有为参数设置正确。 (见我的)
祝你好运!
from pyomo.environ import *
model = AbstractModel()
model.D = Set()
model.I = Set()
model.w = Param(model.D)
model.S_0 = Param(model.D)
model.x = Var(model.I, model.D)
def sum_cubic(m):
return sum(m.w[j]*(m.x[i, j]-m.S_0[j])**3 for i in m.I for j in m.D)
model.value = Objective(rule = sum_cubic, sense = maximize)
model.pprint()
names=['a', 'b', 'c']
data = { None:{
'D': {None: names},
'I': {None: [1, 2, 3]},
'w': {'a': 0.4, 'b': 0.3, 'c': 0.2},
'S_0': {'a': 1.0, 'b': 2.0, 'c': 3.0} }
}
real_model = model.create_instance(data)
我在 Pyomo 中构建了一个抽象模型,效果很好。
但是,当我尝试使用字典实例化抽象模型时,出现以下错误“错误:为 objective 值生成表达式时规则失败: RuntimeError:无法迭代抽象集 'I' 之前 构造(初始化)。
具体来说,问题如下:
from pyomo.environ import *
model = AbstractModel()
model.D = Set()
model.I = Set()
model.w = Param(model.D)
model.S_0 = Param(model.D)
model.x = Var(real_model.I, model.D)
def sum_cubic(m):
return sum(w[j]*(m.x[i][j]-m.S_0[j])**3 for i in model.I for j in model.D)
model.value = Objective(rule = sum_cubic, sense = maximize)
model.pprint()
上面的代码运行得很好。但是当我在名称和 S_0 是预定义字典的地方添加以下代码时会出现错误:
data = {None:{
'D':{None: names},
'I':{None: list(range(1,4))},
'w':[0.3,0.3,0.4],
'S_0':S_0,
}
}
real_model = model.create_instance(data)
错误:为 objective 值生成表达式时规则失败: RuntimeError:无法迭代抽象集 'I' 之前 构造(初始化)。 错误:从数据=None 构建组件'value' 失败: RuntimeError:无法迭代抽象集 'I' 之前 构造(初始化).
有人可以帮我吗?谢谢
这里有一些问题...
- 您在函数中混合了
m.
和model.
,您应该在其中使用m.
,因为那是函数签名的 self-referencing 参数 - 您索引
m.x
不正确。应该是tuple-indexed(看我的) - 您的数据字典没有为参数设置正确。 (见我的)
祝你好运!
from pyomo.environ import *
model = AbstractModel()
model.D = Set()
model.I = Set()
model.w = Param(model.D)
model.S_0 = Param(model.D)
model.x = Var(model.I, model.D)
def sum_cubic(m):
return sum(m.w[j]*(m.x[i, j]-m.S_0[j])**3 for i in m.I for j in m.D)
model.value = Objective(rule = sum_cubic, sense = maximize)
model.pprint()
names=['a', 'b', 'c']
data = { None:{
'D': {None: names},
'I': {None: [1, 2, 3]},
'w': {'a': 0.4, 'b': 0.3, 'c': 0.2},
'S_0': {'a': 1.0, 'b': 2.0, 'c': 3.0} }
}
real_model = model.create_instance(data)