我用pyomo编写了一个优化问题,需要一个约束,该约束包含一个长度可变的求和: u_i_t [i,t] * T_min_run-总和(在(t-T_min_run + 1).t-1中的tnewnew)u_i_t [i,tnewnew] <=总和(在t ..(t + T_min_run-1)中的tnew [i,tnew]
T是我的实际时间表,N是我的机器 通常,我会遍历t,但是我需要确保机器在一定时间内开启。
def HP_on_rule(model, i, t):
return model.u_i_t[i, t]*T_min_run - sum(model.u_i_t[i, tnewnew] for tnewnew in range((t-T_min_run+1), (t-1))) <= sum(model.u_i_t[i, tnew] for tnew in range(t, (t+T_min_run-1)))
model.HP_on_rule = Constraint(N, rule=HP_on_rule)
希望您能以pyomo / python为我提供正确的格式。
问题在于t是一个正在运行的变量,我不知道如何在Python中实现它。 tnew只是一个帮助变量。例如。 t = 6(变量),T_min_run = 3(常数),u_i_t是二进制[00001111100000 ...],则得到: 1 * 3-1-<= 3 如我所说,我不知道如何在我的代码中实现此功能,并且当前版本未运行。 TypeError:HP_on_rule()缺少1个必需的位置参数:'t'
答案 0 :(得分:0)
似乎您没有为函数规则提供所有参数。
由于t
是函数的参数,因此我假设它对应于集合T
的元素(您的时间轴)。
然后,代码示例的最后一行不仅应包括集合N
,还应包括集合T
。试试这个:
model.HP_on_rule = Constraint(N, T, rule=HP_on_rule)
请注意:构建一个带有“每个”部分的Constraint
,您必须在调用Set
开始时提供要迭代的Pyomo Constraint
施工。根据经验,约束规则函数的参数应比Set
初始化行中指定的Pyomo Constraint
的数量多1个参数。