Red Hat Business Optimizer 向けの配送経路プランニングスターターアプリケーションのデプロイおよび使用

Red Hat Decision Manager 7.8

ガイド

概要

本ドキュメントは、Red Hat Business Optimizer 向けの OptaWeb 配送経路スターターアプリケーションの使用方法を説明します。

前書き

開発者は、OptaWeb 配送経路スターターアプリケーションを使用して、車両での配送を最適化できます。

前提条件

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

第1章 OptaWeb 配送経路

多くのビジネスは、各種貨物を輸送することを主な目的としています。これらのビジネスでは積荷の地点から目的地まで貨物を運送し、最も効率的な方法で車両を使用することを目指しています。主な目的の 1 つは、時間または距離のいずれかで測定される通過コストを最小限に抑えることです。

この種類の最適化問題は、運搬経路問題 (VRP: Vehicle Routing Problem) と呼ばれており、さまざまなバリエーションがあります。

Red Hat Business Optimizer は、配送経路のバリエーションを多数解決して、ソリューションの例を提供します。Red Hat Business Optimizer を使用すると、開発者は 制約プログラミング 理論を学習するのではなく、ビジネスルールや要件のモデル化に焦点を当てることができます。OptaWeb 配送経路では、以下のような質問に解答する参照実装を提供することで Red Hat Business Optimizer の配送経路機能を拡張します。

  • 距離と移動時間はどこから取得しますか ?
  • ソリューションをマップ上で視覚化するにはどうすればよいですか ?
  • クラウドで実行するアプリケーションを構築するにはどうすればよいですか ?

OptaWeb 配送経路は OpenStreetMap (OSM) データファイルを使用します。OpenStreetMap の詳細は、OpenStreetMap の Web サイトを参照してください。

OptaWeb 配送経路を使用する場合は、次の定義を使用してください。

地域: OSM ファイルで表現される、地球上の地図の任意エリア。地域は、国、都市、大陸、頻繁にまとめて使用される複数の国などです。たとえば、DACH の地域にはドイツ (DE)、オーストリア (AT)、およびスイス (CH) が含まれます。

国コード: ISO-3166 標準により割り当てられた 2 文字のコード。国コードを使用して地理検索の結果を絞り込みます。複数の国にまたがる地域 (例: DACH 地域) を使用する場合があるため、OptaWeb 配送経路はこのような地域で地理検索の絞り込みができるように、国コードの一覧も使用できます。国コードの一覧については、ISO 3166 Country Codes を参照してください。

地理検索: 検索キーワードとして地域の住所や場所名を指定して、GPS の場所番号を結果として受け取るクエリーの種類。検索キーワードの一意性により、返される場所の数は異なります。大抵の場合、場所の名前は一意ではないため、作業地域の (複数の) 国の場所だけを含めることで、関連のない結果を除外します。

第2章 OptaWeb 配送経路デプロイメントファイルのダウンロードおよびビルド

デプロイメントファイルをダウンロードし、準備してから、OptaWeb 配送経路の構築、デプロイを行う必要があります。

手順

  1. Red Hat カスタマーポータルの Software Downloads ページに移動し (ログインが必要)、ドロップダウンオプションから選択およびバージョンを選択します。

    • 製品: Red Hat Decision Manager
    • バージョン: 7.8
  2. Red Hat Decision Manager 7.8 参照実装 (rhdm-7.8.0-reference-implementation.zip) をダウンロードします。
  3. Red Hat Decision Manager 7.8 Maven リポジトリー (rhdm-7.8.0-maven-repository.zip) をダウンロードします。
  4. rhdm-7.8.0-maven-repository.zip ファイルを展開します。
  5. rhdm-7.8.0-maven-repository/maven-repository サブディレクトリーのコンテンツを ~/.m2/repository ディレクトリーにコピーします。
  6. rhdm-7.8.0-reference-implementation.zip ファイルを展開します。このアーカイブには、参照実装の ZIP ファイルが 3 つ含まれます。
  7. rhdm-7.8.0-optaweb-vehicle-routing.zip ファイルを展開します。
  8. optaweb-vehicle-routing-distribution-7.39.0.Final-redhat-00005/sources ディレクトリーに移動します。
  9. 以下のコマンドを入力して OptaWeb 配送経路をビルドします。

    mvn clean package -DskipTests

第3章 runLocally.sh スクリプトを使用してローカルで OptaWeb 配送経路を実行します。

Linux を使用する場合は、runLocally.sh の Bash スクリプトを使用して OptaWeb 配送経路を実行できます。

注記

runLocally.sh スクリプトは、MacOS では実行されません。runLocally.sh スクリプトを使用できない場合は、4章OptaWeb 配送経路の手動での設定および実行 を参照してください。

runLocally.sh スクリプトは、以下の設定手順を自動化しますが、このスクリプトを使用しない場合は、この設定を手動で実行する必要があります。

  • データディレクトリーを作成します。
  • Geofabrik から選択した OpenStreetMap (OSM) ファイルをダウンロードします。
  • ダウンロードした各 OSM ファイルに国コードを自動的に関連付けてみます。
  • スタンドアロン JAR ファイルが存在しない場合は、プロジェクトをビルドします。
  • OptaWeb 配送経路を起動するには、地域の引数を 1 つ指定するか、対話的に地域を選択します。

