2015-06-01 14 views
3

Я использую решение 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, который явно нарушают первое и второе ограничения, однако статус решатель «успешной».

Это ошибка/особенность? Любое обходное решение?

+1

Как отметил Андерс, это происходит из первоначальной реализации Fortran 77. Тем не менее, я буду добавлять новый код статуса для этой конкретной ситуации в будущем. Спасибо, что подняли этот вопрос! – Cesar

ответ

1

Я являюсь автором кода C# COBYLA, который является основанием для версии COBYLA Accord.NET. Реализация C# представляет собой довольно простой перевод из FORTRAN 77 исходного кода Майкла Пауэлла.

Метод оптимизации в настоящее время поддерживает только три возвращаемые статусы:

  • Нормальное завершение
  • Максимальное число оценки функции достигнутую
  • ошибок округления увеличивается бесконтрольно

Там существует нет явного указания о том, что ограничения нарушены. COBYLA стремится удовлетворить ограничения, но не гарантирует успех с этим и может вернуться без выполнения ограничений.

Если я правильно истолковал ваш пример (у меня на данный момент немного знаний о F # немного ржавый), у вас есть два противоречащих ограничения или? В качестве возможного обходного пути я бы предположил, что вы выбираете переменную start guess, которая по крайней мере приблизительно удовлетворяет ограничениям; что должно облегчить для COBYLA пребывание в пределах возможного региона.

 Смежные вопросы

  • Нет связанных вопросов^_^