我正在为一个软件包设计一个功能。此功能允许用户输入优化模型,系统将使用注入的数据运行这些优化模型。模型格式可以是任何- AMPL,FlatZinc,SMT-Lib等.
微软的Z3看起来很坚固(它支持SMT),但不幸的是,它并不是免费的商业用途。经过更多的搜索后,我决定使用Google或工具,这是免费的商业使用。
不幸的是,我无法找到将模型指定为字符串的方法。例如,下面是如何使用OR工具.NET API解决一个简单的线性规划问题:
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();但是,由于我们需要用户指定一个模型,系统可以在以后动态运行(通过它注入的值),我们需要能够指定如下模型:
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很好)或权威(准确)文档都是可以接受的答案。
发布于 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“。
我可以输入完整的例子,如果你认为这是你想要的,我只是不熟悉谷歌或工具,虽然我熟悉线性回归求解。
Console.WriteLine(Evaluator.Eval("return 1+1"));发布于 2020-12-31 22:24:29
AMPL和GAMS都有允许这样做的API。
public void Eval(string AMPLStatements) in https://ampl.com/api/latest/dotnet/autoapi/ampl/AMPL/index.html。GAMSJob t2 = ws.AddJobFromString(GetModelText()); in TUTORIAL.html。不幸的是,这些都是商业系统,所以它们不是免费的。如果我仔细阅读你的帖子,你正在寻找这样的工具,没有任何相关的成本。
一种可能的方法是使用NEOS向NEOS服务器提交以AMPL或GAMS表示的优化任务。见:https://neos-server.org/neos/。
发布于 2021-01-19 03:41:58
我刚刚得到了使用使用OR-Tools的字符串的动态模型,但在Python中,我猜想在.NET中可以像@Bruce建议的那样在反射或Eval中做类似的事情。
https://stackoverflow.com/questions/65417492
复制相似问题