Pyomo 约束中的 For 循环
For loop in Pyomo Constraints
我正在努力在 Python Pyomo 中使用 for 循环进行多重约束。
我的代码概念如下
T = 504
model.times = RangeSet(0, T-1)
model.Machines = Set(initialize = Machines_parameters.keys())
然后我将 model.times 分成 3 组相同的长度,现在我想为这组的每一部分编写特定的约束。以下是代码的等效但简化版本:
for k in range(3): #number of parts in which I've divided the set [(0,167),(168,335),(336,503)]
for j in range(cluster_index[k][0], cluster_index[k][1]): #respectively first and last number of the subset
def logic_constr(model,i):
if j >= const1[k] and j < const2[k]:
return model.z[i, j + 1] - model.z[i, j] == model.dsu[i, j + 1] - model.dsd[i, j + 1]
else j==const2[k]:
return model.z[i,const2[k]] - model.z[i,j] == model.dsu[i,const1[k]] - model.dsd[i,const1[k]]
model.logic_constr = Constraint(model.Machines, rule = logic_constr)
我想做的是迭代创建 504 个不同的约束,每个约束都有自己的规则。
您对如何操作有什么建议吗?
按照您现在制定约束的方式,最后只会有一个约束,因为在每次循环之后,约束都会被覆盖。
因为,正如您所说,根据您的 for 循环,您还需要每个时间步长一个约束,这要简单得多。
首先,您需要将约束定义为:
model.logic_constr = Constraint(model.Machines, model.times, rule = logic_constr)
这意味着约束将应用于集合 model.times
的每个成员,即集合 model.Machines.
的每个元素将有 504 个约束
那么你所有的 ifs 和 for 循环都可以进入你对 logic_constr
函数的定义。
我正在努力在 Python Pyomo 中使用 for 循环进行多重约束。 我的代码概念如下
T = 504
model.times = RangeSet(0, T-1)
model.Machines = Set(initialize = Machines_parameters.keys())
然后我将 model.times 分成 3 组相同的长度,现在我想为这组的每一部分编写特定的约束。以下是代码的等效但简化版本:
for k in range(3): #number of parts in which I've divided the set [(0,167),(168,335),(336,503)]
for j in range(cluster_index[k][0], cluster_index[k][1]): #respectively first and last number of the subset
def logic_constr(model,i):
if j >= const1[k] and j < const2[k]:
return model.z[i, j + 1] - model.z[i, j] == model.dsu[i, j + 1] - model.dsd[i, j + 1]
else j==const2[k]:
return model.z[i,const2[k]] - model.z[i,j] == model.dsu[i,const1[k]] - model.dsd[i,const1[k]]
model.logic_constr = Constraint(model.Machines, rule = logic_constr)
我想做的是迭代创建 504 个不同的约束,每个约束都有自己的规则。 您对如何操作有什么建议吗?
按照您现在制定约束的方式,最后只会有一个约束,因为在每次循环之后,约束都会被覆盖。
因为,正如您所说,根据您的 for 循环,您还需要每个时间步长一个约束,这要简单得多。
首先,您需要将约束定义为:
model.logic_constr = Constraint(model.Machines, model.times, rule = logic_constr)
这意味着约束将应用于集合 model.times
的每个成员,即集合 model.Machines.
那么你所有的 ifs 和 for 循环都可以进入你对 logic_constr
函数的定义。