Pyomo:集合的重新定义

时间:2019-04-09 21:43:19

标签: pyomo

下面的代码描述了一个抽象模型,其中集合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))

有人对我如何获得理想的效果有任何建议?

1 个答案:

答案 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是一种过程语言,而不是象征性语言。这意味着更改定义了其他内容的内容的值不会影响从属对象的定义,除非您在代码中专门更改了后者。

这也意味着,每当您在模型中执行类似的操作时,最好考虑一下即使忘记了代码,代码也将记住如何对其进行更改,这是个好主意,这是很好的编程习惯。在这一系列的技巧中,将其置于一个函数中,它会记住记住更新相关对象,这将变得非常有用。