我正在使用Accord.Net的Cobyla求解器来解决一个相当简单的非线性问题。在某些情况下,问题没有可行的点。 当我运行一个非可行性很明显的简单问题时,即使解决方案不可行,求解器也会返回“成功”。
考虑以下用F#编写的例子:
open System.Collection.Generics
let obj12 = QuadraticObjectiveFunction("a - a*a");
let c12 = QuadraticConstraint(obj12, Array2D.zeroCreate 1 1, [| 10.0 |], ConstraintType.LesserThanOrEqualTo, 4.0)
let c13 = QuadraticConstraint(obj12, Array2D.zeroCreate 1 1, [| 10.0 |], ConstraintType.GreaterThanOrEqualTo, 45.0)
let p1 = List<NonlinearConstraint>()
p1.Add(c12)
p1.Add(c13)
let solver1 = Cobyla(obj12, p1)
let success = solver1.Maximize()
let value = solver1.Value
let solution = solver1.Solution
let r = solver1.Status
找到解算器的解决方案是4.5,这明显违反了第一个和第二个约束条件,但解算器状态是“成功”。
这是一个错误/功能吗?任何解决方法?
答案 0 :(得分:1)
我是C#COBYLA代码的作者,该代码是 Accord.NET 版COBYLA的基础。 C#实现是迈克尔鲍威尔原始代码的FORTRAN 77中相当直接的翻译。
优化方法目前仅支持三种返回状态:
没有明确的迹象表明违反了约束。 COBYLA努力克服这些限制,但不能保证能够成功实现这些限制,并且可能在没有满足约束的情况下返回。
如果我正确地解释你的例子(我的F#知识暂时有点生疏)你有两个矛盾的约束,或者?作为一种可能的解决方法,我建议您选择一个变量start guess,至少近似满足约束条件;这应该使COBYLA更容易留在可行的区域内。