runLocally.sh スクリプトの実行に関する説明は、以下のセクションを参照してください。

3.1. クイックスタートモードで OptaWeb 配送経路の runLocally.sh スクリプトを実行します。

最も簡単な方法で OptaWeb 配送経路を使い始めるには、引数を指定せずに runLocally.sh スクリプトを実行します。

前提条件

手順

  1. optaweb-vehicle-routing-distribution-7.39.0.Final-redhat-00005/sources ディレクトリーで以下のコマンドを入力します。

     ./runLocally.sh
  2. .optaweb-vehicle-routing ディレクトリーを作成するようにプロンプトが表示されたら、y と入力します。スクリプトの初回実行時に、このディレクトリーを作成するようにプロンプトが表示されます。
  3. OSM ファイルのダウンロードのプロンプトが表示された場合は、y と入力します。このスクリプトの初回実行時に、OptaWeb 配送経路が Belgium OSM ファイルをダウンロードします。

    アプリケーションは、OSM ファイルのダウンロード後に起動します。

  4. OptaWeb 配送経路のユーザーインターフェイスを表示するには、Web ブラウザーに以下の URL を入力します。

    http://localhost:8080
注記

このスクリプトを初回実行する場合は、GraphHopper で OSM ファイルをインポートして道路網のグラフとして保存する必要があるため、起動に数分かかります。次回から runlocally.sh スクリプトを実行する場合、読み込み時間ははるかに短縮されます。

3.2. OptaWeb 配送経路の runLocally.sh スクリプトを対話モードで実行

対話モードを使用して、ダウンロードした OSM ファイルと、各地域に割り当てられた国コードの一覧を表示します。対話モードを使用すると、Web サイトに移動してダウンロード先を選択せずに Geofabrik から追加の OSM ファイルをダウンロードできます。

前提条件

手順

  1. optaweb-vehicle-routing-distribution-7.39.0.Final-redhat-00005/sources のディレクトリーに移動します。
  2. 以下のコマンドを入力して対話モードでスクリプトを実行します。

    ./runLocally.sh -i
  3. Your choice のプロンプトで、d を入力してダウンロードメニューを表示します。以前にダウンロードした地域の一覧と、その後にダウンロード可能な地域の一覧が表示されます。
  4. 任意: 以前にダウンロードした地域の一覧から地域を選択します。

    1. ダウンロードした地域の一覧で地域に関連付けられた番号を入力します。
    2. Enter キーを押します。
  5. 任意: 地域をダウンロードします。

    1. ダウンロードする地域に関連付けられている番号を入力します。たとえば、ヨーロッパの地図を選択するには、5 と入力します。
    2. 地図をダウンロードするには、d と入力して、Enter キーを押します。
    3. 地図内の特定の地域をダウンロードするには、e と入力して、ダウンロードする地域に関連付けられている番号を入力して、Enter キーを押します。

      サイズの大きい OSM ファイルの使用

      欧州の個々の国や、アメリカの州など、小さい地域を使用すると、最適なユーザーエクスペリエンスが得られます。1 GB 以上の OSM ファイルを使用するには、かなりのメモリーサイズを必要とし、初期処理に時間がかかります (最大では数時間)。

      アプリケーションは、OSM ファイルのダウンロード後に起動します。

  6. OptaWeb 配送経路のユーザーインターフェイスを表示するには、Web ブラウザーに以下の URL を入力します。

    http://localhost:8080

3.3. OptaWeb 配送経路の runLocally.sh スクリプトを非対話モードで実行

非対話モードで OptaWeb 配送経路を使用して、コマンド 1 つで OptaWeb 配送経路を起動し、先ほどダウンロードした OSM ファイルを追加します。これは、地域間を素早く切り替える場合や、デモを行う場合に便利です。

前提条件

手順

  1. optaweb-vehicle-routing-distribution-7.39.0.Final-redhat-00005/sources のディレクトリーに移動します。
  2. 以下のコマンドを実行します。ここでは、<OSM_FILE_NAME> は先ほどダウンロードした OSM ファイルに置き換えます。

    ./runLocally.sh <OSM_FILE_NAME>

3.4. OptaWeb 配送経路の runLocally.sh スクリプトの空中距離モード実行

OptaWeb 配送経路は、空中距離モードで使用できます。このモードは、2 つの座標間の距離をもとに、移動時間を計算します。OptaWeb 配送経路をできるだけ早く稼働し、OSM (OpenStreetMap) ファイルを使用しない場合はこのモードを使用してください。空中距離モードは、OptaWeb 配送経路をスモークテストする必要がある場合や、正確な移動時間が必要ない場合にだけ便利です。

前提条件

手順

  1. optaweb-vehicle-routing-distribution-7.39.0.Final-redhat-00005/sources のディレクトリーに移動します。
  2. --air 引数を指定して runLocally.sh スクリプトを実行し、空中距離モードで OptaWeb 配送経路を起動します。

    ./runLocally.sh --air

3.5. データディレクトリーの更新

