提问者:小点点

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


我正在研究采购优化模型,以下是一些相关输入:

stets:

  • 模型。b=设置(初始化=品牌,文档=品牌)
  • 模型。s=设置(初始化=供应商,单据=供应商)
  • 模型。t=设置(初始化=时间,文档=以天为单位的时间)

参数:

  • model.lt=参数(模型,初始化=领导时间,文档=从供应商购买的交货期(天))

变量:

  • 模型。q=Var(model.b,model.t,model.s,domain=NonNegativeIntegers,bounds=(0.0,None),doc='每个品牌(b)在时间(t)收到的数量,来自供应商。'))
  • 模型。pr=Var(model.b,model.t,model.s,domain=NonNegativeIntegers,bounds=(0.0,None),doc='Purshase每个品牌的订单数量(b),在时间(t)时,从供应商处获得。')

我正在努力编写一个约束条件,使从时间(t)开始的(LT)天之前订购的数量=在时间(t)现在收到的数量,其中LT是每个供应商所需的交付周期。这是我想象约束的方式,但我不知道如何编写它:

时间订购数量(t-交货时间)=时间(t)收到的数量,适用于所有时间(t)、品牌(b)和供应商(s)

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


共1个答案

匿名用户

假设模型中的时间点都是整数,从模型中的一个点减去前置时间。t将给出另一个有效的索引模型。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)