Pyomo:如何为每个(i,j)对写一个约束

时间:2019-08-14 14:26:44

标签: optimization pyomo operations-research

编辑:我还添加了一个约束1.5,以说明也许有另一种方法来处理该约束。

我试图在Pyomo中为MxN网格上的每个(i,j)对编写以下约束:

enter image description here

到目前为止,我的代码如下,我只是希望我可以就约束定义是否正确编写以满足期望而得到一些反馈。想法是每个(i,j)单元格在6x6网格上将具有以下两个约束。

model = AbstractModel()

#Define the index sets for the grid, time horizions, and age classes:
model.Iset = RangeSet(6)
model.Jset = RangeSet(6)
model.Tset = RangeSet(7)
model.Kset = RangeSet(50)

#Define model parameters:
model.s = Param(within=NonNegativeIntegers)

#Define model variables:
model.juvenille = Var(model.Iset, model.Jset, model.Tset, model.Kset,
              within=NonNegativeReals, initialize = "some expression"

#Constraints: 

# Constraint #1
def juv_advance(model, i, j, t, k):
    return model.juvenille[i,j,t+1,k+1] == model.juvenille[i,j,t,k]*model.juvsurv

# Constraint #1.5
def juv_advance(model, t, k):
    return model.juvenille[t+1,k+1] == model.juvenille[t,k]*model.s \\
           for i in model.Iset for j in model.Jset

# Constraint #2
def juv_total(model, i, j, t, k):
    return sum(model.juvenille[k] for k in range(1,50))


此外,如果有人想回答这个问题……您如何保存计算出的j_t + 1值以用作下一个时间段的初始值。

1 个答案:

答案 0 :(得分:0)

我会尝试这样的事情:

model = AbstractModel()

#Define the index sets for the grid, time horizions, and age classes:
model.Iset = RangeSet(6)
model.Jset = RangeSet(6)
model.Tset = RangeSet(7)
model.Kset = RangeSet(50)

#Define model parameters:
model.s = Param(within=NonNegativeIntegers)

#Define model variables:
model.juvenille = Var(model.Iset, model.Jset, model.Tset, model.Kset,
              within=NonNegativeReals, initialize="some expression")

# As far as I see your problem in you second constraint the big J is a new variable ? 
 If that is the case than you have to create it:

model.J_big =Var(model.Iset, model.Jset, model.Tset, within=NonNegativeReals)

#Constraints: 

# Constraint #1
def juv_advance(model, i, j, t, k):
k_len = len(model.Kset)
t_len = len(model.Tset)
    if k == 1 and t == 1:
         return "some expression"
    elif t < t_len and k < k_len:
         return model.juvenille[i,j,t+1,k+1] == model.juvenille[i,j,t,k]*model.s
    else:
         return "Here has to come a statement what should happen with the last index (because if you are iterating to k=50 there is no k=51) " 


model.ConstraintNumber1 = Constraint(model.Iset, model.Jset, model.Tset, model.Kset, rule=juv_advance)


# Constraint #2
def juv_total(model, i, j, t, k):
    return model.J_big[i,k,j] == sum(model.juvenille[i,j,t,k] for k in model.Kset)

model.ConstraintNumber2 = Constraint(model.Iset, model.Jset, model.Tset, rule=juv_total)

重要的是,不仅要定义约束的规则,而且还要定义约束本身。另外,还必须记住,K和T集在某处结束,如果没有k + 1,则k + 1的表达式将不起作用。可能要提到的另一点是,如果您以k+1 == something开头,则考虑的第一个k值为k =2。

我希望这会有所帮助,也许有人也知道一些更聪明的东西,我对pyomo也很陌生。