gpt4 book ai didi

f# - F# 的 LP DSL,以 Clp 作为求解器

转载 作者:行者123 更新时间:2023-12-01 02:20:40 25 4
gpt4 key购买 nike

由于 Microsoft Solver Foundation 已被弃用,我正试图找到一种替代方法或一种合理的方法来创建我自己的 DSL。

我正在寻找的是在 F# 中描述 LP、使用 Clp 解决它并评估结果的基本 DSL。

在我重新发明轮子之前:有人知道已经为 LP 提供 DSL 的优秀库吗?

否则,您将如何在 F# 中构建这样的 DSL?本质上,我希望能够写出类似的东西

let xs = createVars 100 in 0..1
let ys = [| 1 .. 100 |]
let f i x = i*x
let lp =
minimize sumprod(xs, ys) subjectTo [
xs.[0] + xs.[1] = 1
sum(xs) <= 1
sum({for i in 1..100 -> f i xs.[i]}) <= 100
// ...
]
let solver = Clp()
let result = solver.solve lp

最佳答案

Before I reinvent the wheel: does someone know a good library that already provides a DSL for LPs?

不,除了ODSL from Microsoft SolverFoundation我什么都不知道|本身。

Otherwise, how would you build such a DSL in F#?

  1. 决定语言的句法。尽管您想构建内部 DSL,但您必须决定哪些内容是允许的,哪些内容不能用您的语言表达。

  2. 使用 F# quotations获得AST。为什么需要反射(reflection)?首先,您创建一堆变量并将它们与浮点常量组合以形成线性约束。稍后,您将用适当的值填充这些变量。反射允许您创建占位符并稍后计算结果。

  3. 在 CLP 中将 AST 转换为线性规划并求解。 CLP 似乎没有.NET API;您可以通过命令行与求解器通信,但它不是很方便和可靠。 在创建 DSL 之前开始构建低级 API 是个好主意。

  4. (可选)在 F# 3.0 中,您可以为 DSL 创建查询语法。你可以看看a convincing example , 内置 query expression .

Since the Microsoft Solver Foundation has been deprecated, I am trying to find an alternative or a reasonable way to create my own DSL.

无论如何,MSF 将为您的工作提供有值(value)的示例。可以浏览ODSL源码in this codebase .实际上,从代码库中可以看出 ODSL 已经完成了前三个步骤。我正在 ODSL 之上构建优化查询语言(第 4 步)并且只完成了表面语法。比如这个原来的例子

<@
let sa = var<Barrel/Day>()
let vz = var<Barrel/Day>()

minimise (20.0<Dollar/Barrel> * sa + 15.0<Dollar/Barrel> * vz)

where
[
0.3 * sa + 0.4 * vz >= 2000.<Barrel/Day>;
0.4 * sa + 0.2 * vz >= 1500.<Barrel/Day>;
0.2 * sa + 0.3 * vz >= 500.<Barrel/Day>;
sa <= 9000.<Barrel/Day>;
vz <= 6000.<Barrel/Day>;
sa >= 0.<Barrel/Day>;
vz >= 0.<Barrel/Day>
]
@>

将转换为

opt { let! sa = var<Barrel/Day>()
let! vz = var<_>()
assume (0.3 * sa + 0.4 * vz >= 2000.<_>)
assume (0.4 * sa + 0.2 * vz >= 1500.<_>)
assume (0.2 * sa + 0.3 * vz >= 500.<_>)
assume (sa <= 9000.<_> && sa >= 0.<_>)
assume (vz <= 6000.<_> && vz >= 0.<_>)
minimise (20.0<Dollar/Barrel> * sa + 15.0<_> * vz)
}

我还翻译了一些 DSL 示例 here如果您有兴趣。

关于f# - F# 的 LP DSL,以 Clp 作为求解器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14532450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com