了解固定变量获取 `ipopt_zL_out` 和 `ipopt_zU_out` 的行为

问题描述 投票:0回答:1

我试图理解

ipopt_zL_out
ipopt_zU_out
是如何分配的,特别是对于固定变量(即具有相同下限和上限的变量)。我发现后缀值(
ipopt_zL_out
ipopt_zU_out
)有时是
None
,具体取决于问题数据。这是从 pyomo 示例之一修改而来的最小示例。

import numpy as np
import pyomo.environ
from pyomo.core import *
from pyomo.opt import SolverFactory

solver = 'ipopt'
solver_io = 'nl'
stream_solver = False  # True prints solver output to screen
keepfiles = False  # True prints intermediate file names (.nl,.sol,...)
opt = SolverFactory(solver, solver_io=solver_io, tee=False)

model = ConcreteModel()
model.x_set = RangeSet(5)

x5_val = 0.0
var_lb = {1:1, 2:1, 3:2, 4:1, 5:x5_val}
var_ub = {1:5, 2:5, 3:2, 4:5, 5:x5_val}
def var_bounds(model, i):
    return (var_lb[i], var_ub[i])

model.x = Var(model.x_set, bounds=var_bounds)
model.x[1] = 1
model.x[2] = 1
model.x[3] = 2
model.x[4] = 1
model.x[5] = x5_val

model.obj = Objective(
    expr=model.x[1] * model.x[4] * (model.x[1] + model.x[2] + model.x[3]) + model.x[3] + model.x[5]**2
)
model.constraints = ConstraintList()
model.constraints.add(model.x[1] * model.x[2] * model.x[3] * model.x[4] >= 25.0)
model.constraints.add(model.x[1]**2 + model.x[2]**2 + model.x[3]**2 + model.x[4]**2 + model.x[5]**2 == 40.0)

model.ipopt_zL_out = Suffix(direction=Suffix.IMPORT)
model.ipopt_zU_out = Suffix(direction=Suffix.IMPORT)
model.dual = Suffix(direction=Suffix.IMPORT_EXPORT)

opt.options['linear_solver']='ma27'
opt.options['fixed_variable_treatment']='make_parameter'
results = opt.solve(model, keepfiles=keepfiles, tee=stream_solver)

model.ipopt_zL_out.display()
model.ipopt_zU_out.display()

在上面的示例中,对于

ipopt_zL_out
ipopt_zU_out
model.x[5]
都是 None。但是,如果我设置
x5_val = 1.0
,则
ipopt_zU_out
的值为
model.x[5]

这就是我的问题。如果这些后缀是

None
,那么相应的降低成本是否为零?降低变量成本的最佳实践是什么?

pyomo ipopt
1个回答
0
投票

如果

fixed_variable_treatment
设置为
make_parameter
,Ipopt 应计算固定变量的对偶值。这是在 3.14.0 中添加的(https://github.com/coin-or/Ipopt/blob/stable/3.14/ChangeLog.md#algorithm)。

使用

fixed_variable_treatment=make_constraint
,它也应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.