OptaPlanner介绍
1. 什么是OptaPlanner?
每个组织都面临着规划问题:在提供产品或服务时,资源有限(员工、资产、时间和金钱)。OptaPlanner优化了此类计划,以更少的资源开展更多的业务。 这被称为约束满足规划(它是运筹学学科的一部分)。
OptaPlanner是一个轻量级的、可嵌入的约束满足引擎,可以优化规划问题。它解决了以下用例:
- 员工轮班排班:时间表护士、修理工......
- 议程安排:安排会议、约会、维护工作、广告......
- 教育时间表:安排课程、课程、考试、会议演讲......
- 车辆路线:使用已知的地图工具规划车辆路线(卡车、火车、轮船、飞机等),以便通过多个目的地运送货物和/或乘客......
- 装箱包装:用物品填充集装箱、卡车、船舶和存储仓库,还可以跨计算机资源包装信息,如云计算......
- 作业车间调度:规划汽车装配线、机器队列规划、劳动力任务规划......
- 切割毛坯:在切割纸张、钢材、地毯等时最大限度地减少浪费。
- 运动日程安排:规划足球联赛、棒球联赛的比赛和训练时间表......
- 财务优化:投资组合优化、风险分散、...
2. 什么是规划问题?
规划问题有一个最优目标,它基于有限的资源和特定的约束。最佳目标可以是任意数量的东西,例如:
- 利润最大化 - 最佳目标带来尽可能高的利润。
- 最小化生态足迹 - 最佳目标对环境的影响最小。
- 最大限度地提高员工或客户的满意度 - 最佳目标优先考虑员工或客户的需求。
实现这些目标的能力取决于可用资源的数量,例如:
- 人数。
- 时间量。
- 预算。
- 实物资产,例如机械、车辆、计算机、建筑物等。
还必须考虑与这些资源相关的特定限制,例如一个人的工作小时数、他们使用某些机器的能力或设备之间的兼容性。
2.1. 规划问题是NP-complete或NP-hard
上面的所有用例可能都是 NP-complete/NP-hard,通俗地说,这意味着:
- 在合理的时间内验证问题的给定解决方案很容易。
- 在合理的时间内找到问题的最佳解决方案没有灵丹妙药。
这意味着:解决你的问题可能比你预期的要难,因为两种常见的技术是不够的:
- 蛮力算法(即使是更智能的变体)将花费太长时间。
- 一个快速的算法,例如在垃圾箱包装中,首先放入最大的物品,将返回一个远非最佳的解决方案。
通过使用先进的优化算法,OptaPlanner确实在合理的时间内为此类规划问题找到了近乎最优的解决方案。
2.2. 规划问题具有(硬性和软性)约束
通常,规划问题至少有两个级别的约束:
- 不得破坏硬约束。例如:一位老师不能同时教授 2 节不同的课程。
- 如果可以避免软约束,则不应破坏它。例如:教师 A 不喜欢在星期五下午教书。
有些问题也有积极的制约因素:
- 如果可能的话,应该满足的软约束(或奖励)。例如:B老师喜欢在星期一早上教书。
一些基本问题(如N个皇后)只有硬约束。 有些问题有三个或更多级别的约束,例如硬约束、中约束和软约束。
这些约束定义了计划问题的分数计算(又称适应度函数)。 规划问题的每个解决方案都可以用分数进行评分。使用 OptaPlanner,分数约束是用面向对象的语言(如 Java)编写. 这样的代码简单、灵活且可扩展。
2.3. 规划问题有巨大的搜索空间
规划问题有许多解决方案。 有几类解决方案:
- 一个可能的解决方案是任何解决方案,无论它是否打破了任意数量的约束。规划问题往往有大量可能的解决方案。其中许多解决方案毫无价值。
- 可行的解决方案是不打破任何(负面)硬约束的解决方案。可行解决方案的数量往往与可能解决方案的数量有关。有时没有可行的解决方案。每一个可行的解决方案都是一个可能的解决方案。
- 最佳解决方案是得分最高的解决方案。规划问题往往有 1 个或几个最佳解决方案。始终存在至少 1 个最优解决方案,即使在没有可行解决方案且最优解决方案不可行的情况下也是如此。
- 找到的最佳解决方案是实现在给定时间内找到的得分最高的解决方案。找到的最佳解决方案可能是可行的,并且如果有足够的时间,它就是最佳解决方案。
与直觉相反的是,即使数据集很小,可能的解决方案数量也很大(如果计算正确)。 正如你在例子中看到的,大多数实例的可能解比已知宇宙中的最小原子数(10^80)要多得多。由于没有找到最佳解决方案的灵丹妙药,因此任何实现都被迫评估所有这些可能解决方案的至少一个子集。
OptaPlanner 支持多种优化算法,以有效地处理大量可能的解决方案。 根据用例的不同,某些优化算法的性能优于其他算法,但无法提前判断。使用 OptaPlanner只需几行 XML 或代码即可轻松切换求解器配置,从而切换优化算法。
3. 要求
OptaPlanner 是开源软件,在 Apache 许可证 2.0 下发布。 该许可证非常自由,允许出于商业目的重复使用。 阅读外行的解释。
OptaPlanner 是 100% 纯 Java并在 Java 11 或更高版本上运行。 它很容易与其他 Java 集成技术。 OptaPlanner 在 Maven 中央存储库中可用。
OptaPlanner 适用于任何 Java 虚拟机,并与主要的 JVM 语言和所有主要平台兼容。
4. 下载并运行示例
4.1. 获取发布 ZIP 并运行示例
立即试用:
-
从 OptaPlanner 网站下载 OptaPlanner 的发布 zip 并解压缩。
-
打开目录示例并运行脚本。
Linux 或 Mac:
$ cd examples $ ./runExamples.shwindows:
$ cd examples $ runExamples.bat
将打开示例 GUI 应用程序。 选择一个示例来尝试一下:
4.2. 在 IDE 中运行示例
要在 IntelliJ IDEA、VSCode 或 Eclipse 中运行示例,请执行以下操作:
- 将文件 examples/sources/pom.xml 作为新项目打开,maven 集成将负责其余的工作。
- 运行项目中的示例。
4.3. 将 OptaPlanner 与 Maven、Gradle 配合使用
OptaPlanner jar 在中央 maven 存储库中可用(快照在 JBoss maven 存储库中可用)。
如果您使用 Maven,请在你的pom.xml引入 :optaplanner-core
<dependency>
<groupId>org.optaplanner</groupId>
<artifactId>optaplanner-core</artifactId>
<version>...</version>
</dependency>
或者
<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以下位置添加依赖项:optaplanner-core
dependencies {
implementation 'org.optaplanner:optaplanner-core:...'
}
4.4. 从源代码构建OptaPlanner
先决条件
从源代码生成并运行示例。
-
从 GitHub 克隆(或者,下载 zipball):
optaplanner$ git clone https://github.com/kiegroup/optaplanner.git ... -
使用 Maven 构建它:
$ cd optaplanner $ mvn clean install -DskipTests ... -
运行示例:
$ cd optaplanner-examples $ mvn exec:java ... -
在您喜欢的 IDE 中编辑源代码。