【问题标题】:Is there an fmincon algorithm that always satisfies linear constraints?是否有始终满足线性约束的 fmincon 算法?
【发布时间】:2015-11-07 15:18:05
【问题描述】:

我试图在 Matlab 中使用相当复杂的目标函数执行约束线性优化。对于不符合我定义的线性不等式约束的输入值,这个目标函数会产生误差。我知道有 a few algorithms 在每次迭代中强制严格遵守边界,但有没有人知道任何算法(或其他机制)在每次迭代中强制严格遵守线性(不等式)约束?

我可以让我的目标函数在任何此类点都返回零,但我担心会引入大的不连续性。

【问题讨论】:

  • 你试过将fmincon优化算法设置为'interior-point'吗? options = optimoptions('fmincon','Algorithm','interior-point');。如果我没记错的话,'interior-point' 优化应该总是在可行域内搜索。
  • 还可以阅读AlwaysHonorConstraints 选项的文档。
  • 这里有一点 self advertisement 与这个案例相关 :) 这是我编写的一个函数,它使用 fminsearch 作为引擎,同时允许有界和线性/非线性(非)等式约束。它不关心不连续性,不需要导数等,并且还可以选择严格遵守约束。但是,由于引擎是fminsearch,因此该算法的扩展性很差,因此对于大维问题的性能较差……您所说的“复杂”是什么?
  • 另外,正如一般评论:返回零只有在目标函数的其余部分保证在任何地方都是负数时才有用;我会返回+inf :)
  • 等等,你说的是线性优化吗?那你为什么用fmincon而不是linprog

标签: matlab mathematical-optimization


【解决方案1】:

免责声明:我不是优化专家。不过有一些想法:

  1. 表示约束的对数障碍函数

要扩展 DanielTheRocketMan 的建议,您可以使用对数屏障函数来表示约束。如果您有约束 g(x)

fprim(x) = f(x) - (1/t) * log(-g(x))

其中 t 是定义约束的锐度的参数。当 g(x) 从下方接近 0 时,-log(-g(x)) 趋于无穷大,惩罚目标函数接近违反约束。较高的 t 值让 g(x) 更接近于 0。

  1. 您回答了自己的问题?将 fmincon 与满足约束的严格可行性的算法之一一起使用?

如果你的约束是线性的,那应该很容易传递给 fmincon。使用满足严格可行性的算法之一。

  1. 听起来这对你不起作用,但是 cvx 是一个很棒的包,可以解决一些凸问题,但对于其他问题却很可怕/不可行。如果您的问题是 (i) 凸和 (ii) 目标函数和约束不太复杂,那么 cvx 是一个非常酷的包。不过使用它有一些学习曲线。

很明显,但是如果您的问题不是凸的,那么您可能会遇到很大的问题,即陷入局部最优而不是找到全局最优。总是需要注意的事情。

【讨论】:

    【解决方案2】:

    如果 Matlab 不适合你,你可以自己实现所谓的Interior point penalty method [你需要改变你的目标函数]。参见等式 (1) 和 (2) [来自维基百科页面]。请注意,通过使用内部障碍,当 x 接近约束 [c(x) 接近于零] 时,惩罚会发散。该解决方案处理不等式约束。你也可以控制mu超时的值。最好的解决方案是假设 mu 随着时间的推移而减小。这意味着您需要处理一系列优化。如果 mu 不为零,则解总是会受到影响。此外,请注意,使用此方法您的问题不再是线性的。

    在等式约束的情况下,唯一简单(和通用)的处理方法是直接使用约束方程。例如,X1+x2+x3=3。将其重写为 x1=3-x2-x3 并用它来替换所有其他方程中 x1 的值。由于您的系统是线性的,它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 2014-07-29
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多