別のデータディレクトリーを使用する場合は、OptaWeb 配送経路が使用するディレクトリーとは異なるデータディレクトリーに更新できます。デフォルトのデータディレクトリーは $HOME/.optaweb-vehicle-routing です。

前提条件

手順

  • 別のデータディレクトリーを使用するには、現在のデータディレクトリーに、.DATA_DIR_LAST への絶対パスを指定します。
  • 地域に関連付けられている国コードを変更するには、現在のデータディレクトリーの country_codes ディレクトリーにある対応のファイルを編集します。

    たとえば、スコットランドの OSM ファイルをダウンロードし、スクリプトで国コードを推測できなかった場合に、country_codes/scotland-latest のコンテンツを GB に設定します。

  • リージョンを削除するには、データディレクトリーの openstreetmap ディレクトリーにある対応の OSM ファイルを削除し、graphhopper ディレクトリーで地域のディレクトリーを削除します。

第4章 OptaWeb 配送経路の手動での設定および実行

OptaWeb 配送経路を最も簡単な方法で実行するには、runlocally.sh スクリプトを使用します。ただし、お使いのシステムでバッシュを利用できない場合は、runlocally.sh スクリプトが実行する手順を手動で完了してください。

前提条件

手順

  1. 経路データをダウンロードします。

    経路エンジンでは、車両が場所間の移動にかかる時間を計算するのに地理データが必要です。ローカルのファイルシステムに OpenStreetMap (OSM) データファイルをダウンロードして保存してから、OptaWeb 配送経路を実行する必要があります。

    注記

    OSM データファイルのサイズは通常 100 MB から 1 GB の間となり、ダウンロードに時間がかかるため、OptaWeb 配送経路アプリケーションをビルドまたは起動する前にこれらのファイルをダウンロードすることをお勧めします。

    1. Web ブラウザーで http://download.geofabrik.de/ を開きます。
    2. Sub Region リストで地域 (ヨーロッパ など) をクリックします。サブ地域ページが開きます。
    3. Sub Regions の表で、国 (ベルギーなど) の OSM ファイル (.osm.pbf) をダウンロードします。
  2. データのディレクトリー構造を作成します。

    OptaWeb 配送経路では、ファイルシステム上の複数の種類のデータを読み取り、書き込みます。openstreetmap ディレクトリーから OSM (OpenStreetMap) ファイルを読み取り、道路網グラフを graphhopper ディレクトリーに書き込み、db ディレクトリーでユーザーデータを永続化します。このデータをすべて格納する専用のディレクトリーを新たに作成して、今後簡単に新しいバージョンの OptaWeb 配送経路にアップグレードして、以前に作成したデータをそのまま使用できるようにします。

    1. $HOME/{VRP-DATA-DIR} ディレクトリーを作成します。
    2. $HOME/{VRP-DATA-DIR} ディレクトリーに openstreetmap ディレクトリーを作成します。

      $HOME/{VRP-DATA-DIR}
      └── openstreetmap
    3. ダウンロードした OSM ファイル (.osm.pbf の拡張子が付いたファイル) をすべて openstreetmap ディレクトリーに移動します。

      残りのディレクトリー構造は、OptaWeb 配送経路アプリケーションにより、初回実行時に作成されます。作成後のディレクトリー構造は以下のとおりです。

      $HOME/{VRP-DATA-DIR}
      
      ├── db
      │   └── vrp.mv.db
      ├── graphhopper
      │   └── belgium-latest
      └── openstreetmap
          └── belgium-latest.osm.pbf
  3. optaweb-vehicle-routing-distribution-7.39.0.Final-redhat-00005/sources/optaweb-vehicle-routing-standalone/target のディレクトリーに移動します。
  4. OptaWeb 配送経路を実行するには、以下のコマンドを実行します。

    java -jar optaweb-vehicle-routing-standalone-7.39.0.Final-redhat-00005.jar \
    --app.persistence.h2-dir=$HOME/{VRP-DATA-DIR}/db \
    --app.routing.gh-dir=$HOME/{VRP-DATA-DIR}/graphhopper \
    --app.routing.osm-dir=$HOME/{VRP-DATA-DIR}/openstreetmap \
    --app.routing.osm-file=<OSM_FILE_NAME> \
    --app.region.country-codes=<COUNTRY_CODE_LIST> \

    このコマンドでは、以下の変数を置き換えてください。

    • <OSM_FILE_NAME>: 以前にダウンロードした地域で、使用予定の地域の OSM ファイル。
    • <COUNTRY_CODE_LIST>: 地理検索クエリーの絞り込みに使用するコンマ区切りの国コード一覧。国コードの一覧については、ISO 3166 Country Codes を参照してください。

      アプリケーションは、OSM ファイルのダウンロード後に起動します。

      以下の例では、OptaWeb 配送経路は中央アメリカの OSM の地図 (central-america-latest.osm.pbf) をダウンロードして、ベリーズ (BZ) とグアテマラ (GT) の国で検索を行います。

      java -jar optaweb-vehicle-routing-standalone-7.39.0.Final-redhat-00005.jar \
      --app.persistence.h2-dir=/home/user/.optaweb-vehicle-routing/db \
      --app.routing.osm-dir=/home/user/.optaweb-vehicle-routing/openstreetmap \
      --app.routing.gh-dir=/home/user/.optaweb-vehicle-routing/graphhopper \
      --app.routing.osm-file=central-america-latest.osm.pbf \
      --app.region.country-codes=BZ,GT
  5. OptaWeb 配送経路のユーザーインターフェイスを表示するには、Web ブラウザーに以下の URL を入力します。

    http://localhost:8080

