我是一个非常新的 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 新用户,欢迎任何帮助!谢谢你:)
这里发生了一些事情。出现错误是因为在
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)
的内容来修复变量