Я использую решение Cobyla от Accord.Net для решения довольно простой нелинейной задачи. В некоторых случаях не будет возможных точек для этой проблемы. Когда я запускаю хотя бы простую проблему, когда неосуществимость очевидна, решатель возвращает «Успех», хотя решение не представляется возможным.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, который явно нарушают первое и второе ограничения, однако статус решатель «успешной».
Это ошибка/особенность? Любое обходное решение?
Как отметил Андерс, это происходит из первоначальной реализации Fortran 77. Тем не менее, я буду добавлять новый код статуса для этой конкретной ситуации в будущем. Спасибо, что подняли этот вопрос! – Cesar