3
我正在使用Accord.Net的Cobyla求解器来解决一个相当简单的非线性问题。在某些情况下,这个问题没有可行的方面。 当我运行一个简单的问题,即非可行性很明显时,即使解决方案不可行,解算器也会返回“成功”。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这清楚地违反了第一和第二约束但是解算器状态为“成功”。
这是一个错误/功能?任何解决方法?
正如Anders指出的那样,这种行为来自最初的Fortran 77实现。但是,我将在未来为这种特定情况添加新的状态代码。感谢提出这个问题! – Cesar