在Pyomo中,如何基于另一个参数编写具有不同时间段的约束?

时间:2017-02-27 04:57:22

标签: pyomo

我正在制定采购优化模型,下面是一些相关的输入:

stets:

  • model.b = Set(initialize = Brands,doc =' Brands')
  • model.s = Set(initialize = Suppliers,doc ='供应商')
  • model.t = Set(initialize = Time,doc =' Time in days')

参数:

  • model.lt = Param(model.s,initialize = LeadTime,doc ='在几天内从供应商处购买的交货时间')

变量:

  • model.q = Var(model.b,model.t,model.s,domain = NonNegativeIntegers,bounds =(0.0,None),doc ='每个品牌的回收数量(b),及时(t),表格供应商。')
  • model.pr = Var(model.b,model.t,model.s,domain = NonNegativeIntegers,bounds =(0.0,None),doc =' Purshase每个品牌的订单数量(b),at时间(t),表格供应商。')

我努力编写一个约束,在时间(t)之前(LT)天之前订购数量=现在在时间(t)收到的数量,其中LT是每个供应商所需的提前期。 这就是我想象的约束,但我不知道如何写它:

按时间排序的数量(t - 提前期)=在时间(t)收到的数量,所有时间(t),品牌(b)和供应商

非常感谢您的时间和帮助!

1 个答案:

答案 0 :(得分:2)

假设模型中的时间点都是整数,并且从model.t中的一个点减去提前期将给出另一个有效的model.t索引,那么以下内容应该有效:

def compute_received(m,b,t,s):
    if t - m.lt[s] < min(m.t):
        # Deliveries at this time would have to be placed before the beginning of the model
        return Constraint.Skip
    return m.q[b,t,s] == m.pr[b,t-m.lt[s],s]
model.compute_received = Constraint(model.b, model.t, model.s, rule=compute_received)