0

在网上没有找到在 F# 中使用 NLopt 的示例,我一直在尝试将NLoptNet上给出的示例从 C# 转换为 F#。由于对 C# 不熟悉,对 F# 也知之甚少,所以我一直在糟蹋它。

这是我到目前为止所拥有的:

open NLoptNet
open System


let solver = new NLoptSolver(NLoptAlgorithm.LN_COBYLA, uint32(1), 0.001, 100)
solver.SetLowerBounds([|-10.0|])
solver.SetUpperBounds([|100.0|])

let objfunc (variables : float array) = 
    Math.Pow(variables.[0] - 3.0, 2.0) + 4.0

solver.SetMinObjective(objfunc)

let initial_val = [|2.|]
let finalscore = ref System.Nullable()   // ERROR
let result = solver.Optimize(initial_val,  finalscore)

这是错误的描述:

连续的参数应该用空格或元组分隔,涉及函数或方法应用的参数应该用括号括起来

更具体地说,我正在尝试将以下三行 C# 转换为 F#:

double? finalScore;
var initialValue = new[] { 2.0 };
var result = solver.Optimize(initialValue, out finalScore);

有任何想法吗?

4

2 回答 2

5

此错误是由于 F# 处理优先级的方式 - 添加更多括号或一些运算符以阐明应用事物的顺序可以解决问题。

2个可能的修复是

ref (System.Nullable())

或者

ref <| System.Nullable()
于 2016-07-19T00:25:28.100 回答
3

只是为了完整起见,这里有第三种可能的解决方法:

let finalscore, result = solver.Optimize(initial_val)

这利用了 F# 可以将 out 参数视为返回值(在元组中)这一事实。我确信在某些情况下可能需要实际的参考单元。在最近的 F#mutable中通常就足够了。有关一些讨论,请参见:

MSDN 参考

SO讨论1

SO讨论2

乐趣&利润参考

于 2016-07-19T03:41:28.127 回答