F#微软求解器基础库 - NelderMeadSolver类

3

有人能给我展示一下如何使用F#中的NelderMeadSolver类的示例代码吗?

例如,我想要最小化以下函数: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#代码来最小化上述函数,我将不胜感激。谢谢。

1个回答

4

我以前从未使用过Solver Foundation,但这里是一个简单的翻译,来自MSDN中的C#示例(适用于您的优化函数):

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# 交互中使用代码,请记得通过引用其精确路径来添加 Solver Foundation 的 dll 文件。


谢谢。我成功引用了SolverFoundation并重新定向了.net框架4。但是我担心我无法使用VS 11编译上面的代码。我认为我必须先实例化NelderMeadSolver类。例如,让NMSolver = new NelderMeadSolver(),然后让solution = NMSolver.Solver (.....) 这里是类的链接:http://msdn.microsoft.com/en-us/library/microsoft.solverfoundation.solvers.neldermeadsolver(v=vs.93).aspx - convexky
什么是错误?根据你提供的链接,NelderMeadSolver.Solve 是一个静态方法,因此您无需实例化对象即可使用该求解器。 - pad
在 let solution = NelderMeadSolver.Solve(...) 这一行上出现了一个错误,提示“成员或对象构造函数'Solve'不接受1个参数。找到了一个重载,它接受2个参数。似乎Solve方法与其C#对应方法没有一对一的匹配。上面的链接提供了有关参数的一些信息。但我不知道如何实现它。谢谢! - convexky
似乎第一个参数应该是 Func(T, Tresult) 委托。您能否指导我 Func 委托的语法?http://msdn.microsoft.com/en-us/library/bb549151.aspx#Y0 - convexky
是的,我已经使用委托修复了这个示例。现在程序应该可以正常编译了。 - pad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接