F# Microsoft Solver Foundation — класс NelderMeadSolver

Может ли кто-нибудь показать мне пример кода для использования класса NelderMeadSolver в F #?

Например, я хочу минимизировать следующую функцию: F(X, Y)

F = (X-1)^2 + (y-1)^2, где 0‹ X ‹ 2 , 0‹ Y ‹ 2 Ответ очевиден: X = 1, Y = 1

Я нашел пример для C#:
http://msdn.microsoft.com/en-us/library/hh404040(v=VS.93).aspx

Я был бы очень признателен, если бы кто-нибудь мог дать мне простой код F #, чтобы минимизировать функцию выше. Спасибо.


person user1219664    schedule 19.02.2012    source источник


Ответы (1)


Я никогда раньше не использовал Solver Foundation, но вот простой перевод из пример C# в MSDN (адаптирован к вашей функции оптимизации):

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

let xInitial = [| 0.; 0. |]
let xLower = [| 0.; 0. |]
let xUpper = [| 2.; 2. |]

let sqr x = x * x

let solution = 
   NelderMeadSolver.Solve(
      Func<float [], _>(fun xs -> sqr(xs.[0] - 1.) + sqr(xs.[1] - 1.)), 
      xInitial, xLower, xUpper)

printfn "%A" solution.Result
printfn "solution = %A" (solution.GetSolutionValue 0)
printfn "x = %A" (solution.GetValue 1)
printfn "y = %A" (solution.GetValue 2)

Вы должны иметь возможность добавлять ссылки Solver Foundation и создавать программу. Если вы используете код в F# Interactive, не забудьте добавить DLL-файлы Solver Foundation, указав их точные пути.

person pad    schedule 19.02.2012
comment
Спасибо. Мне удалось сослаться на SolverFoundation и переориентировать .net framework 4. Но я боюсь, что не смогу скомпилировать приведенный выше код с помощью VS 11. Я думаю, что сначала мне нужно создать экземпляр класса NelderMeadSolver. Например, пусть NMSolver = new NelderMeadSolver(), а затем пусть решение = NMSolver.Solver ( .....) Вот ссылка на класс: msdn.microsoft.com/en-us/library/ - person user1219664; 20.02.2012
comment
В чем ошибка? Согласно вашей ссылке NelderMeadSolver.Solve - это статический метод, поэтому вам не нужно создавать экземпляр объекта для использования решателя. - person pad; 20.02.2012
comment
В строке let solution = NelderMeadSolver.Solve(...) есть ошибка, говорящая о том, что член или конструктор объекта "Решить" не принимает 1 аргумент(ы). Обнаружена перегрузка, принимающая 2 аргумента. Кажется, что метод Solve не имеет однозначного соответствия с его вспомогательной частью C #. Ссылка выше дает некоторую информацию об аргументах. Но я не знаю, как это реализовать. Спасибо!! - person user1219664; 20.02.2012
comment
Кажется, что первым аргументом должен быть делегат Func(T,Tresult). Не могли бы вы указать мне синтаксис Func Delegate? msdn.microsoft.com/en-us/library/bb549151.aspx# Y0 - person user1219664; 20.02.2012
comment
Да, я исправил пример, используя делегат. Теперь программа должна нормально компилироваться. - person pad; 20.02.2012