我正在尝试使用相当复杂的目标函数在Matlab中执行约束线性优化。这个目标函数会产生不符合我定义的线性不等式约束的输入值的误差。我知道有a few algorithms强制严格遵守每次迭代的边界,但有没有人知道任何算法(或其他机制)在每次迭代时强制严格遵守线性(不等式)约束?
我可以让我的目标函数在任何这样的点上都返回零,但我担心引入大的不连续性。
答案 0 :(得分:1)
免责声明:我不是优化专家。但是有一些想法:
要扩展DanielTheRocketMan的建议,您可以使用日志屏障功能来表示约束。如果你有约束g(x)< = 0并且最小化的目标是f(x)那么你可以定义一个新的目标:
fprim(x)= f(x) - (1 / t)* log(-g(x))
其中t是一个参数,用于定义约束的锐度。当g(x)从下面接近0时,-log(-g(x))变为无穷大,惩罚目标函数以接近违反约束。较高的t值使g(x)更接近0。
如果您的约束是线性的,那么应该很容易传递给fmincon。使用满足严格可行性的算法之一。
明显的一点,但是如果你的问题不是凸出的,那么你可能会遇到很大的问题就是陷入局部最优而不是找到全局最优。总是需要注意的事情。
答案 1 :(得分:0)
如果Matlab不适合您,您可以自己实施所谓的Interior point penalty method [您需要更改目标函数]。参见等式(1)和(2)[来自维基百科页面]。注意,通过使用内部屏障,当x接近约束[c(x)接近于零]时,惩罚会发散。该解决方案处理不平等约束。您还可以控制mu超时的值。最好的解决方案是假设mu随着时间的推移而减少。这意味着您需要处理一系列优化。如果mu与零不同,则解决方案始终受到影响。此外,请注意使用此方法,您的问题不再是线性的。
在等式约束的情况下,处理它的唯一简单(和一般)方法是直接使用约束方程。例如,X1 + x2 + x3 = 3。将其重写为x1 = 3-x2-x3并用它来替换所有其他方程中的x1值。由于您的系统是线性的,它应该工作。