首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用F#进行优化

使用F#进行优化
EN

Stack Overflow用户
提问于 2014-04-02 21:20:51
回答 1查看 370关注 0票数 3

我是F#的新手,遇到了一个问题。我想解决一个非线性的、有约束的最优化问题。目标是最小化具有六个参数abcdgammarho_infty的函数minFunc (该函数相当长,因此我不在这里发布它)和附加条件:

代码语言:javascript
复制
a + d > 0,
d > 0,
c > 0,
gamma > 0,
0 <= gamma <= -ln(rho_infty),
0 < roh_infty <= 1.

我已经尝试了微软解算器基金会的内尔德米德解算器,但我不知道如何添加非线性条件a + d > 00 <= gamma <= -ln(rho_infty)

到目前为止我的代码:

代码语言:javascript
复制
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...

有没有可能用米德解算器或其他解算器来解决这个问题呢?

EN

回答 1

Stack Overflow用户

发布于 2014-04-09 11:44:54

一个评论是,我会远离Microsoft.SolverFoundation,我已经浪费了我生命中几个小时的时间在那里编写的糟糕的算法上。R型提供程序要好得多。

话虽如此,一个常见的技巧就是简单地重新参数化模型来处理约束。例如,设置:

e=a+d

作为参数,并且在优化内部计算d为:

d=e-a

现在你只需要满足约束e>0,这个约束是固定的。您可以对gamma参数执行类似的操作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22812842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档