在pyomo的抽象模型中,我想以下列方式定义一个新参数:
from __future__ import division
from pyomo.environ import *
from coopr.pyomo import *
from objbrowser import *
import os
model = AbstractModel()
model.F = Set()
model.N_f = Set(dimen=2)
model.arcs = Set(dimen=2)
model.l_fmn = Param(model.arcs)
model.d_f = Param(model.F)
for k in model.F:
for i1 in model.N_f[k]:
for i2 in model.arcs[k]:
def maker_fn(model):
if model.arcs[k].index(i2) < model.N_f[k].index(i1):
return sum(model.l_fmn[k,i2] + model.d_f[k])
else:
return model.d_f[k]
model.r_fn[k,i1] = Param(initialize=maker_fn)
我想在这里使用这些循环来定义参数model.r_fn,其形式为Param(model.N_f),我的意思是,一个参数为model.N_f的每个元素都有一个值,它具有model.l_fmn + model.d_f的每个元素的值,如果model.arcs [k]的索引低于model.N_f [k]的索引,如果它不低,则让值与模型相同.d_f。
我不知道这是否是正确的方法来建立循环和def函数来创建一个参数,但我执行此操作时遇到的问题是:
&#34; RuntimeError:无法迭代抽象集&#39; F&#39;在构建(初始化)之前。&#34;
我尝试了不同的东西,但我仍然不知道为什么会出现这个错误。
所以我真的很感激,如果有人能告诉我如何修复这个错误,还有正确的方法来制作我想要做的功能以获得参数。
非常感谢你们。
.dat文件如下:
set F := f1 f2 f3;
set N_f :=
f1 "q(a)"
f1 a
f1 b
f1 C
f2 A
f2 "q(A)"
f2 e
f2 B
f3 B
f3 "q(b)"
f3 f
f3 C;
set arcs :=
f1 "(A,q(A))"
f1 "(q(A),a)"
f1 "(a,b)"
f1 "(b,C)"
f2 "(A,q(A))"
f2 "(q(A),e)"
f2 "(e,B)"
f3 "(B,q(B))"
f3 "(q(B),f)"
f3 "(f,C)";
param l_fmn :=
f1 "(A,q(A))" 0
f1 "(q(A),a)" 5
f1 "(a,b)" 8
f1 "(b,C)" 1
f2 "(A,q(A))" 0
f2 "(q(A),e)" 5
f2 "(e,B)" 7
f3 "(B,q(B))" 0
f3 "(q(B),f)" 3
f3 "(f,C)" 3;
param d_f :=
f1 1
f2 1
f3 17;
答案 0 :(得分:0)
问题是你的.dat文件中没有定义集F
,你称之为K
。您应该将set F := f1 f2 f3;
放在第一行。