OptaPlanner Document 翻译(一)OptaPlanner introduction

281 阅读7分钟

OptaPlanner 介绍

1.什么是OptaPlanner?

每个组织都面临着规划问题:在有限和约束资源的情况下,提供产品或者服务。OptaPlanner就是用来在尽量小的资源提供更多服务的目标下,提供最优的规划。这就是“约束满足问题”(属于运筹学的一部分),可以用来解决类似以下的问题:

  • 员工排班
  • 会议排程
  • 教学时间安排
  • 行车路线规划
  • 装箱
  • 排产
  • 物资切分
  • 赛事安排
  • 金融投资优化

useCaseOverview

2.什么是规划问题

whatIsAPlanningProblem

一个规划问题有一个求得最优的目标,基于有限的资源,受到特定的条件限制。最优目标可以是以下:

  • 收益最大化
  • 生态足迹最小化
  • 客户或者员工满意度最大化

以上目标的达成依赖于一系列的资源,例如:

  • 人数
  • 总时间
  • 预算
  • 物理设备资产

依赖于以上资源的特定条件约束也必须被考虑在内。例如一个人可以工作的时长,他们使用设备机器的能力,或者机器设备的产能。

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语言,支持主流的平台。

compatibility

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

distributionZip

运行以上命令之后,样例程序会打开。选择一个样例并尝试:

plannerExamplesAppScreenshot

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对代码进行编辑