第5章 Red Hat OpenShift Container Platform での OptaWeb 配送経路の実行

Linux を使用する場合には、Bash スクリプト runOnOpenShift.sh を使用して、Red Hat OpenShift Container Platform に OptaWeb 配送経路をインストールできます。

注記

MacOS では runOnOpenShift.sh スクリプトは実行されません。

前提条件

手順

  1. Red Hat OpenShift Container Platform クラスターにログインするか、このクラスターを起動します。
  1. 以下のコマンドを入力します。<PROJECT_NAME> は新規プロジェクト名に置き換えます。

    oc new-project <PROJECT_NAME>
  2. 必要に応じて optaweb-vehicle-routing-distribution-7.39.0.Final-redhat-00005/sources のディレクトリーに移動します。
  3. 以下のコマンドを入力して、runOnOpenShift.sh スクリプトを実行し、OpenStreetMap (OSM) ファイルをダウンロードします。

    ./runOnOpenShift.sh <OSM_FILE_NAME> <COUNTRY_CODE_LIST> <OSM_FILE_DOWNLOAD_URL>

    このコマンドでは、以下の変数を置き換えてください。

    • <OSM_FILE_NAME>: <OSM_FILE_DOWNLOAD_URL> からダウンロードしたファイルの名前。
    • <COUNTRY_CODE_LIST>: 地理検索クエリーの絞り込みに使用するコンマ区切りの国コード一覧。国コードの一覧については、ISO 3166 Country Codes を参照してください。
    • <OSM_FILE_DOWNLOAD_URL>: OpenShift からアクセス可能な、PBF 形式の OSM データの URL。このファイルは、バックエンドの起動中にダウンロードされ、/deployments/local/<OSM_FILE_NAME> として保存されます。

      以下の例では、OptaWeb 配送経路が地理検索結果をベルギーに絞り込み、Geofabrik から最新のベルギーの OSM 抽出ファイルをダウンロードします。

      以下の例では、OptaWeb 配送経路は中央アメリカの OSM の地図 (central-america-latest.osm.pbf) をダウンロードして、ベリーズ (BZ) とグアテマラ (GT) の国で検索を行います。

      ./runOnOpenShift.sh central-america-latest.osm.pbf BZ,GT http://download.geofabrik.de/europe/central-america-latest.osm.pbf
注記

runOnOpenShift.sh スクリプトのヘルプを参照するには、./runOnOpenShift.sh --help と入力します。

5.1. デプロイされた OptaWeb 配送経路アプリケーションをローカル変更で更新

Red Hat OpenShift Container Platform に OptaWeb 配送経路アプリケーションをデプロイした後に、バックエンドとフロントエンドを更新できます。

前提条件

  • OptaWeb 配送経路が Maven で正常にビルドされ、OpenShift にデプロイされている。

手順

  • バックエンドを更新するには、次の手順を実行します。

    1. ソースコードを変更し、Maven でバックエンドモジュールをビルドします。
    2. optaweb-vehicle-routing-distribution-7.39.0.Final-redhat-00005/sources/optaweb-vehicle-routing-backend のディレクトリーに移動します。
    3. 以下のコマンドを入力して、OpenShift ビルドを起動します。

      oc start-build backend --from-dir=. --follow
  • フロントエンドを更新するには、次の手順を実行します。

    1. ソースコードを変更して、npm ユーティリティーでフロントエンドモジュールをビルドします。
    2. sources/optaweb-vehicle-routing-frontend ディレクトリーに移動します。
    3. 以下のコマンドを入力して、OpenShift ビルドを起動します。

      oc start-build frontend --from-dir=docker --follow

第6章 OptaWeb 配送経路の使用

OptaWeb 配送経路アプリケーションでは、地図に場所の数をマークできます。最初の場所はデポ (配送拠点) であることを前提とします。車両はこのデポから、マークの付いた他のすべての場所に商品を配送する必要があります。

車両の数、および全車両の積載容量を設定できますが、経路では全車両を使用する保証はありません。ただし、そのルートがすべての車両に使用されるとは限りません。アプリケーションは、最適なルートに必要な数だけ車両を使用します。

現在のバージョンには、一定の制限があります。

  • 1 つの場所に配送するたびに、車両の積載量が 1 ポイント消費されます。たとえば、積載量 が 10 の車両は、デポに戻るまでに最大 10 箇所まで訪問できます。
  • 車両や場所にカスタム名を設定することはできません。

6.1. 経路の作成

最適な経路を作成するには、OptaWeb 配送経路ユーザーインターフェイスの Demo タブを使用します。

前提条件

  • OptaWeb 配送経路が実行されており、ユーザーインターフェイスにアクセスできる。

