在构造(初始化)之前无法迭代抽象集

时间:2017-10-13 11:58:15

标签: python pyomo

在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;

1 个答案:

答案 0 :(得分:0)

问题是你的.dat文件中没有定义集F,你称之为K。您应该将set F := f1 f2 f3;放在第一行。