Оптимизация с помощью F#

Я новичок в F# и у меня возникла проблема. Я хочу решить нелинейную задачу оптимизации с ограничениями. Цель состоит в том, чтобы свести к минимуму функцию minFunc с шестью параметрами a, b, c, d, gamma и rho_infty (функция довольно длинная, поэтому я не привожу ее здесь) и дополнительными условиями:

a + d > 0,
d > 0,
c > 0,
gamma > 0,
0 <= gamma <= -ln(rho_infty),
0 < roh_infty <= 1.

Я пробовал это с Nelder Mead Solver от Microsoft Solver Foundation, но я не знаю, как добавить нелинейные условия a + d > 0 и 0 <= gamma <= -ln(rho_infty).

Мой код до сих пор:

open Microsoft.SolverFoundation.Common
open Microsoft.SolverFoundation.Solvers

let funcFindParameters (startValues:float list) minimizationFunc =

let xInitial = startValues |> List.toArray
let lowerBound = [|-infinity; -infinity; 0.0; 0.0; 0.0; 0.0|]
let upperBound = [|infinity; infinity; infinity; infinity; infinity; 1.0|]

let solution = NelderMeadSolver.Solve(Func<float [], _>(fun parameters -> (minimizationFunc   
parameters.[0] parameters.[1] parameters.[2] parameters.[3] parameters.[4] parameters.[5])), 
xInitial, lowerBound, upperBound)

where parameters.[0] = a, and so one...

Возможно, есть какая-то возможность решить это с помощью Nelder Mead Solver или другого решателя?


person user3489455    schedule 02.04.2014    source источник
comment
Это было в моем списке пожеланий в течение некоторого времени... написание библиотеки решателя CSP для F #. Один день...   -  person Mau    schedule 02.04.2014
comment
может быть, стоит взглянуть на поставщик R-типа? R поставляется с широкой экосистемой для решения задач оптимизации.   -  person NoIdeaHowToFixThis    schedule 07.04.2014


Ответы (1)


Один комментарий: я бы держался подальше от Microsoft.SolverFoundation, я потратил часы своей жизни на написанные там плохие алгоритмы. Поставщик типа R намного лучше.

С учетом сказанного, общий хак заключается в том, чтобы просто перепараметрировать модель для обработки ограничений. Например, установите:

e=a+d

в качестве параметра, а внутри оптимизации вычислить d как:

d=e-a

И теперь вам просто нужно удовлетворить ограничение e>0, которое является фиксированным. Вы можете сделать что-то подобное для параметра гамма.

person evolvedmicrobe    schedule 09.04.2014