下面的代码描述了一个抽象模型,其中集合J由参数j_min定义。实例化模型后,我希望能够更新参数j_min,并相应地更新集合J。但是,这不起作用,如下面的代码所示。即使我更新了j_min,集合J仍然保持不变。
# Import the necessary libraries
from pyomo.environ import *
from pyomo.opt import SolverFactory
# Create an abstract model
m = AbstractModel()
# Specify the minimum index
m.j_min = Param(within=NonNegativeIntegers, mutable=True, initialize=1)
# Construct the set of j indices
m.J = RangeSet(m.j_min, m.j_min + 2)
# Declare the variables
m.x = Var(m.J, domain=NonNegativeReals)
# Declare the objective function
def objRule(m):
return sum(m.x[j] for j in m.J)
m.obj = Objective(rule=objRule)
# Instantiate the model
i = m.create_instance()
# Print out the elements of the set J
print('Before updating j_min, the members of the set J are:')
for j in i.J:
print(str(j))
# Reset the parameter values (supposedly)
i.j_min = 5
# Print out the elements of the set J
print('After updating j_min, the members of the set J are:')
for j in i.J:
print(str(j))
有人对我如何获得理想的效果有任何建议?
答案 0 :(得分:0)
这是您的答案:
# Reset the parameter values (supposedly)
i.j_min = 5
i.J = RangeSet(i.j_min, i.j_min + 2)
如果将i.J
定义为高于i.j_min
的值的范围,那么在更改i.j_min
时,还必须更改集合i.J
,以使事物连贯。如果不这样做,您将得到以下信息:
i.j_min = 5
i.J = [1,2,3]
那是因为python是一种过程语言,而不是象征性语言。这意味着更改定义了其他内容的内容的值不会影响从属对象的定义,除非您在代码中专门更改了后者。
这也意味着,每当您在模型中执行类似的操作时,最好考虑一下即使忘记了代码,代码也将记住如何对其进行更改,这是个好主意,这是很好的编程习惯。在这一系列的技巧中,将其置于一个函数中,它会记住记住更新相关对象,这将变得非常有用。