手順

  1. OptaWeb 配送経路では、Demo をクリックして Demo タブを開きます。
  2. 地図上の青いプラス/マイナスボタンを使用して車両数を設定します。デフォルトでは、車両ごとの積載量は 10 となっています。
  3. 必要に応じて、地図上の四角の中にあるプラスボタンを使用して、拡大します。

    注記

    地図の拡大にダブルクリックを使用しないでください。ダブルクリックすると、場所が作成されます。

  4. デポの場所をクリックします。
  5. 配送ポイントについては、地図の他の場所をクリックします。
  6. 場所を削除する場合:

    1. 削除する場所の上のマウスをかざして、場所の名前を表示します。
    2. 画面の左側にある一覧でその場所名を検索します。
    3. 名前の横にある X アイコンをクリックします。

場所を追加/削除したり、車両数を変更したりするたびに、アプリケーションは新しい最適経路を作成して表示します。そのソリューションで複数の車両を使用する場合、アプリケーションは、全車両の経路を別の色で表示します。

6.2. その他の情報の表示と設定

OptaWeb 配送経路の他のタブを使用し、追加の情報を表示して設定できます。

前提条件

  • OptaWeb 配送経路が実行されており、ユーザーインターフェイスにアクセスできる。

手順

  • Vehicles タブをクリックして、車両の表示、追加、削除や、全車両の積載量の設定が可能です。
  • Visits タブをクリックし、場所を表示して削除します。
  • Route タブをクリックして、各車両を選択して、選択した車両の経路を表示します。

6.3. OptaWeb 配送経路でのカスタムデータセットの作成

ベルギー内の複数の大都市を含むデモデータセットが組み込まれています。Load demo メニューで他のデモを利用する場合は、ご自身のデータセットを用意します。

手順

これには、以下の手順を実行します。

  1. OptaWeb 配送経路で、地図をクリックして地理検索を使用して、デポと、訪問数をクリックします。
  2. Export をクリックして、データセットディレクトリーにファイルを保存します。

    注記

    データセットディレクトリーは、app.demo.data-set-dir プロパティーで指定したディレクトリーです。

    アプリケーションが runLocally.sh スクリプト経由で実行されている場合は、データセットディレクトリーが $HOME/{VRP-DATA-DIR}/dataset に設定されます。

    それ以外の場合、プロパティーは application.properties から取得され、optaweb-vehicle-routing-distribution-7.39.0.Final-redhat-00001/sources/optaweb-vehicle-routing-standalone/target/local/dataset にデフォルト設定されます。

    app.demo.data-set-dir プロパティーを編集して、別のデータディレクトリーを指定できます。

  3. YAML ファイルを編集して、データセットの一意名を選択します。
  4. バックエンドを再起動します。

バックエンドを再起動した後に、Load demo メニューにデータセットディレクトリーのファイルが表示されます。

6.4. OptaWeb 配送経路のトラブルシューティング

OptaWeb 配送経路で予期せぬ動作をする場合は、以下の手順に従い、トラブルシューティングを行います。

前提条件

  • OptaWeb 配送経路は実行されるが、予期せぬ動作をする。

手順

  1. 問題を特定するには、バックエンドの端末出力ログを確認します。
  2. 問題を解決するには、バックエンドデータベースを削除します。

    1. バックエンドの端末ウィンドウで kbd:[Ctrl+C] を押して、バックエンドを停止します。
    2. optaweb-vehicle-routing/optaweb-vehicle-routing-backend/local/db ディレクトリーを削除します。
    3. OptaWeb 配送経路を再起動します。

第7章 OptaWeb 配送経路の開発ガイド

本セクションでは、開発モードでバックエンドモジュールおよびフロントエンドモジュールを設定して実行する方法を説明します。

7.1. OptaWeb 配送経路プロジェクトの構造

OptaWeb 配送経路プロジェクトは、マルチモジュールの Maven プロジェクトです。

図7.1 モジュール依存関係ツリーの図

バックエンドとフロントエンドモジュールは、モジュールツリーの一番下にあります。これらのモジュールには、アプリケーションのソースコードが含まれます。

スタンドアロンモジュールは、バックエンドとフロントエンドを 1 つの実行可能な JAR ファイルに統合するアセンブリーモジュールです。

ディストリビューションモジュールは、最終的なアセンブリーの手順を表します。このモジュールは、スタンドアロンアプリケーションと、ドキュメントを受けとり、配信しやすいようにアーカイブとしてラッピングします。

バックエンドとフロントエンドは、別にビルドとデプロイが可能な、別個のプロジェクトです。実際には、全く異なる言語で記述され、異なるツールでビルドされています。どちらのプロジェクトでも、コードの変更からアプリケーションの実行までの対応時間を短くし、最新の開発体験ができるようにするツールが含まれています。

次のセクションでは、バックエンドとフロントエンドのプロジェクトを開発モードで実行する方法を説明します。

7.2. OptaWeb 配送経路のバックエンドモジュール

バックエンドモジュールには、Red Hat Business Optimizer を使用して配送経路を最適化するサーバー側のアプリケーションが含まれています。最適化は CPU を集中的に使用する計算であり、最大限に能力を発揮するには I/O 操作を回避する必要があります。移動コスト (時間または距離) を最小限に抑えることが主な目的の 1 つであるため、OptaWeb 配送経路では RAM メモリーに移動コストの情報を保持します。Red Hat Business Optimizer は、解を出す時に、ユーザーが入力した全場所間の移動コストを把握しておく必要があります。この情報は、距離行列 と呼ばれる構造に保存されます。

