我有一个非线性非凸优化问题需要使用 Pyomo 来解决。当我处理这个问题时,我遇到了几个问题:
当使用 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 约束中的硬等式。这两种情况有时都会违反定义约束,这不是我预期的结果。有什么建议可以在不违反定义的约束的情况下实现优化结果吗?
在我的问题中,我还尝试使用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 和学习还是新手。
# 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.
我不太确定如何避免错误和警告,即使优化可以运行并返回有意义的结果。
您大约有 17 个问题集中在一个问题中,因此您可能需要对这个问题添加一些重点或提出单独的问题。
此外,如果您遇到错误(或您认为违反约束的情况),如果您在最小可重现示例中提供生成错误的确切代码,将会非常有帮助。
ipopt
或其他求解器的正确解不会违反约束。因此,要么 (a) 求解器返回一些错误(不可行、无界等),在这种情况下,结果都是垃圾。 您检查了求解器状态吗? 或者 (b) 您的约束构造不正确。
在
pyomo
和大多数其他框架中,您不能将 if 语句作为依赖于变量值的表达式的一部分。构建模型时,变量的值是未知的,这就是 pyomo
正在做的一切......构建法律方程并将其交给求解器。您将需要重新制定模型以排除此类陈述,可能会添加“指标变量”或其他 LP 概念。