Оптимизация с помощью 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 или другого решения?
1 ответ
Один комментарий, что я бы держался подальше от Microsoft.SolverFoundation, я потратил часы своей жизни на плохие алгоритмы, закодированные там. Поставщик R-типа намного лучше.
С учетом вышесказанного, обычным взломом является просто повторная параметризация модели для обработки ограничений. Например, установите:
е = а + д
в качестве параметра и внутри оптимизации рассчитывают d как:
д = еа
И теперь вам просто нужно выполнить ограничение e>0, которое является фиксированным. Вы можете сделать что-то подобное для параметра гаммы.