首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将模型指定为Google或工具的字符串?

如何将模型指定为Google或工具的字符串?
EN

Stack Overflow用户
提问于 2020-12-23 00:16:04
回答 3查看 757关注 0票数 2

我正在为一个软件包设计一个功能。此功能允许用户输入优化模型,系统将使用注入的数据运行这些优化模型。模型格式可以是任何- AMPL,FlatZinc,SMT-Lib等.

微软的Z3看起来很坚固(它支持SMT),但不幸的是,它并不是免费的商业用途。经过更多的搜索后,我决定使用Google或工具,这是免费的商业使用。

不幸的是,我无法找到将模型指定为字符串的方法。例如,下面是如何使用OR工具.NET API解决一个简单的线性规划问题:

代码语言:javascript
复制
    Solver solver = Solver.CreateSolver(solverType);
    Variable x1 = solver.MakeIntVar(0.0, double.PositiveInfinity, "x1");
    Variable x2 = solver.MakeIntVar(0.0, double.PositiveInfinity, "x2");
    Objective objective = solver.Objective();
    objective.SetMinimization();
    objective.SetCoefficient(x1, 1);
    objective.SetCoefficient(x2, 2);
    Constraint ct = solver.MakeConstraint(17, double.PositiveInfinity);
    ct.SetCoefficient(x1, 3);
    ct.SetCoefficient(x2, 2);
    Solver.ResultStatus resultStatus = solver.Solve();

但是,由于我们需要用户指定一个模型,系统可以在以后动态运行(通过它注入的值),我们需要能够指定如下模型:

代码语言:javascript
复制
Solver solver = Solver.CreateSolver(solverType);
solver.AddParam("x1", 0);
model = @"
    int: x1;
    var int: x2;
    constraint x1 >= 0;
    constraint x2 >= 0;
    constraint 2*x2 + 3*x1 >= 17;
    solve minimize x1 + 2*x2;
";
results = solver.Solve(model);

确切的语法并不重要。重要的是用户使用高级建模语言指定模型,并可以指定我们可以在后端注入的参数(在本例中是x1)。

我搜索了文档,但什么也找不到。诚然,这些文档似乎不完整、不准确/过时了,但这是我所能找到的全部。我还搜索了示例,但什么也没找到。

虽然我认为OR工具有一个支持外部文件的可执行文件,但我不能使用它,因为我们需要避免该解决方案的任何外部可执行文件。

我们可以将JSON字符串解析为Google ProtoBuf。这可能是我们的用户模型语言,甚至建议形成一个。然而,这仍然留下了精确映射的问题,因为仍然缺乏文档。

如何使用字符串指定模型来实现上述示例,如何获得Google工具.NET API?一个代码示例(将JSON字符串解析到Google很好)或权威(准确)文档都是可以接受的答案。

EN

回答 3

Stack Overflow用户

发布于 2020-12-31 03:55:00

听起来您想要使用动态C#脚本库,类似于我的Data.Eval库https://github.com/bruce-dunwiddie/data-eval (https://www.nuget.org/packages/Data.Eval/)吗?还有其他的,但是这个概念似乎与你所要求的相匹配。

您应该能够将C#代码从7的“完整程序”部分提取出来,并将其转换为字符串,然后使用任何库将其转换为"Eval“。

我可以输入完整的例子,如果你认为这是你想要的,我只是不熟悉谷歌或工具,虽然我熟悉线性回归求解。

代码语言:javascript
复制
Console.WriteLine(Evaluator.Eval("return 1+1"));

https://dotnetfiddle.net/DTLu6Z

票数 1
EN

Stack Overflow用户

发布于 2020-12-31 22:24:29

AMPL和GAMS都有允许这样做的API。

不幸的是,这些都是商业系统,所以它们不是免费的。如果我仔细阅读你的帖子,你正在寻找这样的工具,没有任何相关的成本。

一种可能的方法是使用NEOS向NEOS服务器提交以AMPL或GAMS表示的优化任务。见:https://neos-server.org/neos/

票数 0
EN

Stack Overflow用户

发布于 2021-01-19 03:41:58

我刚刚得到了使用使用OR-Tools的字符串的动态模型,但在Python中,我猜想在.NET中可以像@Bruce建议的那样在反射或Eval中做类似的事情。

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

https://stackoverflow.com/questions/65417492

复制
相关文章

相似问题

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