Pyomo:如何为每个 (i,j) 对编写约束
Pyomo: How to write a constraint for each (i,j) pair
编辑:我还添加了约束 1.5 来说明处理约束的不同方法。
我正在尝试在 Pyomo 中为 MxN 网格上的每个 (i,j) 对编写以下约束:
到目前为止我的代码如下,我只是希望我能得到一些关于约束定义是否正确编写以满足 intention.The 想法的反馈,即每个 (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 值以用作下一个时间段的初始值。
我会尝试这样的事情:
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 也很陌生。
编辑:我还添加了约束 1.5 来说明处理约束的不同方法。
我正在尝试在 Pyomo 中为 MxN 网格上的每个 (i,j) 对编写以下约束:
到目前为止我的代码如下,我只是希望我能得到一些关于约束定义是否正确编写以满足 intention.The 想法的反馈,即每个 (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 值以用作下一个时间段的初始值。
我会尝试这样的事情:
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 也很陌生。