新しい場所を入力すると、OptaWeb 配送経路は新しい場所と、それ以外でこれまでに入力されたすべての場所との間の移動コストを計算して、距離行列にその移動コストを保存します。移動コストの計算は、GraphHopper の経路エンジンで実行されます。

バックエンドモジュールは、以下のようなサポート機能を追加で実装します。

  • 永続性
  • フロントエンドの WebSocket 接続
  • データセットの読み込み、エクスポート、およびインポート

バックエンドコードのアーキテクチャーの詳細は、付録A バックエンドアーキテクチャー を参照してください。

次のセクションでは、開発モードでバックエンドを設定して実行する方法を説明します。

7.2.1. Spring Boot Maven プラグインを使用した OptaWeb 配送経路バックエンドモジュールの実行

Spring Boot プラグインを使用して、OptaWeb 配送経路バックエンドモジュールを開発モードで実行できます。

前提条件

手順

  1. optaweb-vehicle-routing-distribution-7.39.0.Final-redhat-00005/sources/optaweb-vehicle-routing-backend のディレクトリーに移動します。
  2. 開発モードでバックエンドを実行するには、次のコマンドを入力します。

    mvn spring-boot:run

7.2.2. IntelliJ IDEA からの OptaWeb 配送経路バックエンドモジュールの実行

IntelliJ IDEA を使用して OptaWeb 配送経路バックエンドモジュールを実行し、プロジェクトの開発を簡素化できます。

手順

  1. IntelliJ IDEA で org.optaweb.vehiclerouting.OptaWebVehicleRoutingApplication と入力します。これにより、実行設定が作成され、次の手順でこれを編集します。

    1. Editor ウィンドウで OptaWebVehicleRoutingApplication クラスを開きます。
    2. エディターウィンドウのガターで緑の記号をクリックして、Run OptaWebVehicleRoutingApplication を選択します。作業ディレクトリーがプロジェクトの root に設定されていて、このディレクトリーにはバックエンドモジュールが配置されている必要があるため実行に失敗します。

      注記

      IntelliJ IDEA でのアプリケーションの実行については、IntelliJ IDEA の Web サイトの Run Applications ページを参照してください。

  2. Run→Edit ConfigurationsSpring Boot→OptaWebVehicleRoutingApplication の順に選択します。
  3. Program arguments--spring.profiles.active=local に設定して、local と呼ばれる Spring プロファイルをアクティベートします。これで、アプリケーションに application-local.properties ファイルの設定を使用するように指示します。
  4. 作業ディレクトリー をバックエンドモジュール (optaweb-vehicle-routing-backend) に変更します。
  5. On Update actionHot swap classes and update trigger file if failed に設定します。これで Update アクションを使用し、アプリケーションをすぐに再起動できるようになります。

    詳細は、Spring and Spring Boot in IntelliJ IDEA 2018.1 を参照してください。

7.2.3. Spring Boot の自動再起動

Automatic restart は、Spring Boot DevTools で実行されます。Spring Boot Maven プラグインで OptaWeb 配送経路バックエンドを実行した場合は、クラスパスのファイルが変更されるたびに、アプリケーションが自動的に再起動されます。自動再起動では、クラスパスのファイルをスキャンするため、変更を再コンパイルするだけでアプリケーションの再起動をトリガーできます。IDE の設定は必要ありません。

IDE に保存時の自動コンパイル (compile-on-save) 機能がある場合 (Eclipse、NetBeans など) に、最後にコンパイルしてから変更が加えられたファイルのみを保存する必要があります。

IntelliJ IDEA では自動的に変更が保存されるため、Build[Recompile] (有効なタブのファイルを再コンパイル) または Build[Build Project] (すべての変更を再コンパイル) のいずれかを選択する必要があります。詳細は、Compile and build applications with IntelliJ IDEA を参照してください。

7.2.4. OptaWeb 配送経路バックエンドモジュールの設定プロパティーの設定

OptaWeb 配送経路バックエンドモジュールの設定プロパティーを設定する方法は複数あります。OptaWeb 配送経路をローカルで実行している場合に、このセクションで説明する方法が便利です。

前提条件

手順

  1. application.properties ファイルの設定プロパティーを設定します。
  2. rhdm-7.39.0.Final-redhat-00005-optaweb-vehicle-routing/sources/optaweb-vehicle-routing-backend/src/main/resources にディレクトリーを移動します。
  3. テキストエディターで application.properties ファイルを開きます。
  4. プロパティーを編集または追加して、ファイルを保存します。

    • パッケージアプリケーションの実行時にコマンドラインの引数を使用します。以下の例の <PROPERTY> はプロパティーの名前に、<VALUE> はそのプロパティーの値に置き換えます。

      java -jar optaweb-vehicle-routing-backend.jar --app.<PROPERTY>=<VALUE>
    • spring-boot:run でアプリケーションを実行する場合は環境変数を使用します。

      <PROPERTY>=<VALUE> ./mvnw spring-boot:run
      注記

      この方法では、relaxed binding が必要ですが、@ConfigurationProperties を使用してプロパティーが定義されている場合のみ機能します。

