OptaPlanner 介绍
1.什么是OptaPlanner?
每个组织都面临着规划问题:在有限和约束资源的情况下,提供产品或者服务。OptaPlanner就是用来在尽量小的资源提供更多服务的目标下,提供最优的规划。这就是“约束满足问题”(属于运筹学的一部分),可以用来解决类似以下的问题:
- 员工排班
- 会议排程
- 教学时间安排
- 行车路线规划
- 装箱
- 排产
- 物资切分
- 赛事安排
- 金融投资优化
2.什么是规划问题
一个规划问题有一个求得最优的目标,基于有限的资源,受到特定的条件限制。最优目标可以是以下:
- 收益最大化
- 生态足迹最小化
- 客户或者员工满意度最大化
以上目标的达成依赖于一系列的资源,例如:
- 人数
- 总时间
- 预算
- 物理设备资产
依赖于以上资源的特定条件约束也必须被考虑在内。例如一个人可以工作的时长,他们使用设备机器的能力,或者机器设备的产能。
OptaPlanner能够帮助JAVA开发者有效地解决约束满足问题。进一步讲,它使用高效的评分机制整合了优化探索和优化启发。
2.1一个规划问题是NP完备或NP-Hard问题
以上所有的样例都是NP/NP-Hard问题,用外行的话说就是:
- 在有限的时间内很容易验证给定的规划方案
- 没有一个完美的方法能够在有限时间内找到最优的方案
这意味着一个非常残酷的现实:解决你的问题比你预期的要难很多,因为两个技术点无法满足:
- 一种强大的算法需要过长的时间
- 一个快速返回结果的算法,例如装箱时先装大箱子,最终得到的结果离最优相差很远
通过采用先进的最优寻解算法,OptaPlanner可以在可接受的时间范围内返回一个接近最优解的规划方案。
2.2一个规划问题有硬约束或软约束
一般来讲,一个规划问题有两种层次的约束:
- 一个负面的硬约束必须不能被破坏:一个老师不能同时教授两种课程。
- 一个负面的软约束如果能满足,最好不被破坏:老师不喜欢在周末授课。
一些规划问题有正面约束:
- 一个正面的约束(或奖励)在可能的情况下,应该尽可能的被满足:老师B喜欢在周一早上授课。
一些基础的问题只有硬约束。有限问题则有三个或者更多层次的约束,例如硬约束、中等约束和软约束。
这些约束定义了规划问题中的评分机制。每个规划问题的解决方案都可以被赋予一定的分值。在OptaPlanner中,分数的规则使用面向对象的语言进行定义,例如JAVA。这些代码是简单、流畅、并且可扩展的。
2.3一个规划问题具有巨大的搜索空间
一个规划问题具有很多解决方案。可以分为以下几类:
- 一个可能的解决方案:任何一个方案无论它是否破坏了任何约束都属于可能的解决方案。一个规划问题有巨量的可能的解决方案,这些方案大部分属于无价值的。
- 一个可行的解决方案:不破坏任何负面硬约束的解决方案。可行解决方案与可能的解决有关联,有时候可行的解决方案不存在。任何可行的解决方案本身就属于一个可能的解决方案。
- 一个最优的解决方案:在评分机制下,具有最高得分的就是最优解决方案。规划问题一般具有一到多个最优解决方案。任何情况下总有一个最优的解决方案,即使这个最优方案不是可行的解决方案,或者根本就没有可行的解决方案。
- 一个最佳的解决方案:可以在指定的时间内找到的最高得分的方案。最佳解决方案一般是一个可行方案,并且在给出足够时间情况下,是最优解决方案。
与直觉不同的是,即使面对很小的数据集,可能解决方案的数量是巨大的。大多数情况下可能的解决方案数量超出了宇宙中原子的数量。正因为没有银弹(没有完美的解决方案),所以任何实现都只能是对某些可能解决方案的评估。
OptaPlanner支持的多种最优算法能够高效的遍历以上海量的可能方案。基于具体的案例,某些最优算法可能会表现的优于其他算法,但我们无法提前预知。在OptaPlanner中,能够通过修改几行XML文件或者代码的方式,很方便的切换最优算法。
3.系统运行的必要条件
OptaPlanner是基于Apache2.0开源协议的开源软件,支持商用。
OptaPlanner是纯Java编写的,运行在Java 11及以上。可以与其他Java技术很好的融合。OptaPlanner支持Maven方式的集成。
OptaPlanner可以在任何Java虚拟机的平台上运行,支持主流的JVM语言,支持主流的平台。

4.项目管理
4.1OptaPlanner的状态
OptaPlanner是稳定的、可靠的、可扩展的。OP已经进行过大量的单元测试、集成测试、压力测试,并被世界各地的产品所使用。
4.2向后兼容性
OP将API和实现部分进行了分离:
- Public 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中定义。
- 实现类:其他所有的类都不是向后兼容的。他们一般会在版本升级中进行修改。每次会在版本更新说明中描述修改点及应对方法。
4.3社区和支持
略
4.4与KIE的关系
略
5.下载并运行examples
5.1获取发布版的zip压缩包并运行样例
1.从OP官网下载发布方的zip压缩包,并解压:www.optaplanner.org/
2.打开解压的目录中的examples并运行脚本
Linux 或 Mac:
cd examples
./runExamples.sh
Windows:
cd examples
runExamples.bat

运行以上命令之后,样例程序会打开。选择一个样例并尝试:
5.2在IDE中运行样例
-
在IntelliJ IDEA,VSCode 或 Eclipse(non-vanilla版本)中:
- 按照新建工程的模式打开examples/sources/pom.xml,Maven插件会自动安装对应的依赖
- 直接运行examples
-
在vanilla 版本 Eclipse中:
-
以examples/sources文件夹为基础打开一个新的项目
-
向classpath中添加binaries和examples/binaries中的所有jar包,排除examples/binaries/optaplanner-examples-*.jar
-
将src/main/java设置为source
-
将src/main/resources设置为resources
-
创建一个运行时配置:
- Main class:org.optaplanner.examples.app.OptaPlannerExamplesApp
- VM参数(可选): -Xmx512M -server
-
运行配置
-
5.3通过Maven、Gradle或ANT来使用OP
OP的所有jar包都可以在search.maven.org/search?q=or… 中找到,如果你使用了Maven插件,可以在pom.xml中添加以下依赖:
<dependency>
<groupId>org.optaplanner</groupId>
<artifactId>optaplanner-core</artifactId>
<version>...</version>
</dependency>
或者直接在dependencyManagement节点中引入optaplanner-bom,来避免重复的版本定义:
<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,则可以在build.gradle中添加以下依赖:
dependencies {
implementation 'org.optaplanner:optaplanner-core:...'
}
如果你使用的是ANT,则直接将所有的jar包copy到classpath中。
5.4直接从源码中编译运行
前提条件:
- 安装好Git
- 通过HTTPS或者SSH方式完成GitHub的鉴权
- 安装配置好Maven
从代码编译运行:
1.从GitHub上Clone 代码
$ git clone https://github.com/kiegroup/optaplanner.git
2.使用Maven进行构建
$ cd optaplanner
$ mvn clean install -DskipTests
3.直接运行样例
$ cd optaplanner-examples
$ mvn exec:java
4.使用你趁手的IDE对代码进行编辑