Pyomo 错误:未初始化的 NumericValue 对象没有值

问题描述 投票:0回答:1

我是一个非常新的 Pyomo 用户。我一直在尝试寻找与我的问题类似的例子,但我找不到任何既不太容易也不太困难的例子。我似乎在初始化变量时遇到问题,但我不知道如何修复它。这是我的代码:

`# Import of the pyomo module
from pyomo.environ import *
 
# Creation of a Concrete Model
model = ConcreteModel()

## Define sets ##
#  Sets

model.I = RangeSet(1, N, doc='Farms')
model.J = RangeSet(1, n_max, doc='Turbines')
model.T = RangeSet(1, T, doc='Time horizon')
model.T_minus_1 = RangeSet(1, T-1, doc='Time horizon up to T-1')
model.R = RangeSet(1, R, doc='Maintenance Crews')

## Define variables ##
#  Variables

model.Xpm_ijt = Var(model.I, model.J, model.T, domain=Binary, doc='Binary variable for shipment decision')
model.Xcm_ijt = Var(model.I, model.J, model.T, domain=Binary, doc='Binary variable for shipment decision')

model.y_rt = Var(model.R, model.T, domain=Binary, doc='Binary variable for shipment decision')
model.z_rit = Var(model.R, model.I, model.T, domain=Binary, doc='Binary variable for shipment decision')
model.f_ijt = Var(model.I, model.J, model.T, domain=Binary, doc='Binary variable for shipment decision')

model.a_ijt = Var(model.I, model.J, model.T,  domain=NonNegativeIntegers, bounds=(0, H*10), doc='Operating time of turbine j at farm i at time t')

#Constraints 
#Constraint 1

def init_a_ijt_rule(model, i, j, t):
    if t == 1 and i == 1:
        if j == 1:
            return 0
        elif j == 2:
            return 0
        elif j == 3:
            return 10
        elif j == 4:
            return 20
        elif j == 5:
            return 23
    elif t == 1 and i == 2:
        if j == 1:
            return 12
        elif j == 2:
            return 20
        elif j == 3:
            return 34
    else:
        return 0

model.constraint_a_ijt = Var(model.I, model.J, model.T, initialize=init_a_ijt_rule, doc='Operating time of turbine j at farm i at time t')

#Constraint 2

def operating_time_rule(model, i, j, t):
    if model.Xpm_ijt[i, j, t].value == 1 or model.Xcm_ijt[i, j, t].value == 1:
        return model.a_ijt[i, j, t+1] == 0
    else:
        return model.a_ijt[i, j, t+1] == model.a_ijt[i, j, t] + 1

model.constraint_operating_time = Constraint(model.I, model.J, model.T_minus_1, rule=operating_time_rule)

#Constraint 3

def PM_rule(model, i, j, t):
    if value(model.a_ijt[i, j, t]) <= (H - h-1) or value(model.a_ijt[i, j, t]) >= H:
        return model.Xpm_ijt[i, j, t] == 0
    else:
        return Constraint.Skip

model.constraint_Xpm = Constraint(model.I, model.J, model.T, rule=PM_rule)`

直到第三个约束一切都运行良好,但当我运行 PM_rule 时出现此错误:

ERROR: evaluating object as numeric value: a_ijt[1,1,1] (object: <class 'pyomo.core.base.var._GeneralVarData'>) No value for uninitialized NumericValue object a_ijt[1,1,1] ERROR: Rule failed when generating expression for Constraint constraint_Xpm with index (1, 1, 1): ValueError: No value for uninitialized NumericValue object a_ijt[1,1,1] ERROR: Constructing component 'constraint_Xpm' from data=None failed: ValueError: No value for uninitialized NumericValue object a_ijt[1,1,1]

我是 Pyomo 新用户,欢迎任何帮助!谢谢你:)

python-3.x optimization jupyter-notebook solver pyomo
1个回答
0
投票

这里发生了一些事情。出现错误是因为在

PM_rule
函数中您正在调用
value(model.a_ijt[i, j, t])
value()
函数返回传递的变量或表达式的“当前值”。您收到错误是因为变量尚未初始化: model.a_ijt = Var( model.I, model.J, model.T, domain=NonNegativeIntegers, bounds=(0, H*10), doc='Operating time of turbine j at farm i at time t' )

您可以通过将 
init_a_ijt_rule

传递给变量构造函数来为变量提供初始值:

model.a_ijt = Var(
    model.I, model.J, model.T,  domain=NonNegativeIntegers, bounds=(0, H*10),
    initialize=init_a_ijt_rule,
    doc='Operating time of turbine j at farm i at time t'
)

也就是说,公平警告:在约束规则内调用 
value()

几乎总是

不是
您想要做的事情。约束规则是“不是”回调函数:仅在 Pyomo 构建模型时而不是在求解过程中调用该规则。因此,在这种情况下,constraint_Xpm 将仅包含基于变量初始值的(静态)约束,并且这些约束不会更改以反映求解器可能探索的任何更新值。 最后,如果您想要做的只是修复模型中的某些变量(即,完全阻止求解器操纵它们),则更简单(且更有效)的方法是使用类似
model.Xpm_ijt[1, 4, 1].fix(0)
的内容来修复变量


© www.soinside.com 2019 - 2024. All rights reserved.