第8章 Red Hat ビルドの Quarkus 上の Red Hat ビルドの OptaPlanner: 時間割のクイックスタートガイド

本書では、Red Hat ビルドの OptaPlanner の制約解決人工知能 (AI) を使用して Red Hat ビルドの Quarkus アプリケーションを作成するプロセスを説明します。学生および教師向けの時間割を最適化する REST アプリケーションを構築していきます。

timeTableAppScreenshot

サービスは、AI を使用して、以下のハードおよびソフトの スケジュール制約 に準拠し、Lesson インスタンスを Timeslot インスタンスと Room インスタンスに自動的に割り当てます。

  • 1 部屋に同時に割り当てることができる授業は、最大 1 コマです。
  • 教師が同時に一度に行うことができる授業は最大 1 回です。
  • 生徒は同時に出席できる授業は最大 1 コマです。
  • 教師は、1 つの部屋での授業を希望します。
  • 教師は、連続した授業を好み、授業間に時間が空くのを嫌います。

数学的に考えると、学校の時間割は NP 困難 の問題であります。つまり、スケーリングが困難です。総当たり攻撃で考えられる組み合わせを単純にすべて反復すると、スーパーコンピューターを使用したとしても、非自明的なデータセットを取得するのに数百年かかります。幸い、Red Hat ビルドの OptaPlanner などの AI 制約ソルバーには、妥当な時間内にほぼ最適なソリューションを提供する高度なアルゴリズムがあります。妥当な期間として考慮される内容は、問題の目的によって異なります。

前提条件

  • OpenJDK 11 以降がインストールされている。Red Hat ビルドの Open JDK は Red Hat カスマーポータル (ログインが必要) の ソフトウェアダウンロード ページから入手できます。
  • Apache Maven 3.6 以降がインストールされている。Maven は Apache Maven Project の Web サイトから入手できます。
  • IntelliJ IDEA、VSCode、Eclipse、NetBeans などの IDE が利用できる。

8.1. 時間割プロジェクトの作成

時間割プロジェクトでは、Apache Maven および Quarkus Maven プラグインを使用して、Red Hat ビルドの OptaPlanner および Quarkus アプリケーションの使用を開始できます。

注記

必要に応じて、7章OptaPlanner および Quarkus の使用ガイド の説明に従って、Quakus OptaPlanner プロジェクトを作成できます。

手順

  1. コマンドターミナルで以下のコマンドを入力し、Maven が JDK 11 を使用していること、そして Maven のバージョンが 3.6 以上であることを確認します。

    mvn --version
  2. 上記のコマンドで JDK 11 が返されない場合は、JDK 11 へのパスを PATH 環境変数に追加し、上記のコマンドを再度入力します。
  3. プロジェクトをビルドするには、以下のコマンドのいずれか 1 つを実行します。

    注記

    Apple macOS および Microsoft Windows は、実稼働環境ではサポートされません。

    • Linux または Apple macOS を使用している場合は、以下のコマンドを入力します。

      mvn io.quarkus:quarkus-maven-plugin:1.11.6.Final-redhat-00001:create \
          -DprojectGroupId=com.example \
          -DprojectArtifactId=optaplanner-quickstart  \
          -Dextensions="resteasy,resteasy-jackson,optaplanner-quarkus,optaplanner-quarkus-jackson" \
          -DplatformGroupId=com.redhat.quarkus \
          -DplatformVersion=1.11.6.Final-redhat-00001 \
          -DnoExamples

      このコマンドは、./optaplanner-quickstart ディレクトリーで以下の要素を作成します。

      • Maven の構造
      • src/main/dockerDockerfile ファイルの例
      • アプリケーションの設定ファイル

        表8.1 mvn io.quarkus:quarkus-maven-plugin:1.11.6.Final-redhat-00001:create コマンドで使用したプロパティー

        プロパティー説明

        projectGroupId

        プロジェクトのグループ ID。

        projectArtifactId

        プロジェクトのアーティファクト ID。

        extensions

        このプロジェクトで使用する Quarkus 拡張のコンマ区切りリスト。Quarkus 拡張の全一覧については、特定のコマンドラインで mvn quarkus:list-extensions を入力します。

        platformGroupId

        ターゲットプラットフォームのグループ ID。

        platformVersion

        プロジェクトで使用するプラットフォームのバージョン。

        noExamples

        テストまたはクラスを使用せずに、プロジェクト構造でプロジェクトを作成します。

        projectGroupID および projectArtifactID プロパティーの値を使用して、プロジェクトバージョンを生成します。デフォルトのプロジェクトバージョンは 1.0.0-SNAPSHOT です。platformGroupIdplatformVersion プロパティーの値は、プロジェクト依存関係の管理に quarkus-universe-bom が使用します。

  4. ディレクトリー構造が作成されたら、テキストエディターで optaplanner-quickstart/pom.xml ファイルを開き、ファイルの内容を確認して以下の要素が含まれていることを確認します。

    <properties>
    	...
    	<quarkus-plugin.version>1.11.6.Final-redhat-00001</quarkus-plugin.version>
    	<quarkus.platform.artifact-id>quarkus-universe-bom</quarkus.platform.artifact-id>
    	<quarkus.platform.group-id>com.redhat.quarkus</quarkus.platform.group-id>
    	<quarkus.platform.version>1.11.6.Final-redhat-00001.Final-redhat-00001</quarkus.platform.version>
      </properties>
      <dependencyManagement>
    	<dependencies>
      	<dependency>
        	<groupId>${quarkus.platform.group-id}</groupId>
        	<artifactId>${quarkus.platform.artifact-id}</artifactId>
        	<version>${quarkus.platform.version}</version>
        	<type>pom</type>
        	<scope>import</scope>
      	</dependency>
    	</dependencies>
      </dependencyManagement>
      <dependencies>
    	<dependency>
      	<groupId>org.optaplanner</groupId>
      	<artifactId>optaplanner-quarkus</artifactId>
    	</dependency>
    	<dependency>
      	<groupId>org.optaplanner</groupId>
      	<artifactId>optaplanner-quarkus-jackson</artifactId>
    	</dependency>
    	<dependency>
      	<groupId>io.quarkus</groupId>
      	<artifactId>quarkus-resteasy-jackson</artifactId>
    	</dependency>
    	<dependency>
      	<groupId>io.quarkus</groupId>
      	<artifactId>quarkus-resteasy</artifactId>
    	</dependency>
    	<dependency>
      	<groupId>io.quarkus</groupId>
      	<artifactId>quarkus-arc</artifactId>
    	</dependency>
    	<dependency>
      	<groupId>io.quarkus</groupId>
      	<artifactId>quarkus-junit5</artifactId>
      	<scope>test</scope>
    	</dependency>

    Quarkus BOM は pom.xml ファイルにインポートされます。そのため、pom.xml ファイルに個別の Quarkus 依存関係のバージョンを記述する必要はありません。

  5. pom.xml ファイルで、quarkus-resteasy の依存関係を確認します。この依存関係により、REST アプリケーションを開発できます。

        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-resteasy</artifactId>
        </dependency>