OptaPlanner 简介
1.什么是OptaPlanner?
每个组织都面临规划问题:以有限的资源(员工、资产、时间和金钱)提供产品或服务。OptaPlanner 优化此类计划以用更少的资源开展更多业务。这被称为约束满足编程(它是运筹学学科的一部分)。
OptaPlanner是一个轻量级、可嵌入的约束满足引擎,可优化规划问题。它解决了以下用例:
-
员工轮班:安排护士、修理工……
-
日程安排:安排会议、约会、维护工作、广告……
-
教育时间表:安排课程、课程、考试、会议演示……
-
车辆路线:规划车辆路线(卡车、火车、轮船、飞机……),使用已知的地图工具将货物和/或乘客运送到多个目的地……
-
装箱:用物品填充容器、卡车、轮船和存储仓库,还可以跨计算机资源包装信息,如在云计算中……
-
车间调度:规划汽车装配线,机器队列规划,劳动力任务规划,......
-
裁切库存:在裁切纸张、钢材、地毯等时尽量减少浪费...
-
运动日程安排:为足球联赛、棒球联赛、……规划比赛和训练日程
-
财务优化:投资组合优化,风险分散,......

用例概览
2. 什么是规划问题?

什么是计划问题
规划问题具有基于有限资源和特定约束的最优目标。最佳目标可以是任意数量的事物,例如:
-
利润最大化 - 最佳目标会带来尽可能高的利润。
-
最小化生态足迹——最佳目标对环境的影响最小。
-
最大限度地提高员工或客户的满意度——最佳目标优先考虑员工或客户的需求。
实现这些目标的能力取决于可用资源的数量,例如:
-
人的数量。
-
多少时间。
-
预算。
-
实物资产,例如机器、车辆、计算机、建筑物等。
还必须考虑与这些资源相关的特定限制,例如一个人的工作小时数、他们使用某些机器的能力或设备之间的兼容性。
OptaPlanner 帮助 Java TM程序员有效地解决约束满足问题。在底层,它将优化启发式和元启发式与非常有效的分数计算相结合。
2.1。规划问题是 NP-complete 或 NP-hard
上面所有的用例可能都是 NP-complete/NP-hard,用外行的话来说就是:
-
在合理的时间内验证给定的问题解决方案很容易。
-
没有灵丹妙药可以在合理的时间内找到问题的最佳解决方案 (*)。
(*) 至少,世界上最聪明的计算机科学家还没有找到这样的灵丹妙药。但是,如果他们找到一个 1 的 NP 完全问题,它将适用于每个 NP 完全问题。事实上,任何能证明这种灵丹妙药是否真的存在的人都会获得 1,000,000 美元的奖励。
这意味着非常可怕:解决您的问题可能比您预期的要难,因为这两种常见的技术是不够的:
-
蛮力算法(甚至更智能的变体)将花费太长时间。
-
一个快速算法,例如在装箱中,首先放入最大的物品,将返回一个远非最优的解决方案。
通过使用先进的优化算法,OptaPlanner 确实在合理的时间内为此类规划问题找到了接近最优的解决方案。
2.2. 规划问题具有(硬约束和软约束)
通常,规划问题至少有两个级别的约束:
-
不得破坏(*负)硬约束。*例如:1 位老师不能同时教 2 节不同的课程。
-
如果可以避免,则不应破坏*(负)软约束。*例如:A 老师不喜欢在星期五下午上课。
一些问题也有积极的约束:
-
如果可能,应满足*积极的软约束(或奖励) 。*例如:B 老师喜欢在星期一早上上课。
一些基本问题(例如N 个皇后)只有硬约束。有些问题具有三个或更多级别的约束,例如硬约束、中等约束和软约束。
这些约束定义了规划问题的得分计算(AKA适应度函数)。规划问题的每个解决方案都可以用分数进行评分。使用 OptaPlanner,分数约束是用面向对象的语言编写的,例如 Java TM代码。这样的代码简单、灵活且可扩展。
2.3. 规划问题具有巨大的搜索空间
一个规划问题有许多解决方案。解决方案有几类:
-
一个可能的解决方案是任何解决方案,无论它是否打破任何数量的约束。规划问题往往有大量可能的解决方案。其中许多解决方案毫无价值。
-
可行的解决方案是不破坏任何(负)硬约束的解决方案。可行解的数量往往与可能解的数量相关。有时没有可行的解决方案。每个可行的解决方案都是可能的解决方案。
-
最优解是得分最高的解。规划问题往往有 1 个或几个最优解。始终存在至少 1 个最优解,即使在没有可行解且最优解不可行的情况下也是如此。
-
找到的最佳解决方案是实现在给定时间内找到的得分最高的解决方案。找到的最佳解决方案很可能是可行的,并且只要有足够的时间,它就是一个最佳解决方案。
与直觉相反,可能的解决方案数量巨大(如果计算正确),即使数据集很小。正如您在示例中看到的那样,大多数实例比已知宇宙中的最小原子数 (10^80) 有更多可能的解决方案。因为没有找到最佳解决方案的灵丹妙药,所以任何实施都被迫评估所有这些可能解决方案的至少一个子集。
OptaPlanner 支持多种优化算法,可以有效地处理大量可能的解决方案。根据用例的不同,一些优化算法的性能优于其他算法,但无法提前判断。使用 OptaPlanner,只需几行 XML 或代码更改求解器配置,即可轻松切换优化算法。
三、要求
OptaPlanner 是开源软件,在Apache License 2.0下发布。该许可证非常自由,允许出于商业目的重复使用。阅读外行的解释。
OptaPlanner 是 100% 纯 Java TM并在 Java 11 或更高版本上运行。它很容易与其他 Java TM技术集成。OptaPlanner 在Maven 中央存储库中可用。
OptaPlanner 适用于任何 Java 虚拟机,并且与主要的 JVM 语言和所有主要平台兼容。

