Pyomo 同时使用 IPOPT 和 Baron 作为求解器

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

我有一个非线性非凸优化问题需要使用 Pyomo 来解决。当我处理这个问题时,我遇到了几个问题:

  1. 当使用 multistart ipopt 来求解“全局”最优值时(尽管我知道 ipopt 返回局部最优值,但可能增加了全局解决方案的机会),我注意到 Pyomo 返回了最优结果,但违反了一些约束。具体来说,我通过两种方式定义了约束:1)在 Pyomo Constraint 中使用 expr = (lowerbound, y, upperbound),其中 y 表示调用涉及定义的 Pyomo Vars (x_i 's) 的函数,即 y = f( x_i 's),以及 2) 将计算变量 y 定义为另一个有界 Pyomo Var,并将 y = f(x_i 's) 放置为 Pyomo 约束中的硬等式。这两种情况有时都会违反定义约束,这不是我预期的结果。有什么建议可以在不违反定义的约束的情况下实现优化结果吗?

  2. 在我的问题中,我还尝试使用Baron进行非线性非凸全局优化解决方案。然而,Baron 似乎抱怨使用 Pyomo expr_if 表达式。由于我的优化问题中定义了基于 if-else 条件的表达式,Baron 没有正常退出优化。我尝试将 expr_if 转换为标准 if-else 条件,但弹出以下错误:

This error is usually caused by using a Var, unit, or mutable Param in a
Boolean context such as an "if" statement, or when checking container
membership or equality. For example,
    >>> m.x = Var()
    >>> if m.x >= 1:
    ...     pass
and
    >>> m.y = Var()
    >>> if m.y in [m.x, m.y]:
    ...     pass
would both cause this exception.

所以我使用Pyomo value方法及时计算了表达式的值,但是它返回了不可行的优化结果,这意味着即使我配置了Baron返回的优化决策变量,优化结果也与我的手动计算不一致。想询问任何建议/最佳实践来解决此类问题吗?

我对 Pyomo 和学习还是新手。

问题 1 的更新:

# get_density is a density calculation function based on defined decision variables.
# Scenario 1
self.model.stream1_density_con = pyomo.Constraint(expr=(lower_bound_value, self.get_pb_density("stream1"), None))

# Scenario 2
self.model.stream1_density = pyomo.Var(domain=pyomo.NonNegativeReals, bounds=[lower_bound_value, None])
self.model.stream1_density_con = pyomo.Constraint(expr=(self.model.stream1_density == self.get_density("stream1")))

Pyomo 求解器

options = {
    "bound_relax_factor": 0,
    "halt_on_ampl_error": "yes",
    "tol": 1.0e-12,
    "constr_viol_tol": 1.0e-5,
    "acceptable_constr_viol_tol": 1.0e-5,
    "honor_original_bounds": "yes"
}

opt = pyomo.SolverFactory("multistart")
solver = opt.solve(
     self.model,
     solver="ipopt",
     strategy="rand",
     suppress_unbounded_warning=True,
     solver_args={"options": options},
     iterations=200
)

运行时的错误和警告

ERROR: Unable to clone Pyomo component attribute. Component
    'receipt_variables_index' contains an uncopyable field '_init_values'
    (<class 'pyomo.core.base.set.TuplizeValuesInitializer'>)
WARNING: Loading a SolverResults object with a warning status into
    model.name="unknown";
      - termination condition: maxIterations
      - message from solver: Ipopt 3.11.1\x3a Maximum Number of Iterations
        Exceeded.

我不太确定如何避免错误和警告,即使优化可以运行并返回有意义的结果。

pyomo
1个回答
2
投票

您大约有 17 个问题集中在一个问题中,因此您可能需要对这个问题添加一些重点或提出单独的问题。

此外,如果您遇到错误(或您认为违反约束的情况),如果您在最小可重现示例中提供生成错误的确切代码,将会非常有帮助。

ipopt
或其他求解器的正确解不会违反约束。因此,要么 (a) 求解器返回一些错误(不可行、无界等),在这种情况下,结果都是垃圾。 您检查了求解器状态吗? 或者 (b) 您的约束构造不正确。

pyomo
和大多数其他框架中,您不能将 if 语句作为依赖于变量值的表达式的一部分。构建模型时,变量的值是未知的,这就是
pyomo
正在做的一切......构建法律方程并将其交给求解器。您将需要重新制定模型以排除此类陈述,可能会添加“指标变量”或其他 LP 概念。

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