Spring Boot Maven プラグイン (./mvnw spring-boot:run -D<PROPERTY) を使用してアプリケーションを実行する時に -D を指定し、プロパティーを設定できません。これらのアプリケーションを実行するフォークされた Java プロセスに、プラグインでシステムプロパティーを設定する場合には、systemPropertiesVariables 属性を使用して、pom.xml ファイルに指定する必要があります。この属性の詳細は、Spring の Web サイトの Using System Properties を参照してください。

Spring Boot アプリケーションの設定の詳細は、Spring Boot Externalized Configuration ページを参照してください。

ヒント

src/main/resources/application-local.properties を使用して、Git の作業ツリーに影響を与えずに個人の設定を保存します。

OptaWeb 配送経路の設定プロパティーに関する完全一覧は、付録B OptaWeb 配送経路のバックエンド設定プロパティー を参照してください。

Spring Boot で利用可能なアプリケーションプロパティーの完全一覧は、Spring Web サイトの Common Application Properties ページを参照してください。

7.2.5. OptaWeb 配送経路のバックエンドログ

OptaWeb 配送経路は、SLF4J API と Logback をロギングフレームワークとして使用します。Spring 環境は、レベル、パターン、ログファイルなど、ロギングの大半の機能を他の設定プロパティーと同様に設定できます。ロギングプロパティーを設定する最も一般的な方法は、application.properties ファイルの編集、または <PROPERTY>=<VALUE> などの引数の使用することです。<PROPERTY> はプロパティーの名前で、<VALUE> はそのプロパティーの値です。詳細は、Spring Boot Logging のドキュメントを参照してください。

以下の例は、アプリケーションの一部のロギングレベルを制御するのに利用可能なプロパティーです。

  • logging.level.org.optaweb.vehiclerouting=debug: バックエンドコードのデバッグレベルを有効にします。
  • logging.level.org.optaplanner.core=warn: Red Hat Business Optimizer ロギングを減らします。
  • logging.level.org.springframework.web.socket=trace: WebSocket 接続での問題を調査するときに詳細にアクセスします。

7.3. OptaWeb 配送経路のフロントエンドモジュールの操作

フロントエンドのプロジェクトは、Create React App でブートストラップされました。Create React App には、開発や、実稼働環境でアプリケーションをビルドしやすくするためのスクリプトや依存関係が多数含まれています。

前提条件

手順

  1. Fedora で、次のコマンドを入力して開発環境を設定します。

    sudo dnf install npm

    npm のインストールの詳細については、Downloading and installing Node.js and npm を参照してください。

  2. optaweb-vehicle-routing-distribution-7.39.0.Final-redhat-00005/sources/optaweb-vehicle-routing-frontend のディレクトリーに移動します。
  3. npm の依存関係をインストールします。

    npm install

    Maven とは違い、npm パッケージマネージャーは、npm install を実行した場合にのみ、プロジェクトディレクトリーの node_modules に依存関係をインストールします。package.json にリストされている依存関係が変更されると、master ブランチに変更をプルした時点で、npm install を実行してから開発サーバーを実行する必要があります。

  4. 以下のコマンドを入力して、開発サーバーを実行します。

    npm start
  5. 自動的に表示されない場合には、Web ブラウザーで http://localhost:3000/ を開きます。

    デフォルトでは npm start コマンドは、デフォルトのブラウザーでこの URL を開こうとします。

    注記

    npm start コマンドで、実行するたびに新規ブラウザーのタブを開かないようにするには、BROWSER=none 環境変数をエクスポートします。.env.local ファイルを使用して、この設定を永続化します。これには、以下のコマンドを実行します。

    echo BROWSER=none >> .env.local

    ブラウザーは、フロントエンドのソースコードを変更するたびにページを更新します。端末で実行する開発サーバーのプロセスは、これらの変更を取得し、コンパイルエラーと lint エラーをコンソールに出力します。

  6. 以下のコマンドを入力して、テストを実行します。

    npm test
  7. REACT_APP_BACKEND_URL 環境変数の値を変更して、npm startnpm run build などの実行時に、npm が使用するバックエンドプロジェクトの場所を指定します。

    REACT_APP_BACKEND_URL=http://10.0.0.123:8081
    注記

    環境変数は、npm のビルドプロセス中は JavaScript バンドル内でハードコード化されるため、バックエンドの場所を指定してから、フロントエンドをビルドしてデプロイする必要があります。

    React 環境変数の詳細は、Adding Custom Environment Variables を参照してください。

  8. フロントエンドをビルドするには、以下のコマンドのいずれか 1 つを実行します。

    ./mvnw install
    mvn install

付録A バックエンドアーキテクチャー

ドメインモデルおよびユースケースは、アプリケーションには必要不可欠です。OptaWeb 配送経路ドメインモデルは、アーキテクチャーの中心にあり、その周りにユースケースを埋め込むアプリケーション層があります。経路最適化、距離計算、永続化、ネットワーク通信などの機能は実装の詳細とみなされ、アーキテクチャーの一番外側に配置されます。

図A.1 アプリケーション層の図