兼容性
4. 治理
4.1。OptaPlanner 的状态
OptaPlanner 稳定、可靠且可扩展。它已经通过单元测试、集成测试和压力测试进行了大量测试,并在全球范围内用于生产。一个示例处理超过 50 000 个变量,每个变量有 5000 个变量,多种约束类型和数十亿个可能的约束匹配。
4.2. 发行说明
我们每个月发布。在我们的网站上阅读每个版本的发行说明。
4.3. 向后兼容性
OptaPlanner 将其 API 和实现分开:
-
公共 API:包命名空间org.optaplanner.core.api、org.optaplanner.benchmark.api、org.optaplanner.test.api和org.optaplanner.persistence 中的所有类…api在未来版本中 100%向后兼容(特别是次要版本和修补程序版本)。在极少数情况下,如果主要版本号发生变化,一些特定的类可能会有一些向后不兼容的变化,但这些会在升级配方中清楚地记录。
-
XML 配置:XML 求解器配置向后兼容所有元素,但需要使用非公共 API 类的元素除外。XML 求解器配置由包命名空间org.optaplanner.core.config和org.optaplanner.benchmark.config中的类定义。
-
实现类:所有其他类不向后兼容。它们将在未来的主要或次要版本中发生变化(但可能不会在修补程序版本中)。升级秘诀描述了每一个这样的相关变化,以及在升级到新版本时如何快速处理它。
该文档也涵盖了一些
impl类。那些记录在案impl的类是可靠且安全的(除非在本文档中明确标记为实验性的),但我们还不能完全适应将它们的签名写在石头上。4.4. 社区和支持
欢迎在这里公开提问。欢迎在我们的问题跟踪器中提出错误和功能请求。在 GitHub 上非常欢迎拉取请求并获得优先处理!通过开源您的改进,您将受益于我们的同行评审以及我们在您的改进基础上所做的改进。
红帽通过雇佣核心团队来赞助 OptaPlanner 的开发。对于企业支持和咨询,请查看这些服务。
4.5. 与 KIE 的关系
OptaPlanner 是KIE 项目组的一部分。它定期(通常每 3 周)一起发布。
5. 下载并运行示例
5.1。获取发布 ZIP 并运行示例
立即尝试:
-
1.从OptaPlanner 网站下载 OptaPlanner 的发布 zip并解压缩。
-
2.打开目录示例并运行脚本。Linux 或 Mac:$ cd examples$ ./runExamples.sh视窗:$ cd examples$ runExamples.bat

分发邮编
示例 GUI 应用程序将打开。选择一个例子来试试:
Could not load image
plannerExamplesAppScreenshot
Text
OptaPlanner 本身没有 GUI 依赖项。它在服务器或移动 JVM 上的运行与在桌面上一样好。
5.2. 在 IDE(IntelliJ、Eclipse、VSCode)中运行示例
要在您最喜欢的 IDE 中运行示例:
-
在 IntelliJ IDEA、VSCode 或非香草 Eclipse 中:
-
1.打开文件examples/sources/pom.xml作为一个新项目,maven 集成将负责其余的工作。
-
2.运行项目中的示例。
-
在 vanilla Eclipse(缺少 M2Eclipse 插件)中:
-
1.为目录examples/sources打开一个新项目。
-
2.将所有 jar 从目录二进制文件和目录examples/binaries添加到类路径,文件examples/binaries/optaplanner-examples-*.jar除外。
-
3.添加 Java 源目录src/main/java和 Java 资源目录src/main/resources。
-
4.创建运行配置:
-
主类:
org.optaplanner.examples.app.OptaPlannerExamplesApp -
虚拟机参数(可选):
-Xmx512M -server -
1.要直接运行特定示例并跳过示例选择窗口,请运行其
App类(例如CloudBalancingApp)而不是OptaPlannerExamplesApp. -
5.运行该运行配置。
5.3. 将 OptaPlanner 与 Maven、Gradle 或 ANT 一起使用
OptaPlanner jar 在中央 maven 存储库中可用(以及JBoss maven 存储库 中的快照)。
如果您使用 Maven,请
optaplanner-core在您的pom.xml: <dependency>
<groupId>org.optaplanner</groupId>
<artifactId>optaplanner-core</artifactId>
<version>...</version>
</dependency>
或者更好的是,在以后添加其他 optaplanner 依赖项时导入
optaplanner-bomindependencyManagement以避免重复版本号:<project>
...
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.optaplanner</groupId>
<artifactId>optaplanner-bom</artifactId>
<type>pom</type>
<version>...</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.optaplanner</groupId>
<artifactId>optaplanner-core</artifactId>
</dependency>
<dependency>
<groupId>org.optaplanner</groupId>
<artifactId>optaplanner-persistence-jpa</artifactId>
</dependency>
...
</dependencies>
</project>
如果您使用 Gradle,请
optaplanner-core在您的build.gradle:dependencies {
implementation 'org.optaplanner:optaplanner-core:...'
}
如果您仍在使用 ANT,请从类路径中的下载 zip
binaries目录中复制所有 jar。下载 zip 的目录包含的 jar 比实际使用的
binaries要多得多。optaplanner-core它还包含其他模块使用的 jar,例如optaplanner-benchmark.检查 maven 存储库pom.xml文件以确定optaplanner-core等的最小依赖集。5.4. 从源代码构建 OptaPlanner
先决条件

浙公网安备 33010602011771号