第 13 章 红帽构建的 OptaPlanner 和 Java:一个生态快速入门指南
本指南指导您了解通过 OptaPlanner 的约束解决 artificial 智能(AI)创建简单 Java 应用程序的过程。您将构建能为学生和老师优化学校的命令行应用程序:
... INFO Solving ended: time spent (5000), best score (0hard/9soft), ... INFO INFO | | Room A | Room B | Room C | INFO |------------|------------|------------|------------| INFO | MON 08:30 | English | Math | | INFO | | I. Jones | A. Turing | | INFO | | 9th grade | 10th grade | | INFO |------------|------------|------------|------------| INFO | MON 09:30 | History | Physics | | INFO | | I. Jones | M. Curie | | INFO | | 9th grade | 10th grade | | INFO |------------|------------|------------|------------| INFO | MON 10:30 | History | Physics | | INFO | | I. Jones | M. Curie | | INFO | | 10th grade | 9th grade | | INFO |------------|------------|------------|------------| ... INFO |------------|------------|------------|------------|
您的应用程序会自动将 Lesson
实例分配给 Timeslot
和 Room
实例,方法是使用 AI 遵循硬和软调度 限制,例如:
- 个空间最多可以同时有一处。
- 老师可以同时在上课时进行教学。
- 学员最多可以同时参加。
- 老师喜欢在同一房间教授所有课程。
- 指导者更倾向于在课间学习顺序课时和不类差距。
- 学员对相同主题的后续课类不同。
数学会上讲,该学校的时间范围是一个 NP-hard 问题。这意味着很难扩展。只需浏览所有可能的组合,需要数以百万计的、非内部的数据集,即使在超级计算机中也是如此。幸运的是,AI 约束解决诸如 OptaPlanner 等高级算法具有在合理的时间内提供最接近的解决方案。
先决条件
- 已安装了 OpenJDK(JDK)11。红帽构建的 Open JDK 可从红帽客户门户网站的 Software Downloads 页面获取(需要登录)。
- 已安装 Apache Maven 3.6 或更高版本。Maven 可以从 Apache Maven Project 网站获得。
- IDE,如 IntelliJ IDEA、VS Code 或 Eclipse
13.1. 创建 Maven 或 Gradle 构建文件并添加依赖项
您可以将 Maven 或 Gradle 用于 OptaPlanner unitable 应用程序。创建构建文件后,添加以下依赖项:
-
OptaPlanner-core
(编译范围)以解决 school timetable 问题 -
OptaPlanner-test
(测试 JUnit 范围)测试 schooltabling 约束 -
一个实现(如
logback-classic
(runtime 范围)来查看 OptaPlanner 采用的步骤
流程
- 创建 Maven 或 Gradle 构建文件。
将
optaplanner-core
、optaplanner-test
和logback-classic
依赖项添加到构建文件中:对于 Maven,在
pom.xml
文件中添加以下依赖项:<dependency> <groupId>org.optaplanner</groupId> <artifactId>optaplanner-core</artifactId> </dependency> <dependency> <groupId>org.optaplanner</groupId> <artifactId>optaplanner-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>
以下示例显示了完整的
pom.xml
文件。<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.acme</groupId> <artifactId>optaplanner-hello-world-school-timetabling-quickstart</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.release>11</maven.compiler.release> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <version.org.optaplanner>8.13.0.Final-redhat-00013</version.org.optaplanner> <version.org.logback>1.2.3</version.org.logback> <version.compiler.plugin>3.8.1</version.compiler.plugin> <version.surefire.plugin>3.0.0-M5</version.surefire.plugin> <version.exec.plugin>3.0.0</version.exec.plugin> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.optaplanner</groupId> <artifactId>optaplanner-bom</artifactId> <version>${version.org.optaplanner}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${version.org.logback}</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.optaplanner</groupId> <artifactId>optaplanner-core</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <scope>runtime</scope> </dependency> <!-- Testing --> <dependency> <groupId>org.optaplanner</groupId> <artifactId>optaplanner-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>${version.compiler.plugin}</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>${version.surefire.plugin}</version> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>${version.exec.plugin}</version> <configuration> <mainClass>org.acme.schooltimetabling.TimeTableApp</mainClass> </configuration> </plugin> </plugins> </build> <repositories> <repository> <id>jboss-public-repository-group</id> <url>https://repository.jboss.org/nexus/content/groups/public/</url> <releases> <!-- Get releases only from Maven Central which is faster. --> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </project>
对于 Gradle,请在
gradle.build
文件中添加以下依赖项:dependencies { implementation "org.optaplanner:optaplanner-core:${optaplannerVersion}" runtimeOnly "ch.qos.logback:logback-classic:${logbackVersion}" testImplementation "org.optaplanner:optaplanner-test:${optaplannerVersion}" }
以下示例显示了完成的
gradle.build
文件。plugins { id "java" id "application" } def optaplannerVersion = "{project-version}" def logbackVersion = "1.2.3" group = "org.acme" version = "0.1.0-SNAPSHOT" repositories { mavenCentral() } dependencies { implementation "org.optaplanner:optaplanner-core:${optaplannerVersion}" runtimeOnly "ch.qos.logback:logback-classic:${logbackVersion}" testImplementation "org.optaplanner:optaplanner-test:${optaplannerVersion}" } java { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } compileJava { options.encoding = "UTF-8" options.compilerArgs << "-parameters" } compileTestJava { options.encoding = "UTF-8" } application { mainClass = "org.acme.schooltimetabling.TimeTableApp" } test { // Log the test execution results. testLogging { events "passed", "skipped", "failed" } }