pyomo - 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问题 893中被注意到,在PR 1186的主分支上得到修复,并且将在下一个版本中普遍可用(可能是 Pyomo 5.6.9)。
推荐阅读
- pharo - Pharo 的标准库中是否有不可变的数据结构,例如地图和集合?
- html - 如何在 HTML 文件中使用其他语言?
- sql - oracle substr 从字符直到字符
- graphql - Apollo:使用 info.mergeInfo.delegateToSchema 将 root 传递给解析器
- haskell - Haskell 用左箭头做(语法上)内联单子解包
- javascript - amCharts 中的实时图表完全刷新
- angular - 想要根据Angular中的条件加载父组件后访问子组件对象
- google-sheets-formula - 谷歌表格过滤公式的文本包含
- jenkins - 如何将声纳分析结果发送到 Jenkins 管道中的 gitlab 合并请求
- nginx - 重定向到 https 所有用户代理,而不是指定的一个