当没有可行的解决方案时,Accord.net Cobyla 求解器返回成功

2024-02-18

我正在使用 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,这明显违反了第一和第二个约束,但求解器状态为“成功”。

这是一个错误/功能吗?有什么解决办法吗?


我是 C# COBYLA 代码的作者,该代码是雅阁网COBYLA 版本。 C# 实现是对 Michael Powell 原始代码的 FORTRAN 77 的相当简单的翻译。

优化方法目前仅支持三种返回状态:

  • 正常终止
  • 已达到功能评估的最大数量
  • 舍入误差正在以不受控制的方式增加

没有明确的迹象表明违反了约束。 COBYLA 努力满足限制条件,但不保证成功,并且可能在未满足限制条件的情况下返回。

如果我正确地解释你的例子(我的 F# 知识目前有点生疏),你有两个相互矛盾的约束,或者?作为一种可能的解决方法,我建议您选择一个至少近似满足约束的变量起始猜测;这应该会让 COBYLA 更容易留在可行区域内。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当没有可行的解决方案时,Accord.net Cobyla 求解器返回成功 的相关文章

随机推荐