常见问题
|
该页面正在翻译中。 |
求解器似乎在优化过程中违反了约束,导致 N.域名,域名s,我能做些什么呢?
在优化期间,优化器使用松弛变量来放松约束的解。 因此,不能保证对于任意优化器,这些步骤都满足优化期间的约束。 在许多情况下,这可能会导致一个人的目标函数代码抛出一个 N.域名,域名 如果在其可接受区域之外进行评估。 例如, 日志(-1) 给予:
julia> log(-1) ERROR: DomainError with -1.0: log will only return a complex result if called with a complex argument. Try log(Complex(x)).
为了处理这个问题,不应该假设变量总是满足每个步骤的约束。 有三种一般方法可以更好地处理这个问题:
-
使用方法https://github.com/JuliaMath/NaNMath.jl[NaNMath.jl]
-
域受限调用之前的过程变量
-
使用域转换
NaNMath。jl给出了标准数学函数的替代实现,如 日志 和 sqrt,sqrt 在不扔的形式 N.域名,域名it’我宁愿回来 南优化器将能够优雅地处理NaNs并恢复,允许在没有进一步修改的情况下解决许多这些情况。 请注意,这样做https://discourse.julialang.org/t/optimizationmoi-ipopt-violating-inequality-constraint/92608/[内部在跳转。jl,因此,如果一个案例正在使用跳转而不是优化。jl]这可能是差异的原因。
或者,可以直接预处理这些值。 例如, 日志(abs(x)) 保证工作。 如果一个人这样做,有两件事要注意。 一个是解决方案不会被转换,因此转换应该应用于 索尔u ""好吧。 例如,解决方案可以找到一个优化 x=-2,并且应该手动将其更改为 x=2 如果 腹肌 版本在目标函数内使用。 请注意,许多函数会在导数中引入不连续性,这会影响优化过程。
最后,相关地,可以使用域转换编写优化,以便允许优化在完整的实数集中进行。 例如,而不是优化 x在[0,Inf],一个可以优化 exp(x)在[0,Inf] 因此 x在[-Inf,Inf] 是允许的,没有任何限制。 为此,您只需将转换添加到目标函数的顶部:
function my_objective(u)
x = exp(u[1])
# ... use x
end
优化完成后, 索尔u[1] 将是 exp(x) 因此 log(溶胶。u[1]) 将是最佳值 x. Julia生态系统中存在软件包,可以更轻松地跟踪这些域转换及其对更一般域的反转。 见https://github.com/tpapp/TransformVariables.jl[TransformVariables.jl]和https://github.com/TuringLang/Bijectors.jl[Bijectors.jl]用于此的高级接口。
虽然这可以允许将具有约束的优化重写为没有约束的优化,但请注意,这可以改变求解的数值属性,从而在个案基础上提高或降低数值稳定性。 因此,当一个解决方案,人们应该意识到它可能使优化在某些情况下更加困难。
使用ModelingToolkit有什么优点和缺点。jl或其他符号接口(跳转)?
优化的纯数值函数接口.jl有其优点和缺点。 直接优化的主要专业。jl接口是它可以采取任意的Julia程序。 如果您在程序上定义了优化,例如神经颂或调用web服务器的东西,那么这些高级设置很少在专门的符号环境中用于优化。 优化的直接使用。因此,jl是这类问题的首选途径,并且由于使用简单,是Julia生态系统中这些情况的流行选择。
但是,符号接口是聪明的,他们可能比你更了解如何使这种优化更快。 而符号接口愿意做"繁琐的工作",以使优化更有效率。 例如,ModelingToolkit集成与优化。jl将在以下情况下进行许多简化 结构化/结构化 被调用。 其中之一是撕裂的约束。 为了理解撕裂过程,假设我们有非线性约束的形式:
0 ~ u1 - sin(u5) * h,
0 ~ u2 - cos(u1),
0 ~ u3 - hypot(u1, u2),
0 ~ u4 - hypot(u2, u3),
如果这些是约束,人们可以写 u1=sin(u5)*h 和替代 u1 为目标函数中的该值。 如果这样做,那么 u1 不需要求解,优化少了一个状态变量和一个约束。 人们可以继续这个过程一直到一堆函数:
u1 = f1(u5)
u2 = f2(u1)
u3 = f3(u1, u2)
u4 = f4(u2, u3)
因此,如果目标函数是这5个变量和4个约束的函数,则ModelingToolkit。jl将把它转换成一个没有约束的变量系统,允许在一个较小的系统上无约束的优化。 这既会更快,也会在数值上更容易。
跳。jl是另一个符号接口。 虽然它不包括这些撕裂和符号简化过程,但它确实包括专门化解决方案过程的能力。 例如,它可以处理线性优化问题,二次优化问题,凸优化问题等。 以比一般非线性接口更有效的特定方式。 有关跳转允许的特殊求解类型的更多信息,请参阅https://jump…dev/跳转。jl/stable/installation/#Supported-solvers[本页]。