2015-06-01 36 views
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这清楚地违反了第一和第二约束但是解算器状态为“成功”。

这是一个错误/功能?任何解决方法?

+1

正如Anders指出的那样,这种行为来自最初的Fortran 77实现。但是,我将在未来为这种特定情况添加新的状态代码。感谢提出这个问题! – Cesar

回答

1

我是C#COBYLA代码的作者,它是COBYLA版本Accord.NET版本的基础。 C#实现是Michael Powell原始代码的FORTRAN 77的一个相当直接的翻译。

优化方法目前只支持三个返回状态:

  • 正常终止
  • 功能评价的数量已达上限
  • 舍入误差在

存在一个不受控制的方式增加没有明确说明约束被违反。 COBYLA努力满足约束条件,但不能保证能够成功,并且可能会在没有完成约束的情况下返回。

如果我正确解释你的例子(我的F#知识暂时有点生疏),你有两个矛盾的约束,或?作为一种可能的解决方法,否则我会建议您选择一个至少能够满足约束的变量开始猜测;这将使COBYLA更容易保持在可行区域内。

相关问题