本文我们将分享一篇来自Jaco-Ben Vosloo的AnyLogic高级使用指南,介绍如何在AnyLogic中使用Google OR-Tools解决线性问题。
原文链接:https://www.theanylogicmodeler.com/post/using-google-or-tools-to-solve-an-lp-problem-in-anylogic
在我们的仿真模型中,经常需要使用一些优化工具,无论是解决简单的线性问题还是一些具有时间窗和容量限制的高级车辆路径问题。在这篇文章中,我们探讨了使用由 Google 创建的开源、免费的软件包(称为 OR-Tools)来解决线性问题 (LP)。
虽然本文中我们将研究使用OR-Tools的线性问题(LP)求解功能,但是OR-Tools应用范围十分广泛,还具有诸如线性规划与整数规划、网络流问题、路径规划问题、装箱问题、调度问题等诸多优化功能。而且它是支持Java的,因此非常适合AnyLogic框架。在以后的文章中,我们还将介绍使用 Google OR 工具解决车辆路径问题 (VRP)。
准备好在 AnyLogic 中使用 OR-Tools了吗?
相关连接:OR-Tools链接https://developers.google.cn/optimization
以Google OR-Tools自带的示例为例,介绍一下我们要解决的问题。
问题描述:在以下约束条件下最大化 3x + 4y:
x + 2y≤143x – y≥0x – y≤2
其中,目标函数 3x + 4y 和约束由线性表达式给出,因此这是一个线性问题。
约束定义了可行区域,即下图所示的三角形及其内部。
相关连接:
Source链接 https://developers.google.cn/optimization/lp/lp_example
Google OR-Tools 的设置过程可能有点复杂,特别是它本身是由纯粹的Java程序员开发的,并非基于AnyLogic框架的。比较幸运的是,有一些方便的分步说明,可以帮助您立即启动并运行它。
PS:提供一个我在2020年录制的安装指南,但Google OR-Tools在持续更新,因此可能有所变化,仅供参考。
相关连接:
2020年录制的安装步骤https://youtu.be/1PnMOJ6llI0
在这里你有两个选择
1) 按照Google OR Tool网站上的分步说明进行操作。
2)下载4个(如果您使用的是Windows,则为再+1个)jar文件,如下所述。
如果您尝试第1个选项,它将占用您大约一个小时的时间,当您完成后,可能仍然会缺少一些在 AnyLogic 中使用 Google OR-tools 所需的库,所以并不建议。
如果您选择第2个选项,您将需要以下库。
1.ortools-darwin
2.ortools-java
3.jna
4.protobuf-java
+1:Windows 的附加功能: ortools-win32
或者,您可以只下载本文末尾的示例模型了解相关功能。
PS:对于高级用户,请查看有关使用 Maven 的帖子,可以自动执行下载过程。
相关连接:
Java版OR-Tools安装说明https://developers.google.cn/optimization/install/java
ortools-darwin链接:https://mvnrepository.com/artifact/com.google.ortools/ortools-darwin-x86-64
ortools-java链接:
jna 链接:
protobuf-java 链接:https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java
ortools-win32 链接:https://mvnrepository.com/artifact/com.google.ortools/ortools-win32-x86-64
使用 Maven 的帖子:https://www.carila.cn/news_details/id/72.html
Google OR Tools 教程中提供的步骤如下。
1.导入线性求解器库,
2.声明LP求解器,
3.创建变量,
4.定义约束,
5.定义目标函数,
6.调用LP求解器;
7.显示解决方案
步骤 2-7 都可以在一个函数中完成。
相关连接:
Google OR Tools 教程链接:https://developers.google.cn/optimization/lp/lp_example
第一步是将库导入到您的 Anylogic 模型中,方法如下图,或查看AnyLogic 帮助文件获取更多详细信息
MPSolver solver = MPSolver.createSolver("GLOP"); |
MPsolver 是几个不同求解器的包装器,包括 Glop。 下面的代码声明了 GLOP 求解器。
注意:用 PDLP 代替 GLOP 以使用替代的 LP 求解器。 有关选择求解器的更多详细信息,请参阅高级 LP 求解,有关安装第三方求解器,请参阅安装指南。
相关连接:
高级 LP 求解:https://developers.google.cn/optimization/lp/lp_advanced
安装指南:https://developers.google.cn/optimization/install/java
首先,创建变量 x 和 y,其值在 0 到无穷大的范围内。
double infinity = java.lang.Double.POSITIVE_INFINITY; // x and y are continuous non-negative variables. MPVariable x = solver.makeNumVar(0.0, infinity, "x"); MPVariable y = solver.makeNumVar(0.0, infinity, "y"); System.out.println("Number of variables = " + solver.numVariables()); |
接下来,定义变量的约束。 给每个约束一个唯一的名称(例如 constraint0),然后定义约束的系数。
// x + 2*y <= 14. MPConstraint c0 = solver.makeConstraint(-infinity, 14.0, "c0"); c0.setCoefficient(x, 1); c0.setCoefficient(y, 2); // 3*x - y >= 0. MPConstraint c1 = solver.makeConstraint(0.0, infinity, "c1"); c1.setCoefficient(x, 3); c1.setCoefficient(y, -1); // x - y <= 2. MPConstraint c2 = solver.makeConstraint(-infinity, 2.0, "c2"); c2.setCoefficient(x, 1); c2.setCoefficient(y, -1); System.out.println("Number of constraints = " + solver.numConstraints()); |
以下代码定义了目标函数 3x + 4y,并指定这是一个最大化问题。
// Maximize 3 * x + 4 * y. MPObjective objective = solver.objective(); objective.setCoefficient(x, 3); objective.setCoefficient(y, 4); objective.setMaximization(); |
final MPSolver.ResultStatus resultStatus = solver.solve(); |
if (resultStatus == MPSolver.ResultStatus.OPTIMAL) { System.out.println("Solution:"); System.out.println("Objective value = " + objective.value()); System.out.println("x = " + x.solutionValue()); System.out.println("y = " + y.solutionValue()); } else { System.err.println("The problem does not have an optimal solution!"); } System.out.println("\nAdvanced usage:"); System.out.println("Problem solved in " + solver.wallTime() + " milliseconds"); System.out.println("Problem solved in " + solver.iterations() + " iterations"); |
只需将所有这些代码放入 AnyLogic 模型中的函数或按钮中,您就可以几乎立即执行并获得结果!
Google OR-Tools 是一个超级有用、灵活、轻量级的工具套件,用于解决一些运筹学类型的问题。 其支持 Java ,使其非常适合 AnyLogic 模型。之后还计划整理一个车辆路径规划的案例,敬请关注。