A.1. コードの編成

以前の図で示されるように、バックエンドコードは 3 つの層で整理されます。

org.optaweb.vehiclerouting
├── domain
├── plugin          # Infrastructure layer
│   ├── persistence
│   ├── planner
│   ├── routing
│   └── websocket
└── service         # Application layer
    ├── demo
    ├── distance
    ├── location
    ├── region
    ├── reload
    ├── route
    └── vehicle

service パッケージには、ユースケースを実装するアプリケーション層が含まれます。plugin パッケージにはインフラストラクチャー層が含まれます。

各層のコードは、さらに機能別に編成されます。つまり、各サービスまたはプラグインに独自のパッケージがあります。

A.2. 依存関係ルール

コンパイル時間の依存関係は、外層から中心に向けてのみ可能です。このルールに従うことで、ドメインモデルを、基盤となるフレームワークや、他の実装詳細から独立させ、ビジネスエンティティーの動作をより正確にモデル化できます。プレゼンテーションや永続性を周辺に押し出すことで、ビジネスエンティティーとユースケースの動作をより簡単にテストできます。

ドメインには依存関係はありません。

サービスはドメインにだけ依存します。サービスが (データベースまたはクライアントに) 結果を送信する必要がある場合には、出力境界インターフェイスを使用します。実装は、Inversion of Control (IoC) コンテナーが注入します。

プラグインは、2 つの方法でサービスに依存します。1 つ目は、ユーザー入力や最適化エンジンによる経路の更新など、イベントを基にサービスを呼び出します。サービスがプラグインに注入され、構築や依存関係の解決の負荷を IoC コンテナーに移動します。2 つ目は、プラグインがサービス出力境界インターフェイスを実装し、変更を永続化してデータベースに保存したり、応答を Web UI に送信したりなど、ユースケースの結果を処理します。

A.3. ドメインパッケージ

domain パッケージには、business objects が含まれており、LocationVehicleRoute など、このプロジェクトのドメインをモデル化します。このようなオブジェクトは完全にビジネス指向で、オブジェクトリレーションマッピングツールや Web サービスフレームワークなど、ツールやフレームワークの影響を受けないようにする必要があります。

A.4. サービスパッケージ

service パッケージには、ユースケース を実装するクラスが含まれます。ユースケースには、新しい場所の追加、車両の積載量の変更、住所の座標検索など、実行することを記述します。ユースケースを統括するビジネスルールは、ドメインオブジェクトを使用して表現します。

サービスは、永続性、Web、最適化など、外層のプラグインを操作する必要があります。層と層の間の依存関係ルールを満たすには、サービスの依存関係を定義するインターフェイスという観点で、サービスとプラグインの間のやり取りを表現します。プラグインは、サービスの境界インターフェイスを実装する Bean を指定して、サービスの依存関係を満たすことができます。Spring の IoC コンテナーは、プラグイン Bean のインスタンスを作成し、ランタイム時にサービスに注入します。これは、制御原理の反転例です。

A.5. プラグインパッケージ

plugin パッケージには、最適化、永続性、経路、ネットワーク通信などのインフラストラクチャー機能が含まれます。

付録B OptaWeb 配送経路のバックエンド設定プロパティー

以下の表に記載されている OptaWeb 配送経路アプリケーションプロパティーを設定できます。

プロパティータイプ説明

app.demo.data-set-dir

相対パスまたは絶対パス

/home/user/{VRP-DATA-DIR}/dataset

カスタムデータセットは、このディレクトリーから読み込まれます。デフォルトは、local/dataset です。

app.persistence.h2-dir

相対パスまたは絶対パス

/home/user/{VRP-DATA-DIR}/db

データベースファイルの保存に H2 が使用するディレクトリー。デフォルトは local/db です。

app.region.country-codes

ISO 3166-1 alpha-2 国コードの一覧

USGB,IE, DE,AT,CH。空白でも構いません。

地理検索結果を制限します。

app.routing.engine

列挙

air, graphhopper

経路エンジンの実装。デフォルトは graphhopper です。

app.routing.gh-dir

相対パスまたは絶対パス

/home/user/{VRP-DATA-DIR}/graphhopper

道路網グラフの保存に GraphHopper が使用するディレクトリー。デフォルトは local/graphhopper です。

app.routing.osm-dir

相対パスまたは絶対パス

/home/user/{VRP-DATA-DIR}/openstreetmap

OSM ファイルを含むディレクトリー。デフォルトは local/openstreetmap です。

app.routing.osm-file

ファイル名

belgium-latest.osm.pbf

GraphHopper が読み込む OSM ファイル名。ファイルは app.routing.osm-dir に配置する必要があります。

optaplanner.solver.termination.spent-limit

java.time.Duration

  • 1m
  • 150s
  • P2dT21h (PnDTnHnMn.nS)

場所の変更後にソルバーを実行する時間。

server.address

IP アドレスまたはホスト名

10.0.0.123, my-vrp.geo-1.openshiftapps.com

サーバーをバインドするネットワークアドレス。

server.port

ポート番号

4000, 8081

サーバーの HTTP ポート。

付録C バージョン情報

本書の最終更新日: 2022 年 3 月 8 日 (火)