首页 > 解决方案 > pyomo Port Extensive 中的意外行为

问题描述

我在 pyomo.network 的 Port 类中观察到一些意外行为。下面的例子是不可行的,虽然逻辑解决方案应该是 1。问题是目标端口变量(X_IN,块 3)的边界也覆盖了源变量(X_OUT,块 2)的边界。在我看来,这对于 Equality 是正确的,但对于 Extensive 规则是不正确的。我在这里有什么问题还是有问题?

import pyomo.environ as pyomo
import pyomo.network as network
import pyomo.opt as opt

m = pyomo.ConcreteModel()

# Block 1
m.block_1 = pyomo.Block()
m.block_1.X_OUT = pyomo.Var(domain=pyomo.NonNegativeReals)
m.block_1.OUT = network.Port()
m.block_1.OUT.add(m.block_1.X_OUT, 'X', network.Port.Extensive)

# Block 2
m.block_2 = pyomo.Block()
m.block_2.X_OUT = pyomo.Var(domain=pyomo.Reals, bounds=(2, 2))
m.block_2.OUT = network.Port()
m.block_2.OUT.add(m.block_2.X_OUT, 'X', network.Port.Extensive)

# Block 3
m.block_3 = pyomo.Block()
m.block_3.X_IN = pyomo.Var(domain=pyomo.NonNegativeReals, bounds=(3, 3))
m.block_3.IN = network.Port()
m.block_3.IN.add(m.block_3.X_IN, 'X', network.Port.Extensive)

# Objective
m.obj = pyomo.Objective(expr=pyomo.summation(m.block_1.X_OUT),
                        sense=pyomo.maximize)

# Arcs
m.arc_block_1_block_3 = network.Arc(src=m.block_1.OUT, dest=m.block_3.IN)
m.arc_block_2_block_3 = network.Arc(src=m.block_2.OUT, dest=m.block_3.IN)

# Expand the arcs and solve
pyomo.TransformationFactory("network.expand_arcs").apply_to(m)
opt.SolverFactory('cbc').solve(m, tee=True)

标签: pyomo

解决方案


这种行为在 Pyomo问题 893中被注意到,在PR 1186的主分支上得到修复,并且将在下一个版本中普遍可用(可能是 Pyomo 5.6.9)。


推荐阅读