我在gurobipy中实现了一个课程规划问题。一切都很好。我的下一个任务是用pyomo重写它。我对一个具体的公式(用gurobipy编写)有困难:
model.addConstrs((quicksum(gamma[l, k, s, T[tau]] for tau in range(index_t, index_t + dur[m]) if tau < len(T))
>= dur[m] * start[l, k, s, t] for index_t, t in enumerate(T) for m in M
for k in KM[m] for l in LM[m] for s in SM[m]), name='Hintereinander')gammalkst和startlkst是二元决策变量。l,k,s,t是指t是周期的指标。所以集合T是一个句点的列表。在这个方程中,我需要ord(t)能够用和进行计算。因此,我在整句末尾执行枚举(T)。(当遍历所有所需的索引时)。
我的数据是预先给出的,所以我用pyomo编写了一个ConcreteModel()。我很难在pyomo中包含集合T的枚举。我已经拥有的是:
def gamma_hintereinander_rule(model,m,k,l,s):
for index_t,t in enumerate(T):
if k in KM[m]:
if l in LM[m]:
if s in SM[m]:
return sum(model.gamma[l, k, s, T[tau]] for tau in range(index_t, index_t + dur[m]) if tau< len(T)) >= dur[m] * model.start[l, k, s, t]
else:
return Constraint.Skip
else:
return Constraint.Skip
else:
return Constraint.Skip
model.gamma_hintereinander = Constraint(M, K, L, S,rule=gamma_hintereinander_rule)它不能正常工作。如果有人能帮我,我会很高兴和感激的!诚挚的问候!泽尼布
发布于 2022-08-18 17:24:04
问题是约束规则内部的for-循环。在遇到第一个返回语句之后,您将退出该规则,因此尽管使用for-循环,但只返回了一个约束或Constraint.Skip。我认为最好的方法是用T索引约束,如下所示:
def gamma_hintereinander_rule(model,m,k,l,s,t):
index_t = T.index(t)
if k in KM[m]:
if l in LM[m]:
if s in SM[m]:
return sum(model.gamma[l, k, s, T[tau]] for tau in range(index_t, index_t + dur[m]) if tau< len(T)) >= dur[m] * model.start[l, k, s, t]
else:
return Constraint.Skip
else:
return Constraint.Skip
else:
return Constraint.Skip
model.gamma_hintereinander = Constraint(M, K, L, S, T, rule=gamma_hintereinander_rule)https://stackoverflow.com/questions/73406391
复制相似问题