服务热线:010-62964229
格瑞纳根植于教育行业,让仿真软件从理论教学到应用实践
新闻资讯
当前位置:首页 > 新闻资讯 > 行业新闻
操作教程 | 在AnyLogic中使用Google OR-Tools解决线性问题
2022-10-10 11:24:18 发布人:admin 阅读 2538

本文我们将分享一篇来自Jaco-Ben VoslooAnyLogic高级使用指南,介绍如何在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了吗?

gif


相关连接:OR-Tools链接https://developers.google.cn/optimization


线性问题 (LP)

Google OR-Tools自带的示例为例,介绍一下我们要解决的问题。

问题描述:在以下约束条件下最大化 3x + 4y

x + 2y≤143xy≥0xy≤2

其中,目标函数 3x + 4y 和约束由线性表达式给出,因此这是一个线性问题。

约束定义了可行区域,即下图所示的三角形及其内部。



相关连接:

Source链接 https://developers.google.cn/optimization/lp/lp_example

设置 Google OR-Tools

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

+1Windows 的附加功能 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链接:https://mvnrepository.com/artifact/com.google.ortools/ortools-java

jna 链接:https://mvnrepository.com/artifact/net.java.dev.jna/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


使用 AnyLogic 中的 Google OR 工具线性问题 (LP)

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

1) 将所有库导入您的 AnyLogic 模型

第一步是将库导入到您的 Anylogic 模型中,方法如下图,或查看AnyLogic 帮助文件获取更多详细信息



2)声明LP求解器

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

3) 定义变量

首先,创建变量 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());

4) 定义约束

接下来,定义变量的约束。 给每个约束一个唯一的名称(例如 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());

5) 定义目标函数

以下代码定义了目标函数 3x + 4y,并指定这是一个最大化问题。

// Maximize 3 * x + 4 * y.

MPObjective objective = solver.objective();

objective.setCoefficient(x, 3);

objective.setCoefficient(y, 4);

objective.setMaximization();

6)调用LP求解器

final MPSolver.ResultStatus resultStatus = solver.solve();

7) 显示解决方案

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 模型。之后还计划整理一个车辆路径规划的案例,敬请关注。

示例模型

您可以在此处下载模型,或者从AnyLogic云中下载模型

  电话:010-62964229
  邮箱:support@carila.cn
  地址:北京市海淀区上地信息产业基地三街3号楼1门4层401
©2021 北京格瑞纳电子产品有限公司 版权所有 京ICP备19024141号 京公网安备 11010802029095号
 
QQ在线咨询
点击这里给我发消息 点击这里给我发消息
服务热线
010-62964229
E-mail
support@
carila.cn
地址:北京市海
淀区上地信息产
业基地三街3号