結果の理由が分かるAIで計画最適化

初版: 2020/7/15
著者: 高久 隆史, 株式会社日立製作所

# はじめに
本稿では、結果の理由が分かるAIによる計画最適化を紹介します。

投稿一覧：
1. 結果の理由が分かるAIで計画最適化 (本投稿)
2. [結果の理由が分かるAIで計画最適化「活用イメージ」](https://qiita.com/t-takahisa/items/5ced5669c9b0564fdc01)

# 計画最適化の概要
計画最適化とは、限られたリソースの中で、守るべき制約や効率を考慮しながら、最も良い計画(組合せ計画)を立案することです。
対象となる業務には、人員のシフト計画、機器の検査計画、配送計画、セミナの時間割、在庫管理、積荷配置、金融ポートフォリオ最適化などがあります。

# AIによる計画最適化のメリット
計画最適化には様々な分野がありますが、大量の組合せから限られたリソースや個別の制約の中で最適な解を導出する難しい処理となり、人手で実現するには限界があります。
AIによる計画最適化では、次のような点を解決できます。
・計画立案の作業時間が大幅短縮できる
・多数の制約を考慮した、質の高い計画が実現できる
・属人化や不公平感を排除できる

# AIによる計画最適化の課題
熟練の計画立案者が時間をかけて実施している計画立案業務をAIで自動化する場合、次のような課題があります。
・多数の制約条件/評価指標に対する仕様の整理や実装に時間がかかる。
・ブラックボックスで結果の確認や説明が難しい。
・熟練の計画立案者が実施したとき以上の計画になっているかの確認が難しい。

# Red Hat Decision Managerによる計画最適化
[Red Hat Decision Manager](https://www.redhat.com/ja/technologies/jboss-middleware/decision-manager)を活用すると、上記のような課題も解決できます。
BRMS/ルールエンジンで有名な製品ですが、計画最適化の機能も提供されています。
本製品を活用した計画最適化の特長を次に示します。

## 特長1 ルールベースで楽々実装できる
計画最適化の仕様となる、様々な制約条件/評価指標を一つずつルールとして独立定義できるため、楽々実装できます。
制約条件/評価指標の全てを最初から正確に定義することは難しいですが、仕様が明確になった制約条件/評価指標から実装し、残りはTRY&ERRORで追加/調整する形で、仕様の明確化と実装を平行して短期間で開発できます。
実装方法や特長を次に示します。

・計画最適化の制約条件/評価指標は、それぞれ独立したルールとしてExcelで実装します。
　計画最適化の仕様を、絶対制約、考慮制約、評価指標に分類して定義し、絶対制約は必ず守りつつ、考慮制約の遵守度合いと評価指標が良くなるように最適化できます。
　絶対制約：必ず守りたい制約。
　考慮制約：可能な限り守りたい制約。
　評価指標：より良い組合せを算出するための指標。

**Excelルールの例**

| ルール名                                                     | レベル | 重み係数 |
| :----------------------------------------------------------- | :----- | :------- |
| 絶対制約#1_同一勤務時間帯の複数のシフト枠に同一従業員を割り当てない。 | Hard   | 1        |
| 考慮制約#1_勤務できる業務に従業員を割り当てる。              | Soft   | 1000     |
| 考慮制約#2_研修員と指導員は同一シフト枠に割り当てる。        | Soft   | 500      |
| 考慮制約#3_同時勤務除外メンバは、同一シフト枠に割り当てない。 | Soft   | 50       |
| 評価指標#1_前後の勤務時間帯の勤務場所を近くする。            | Soft   | 10       |
| 評価指標#2_作業平準化_担当回数を平均に近づける。             | Soft   | 1        |
| …                                                            |        |          |

・ルール間の優先度はレベル＋重み係数で定義し、結果はレベルごとのスコア値として評価します。
　高いレベルのスコア値(上の例だとHard)から順に評価され、高いレベルのスコア値が同じ場合は次のレベルのスコア値で評価される仕組みで、最もスコア値の良い組合せを最適解とします。

・ルールは外出しされたExcelファイルに定義し、いつでも変更できます。

・制約条件/評価指標の洗い出しが完了しなくても、明確になったものから先に実装し、後から残りを追加で実装できます。

・制約条件/評価指標の優先度が明確でなくても、調整しながら開発できます。(上の表のレベル、重み係数を調整していきます。)

・各ルールの動作は、ルールのExcelファイル内にDRLという専用言語のコードで定義します。
　定義後、DRL部分は、業務ユーザが必要な部分だけ参照/編集しやすいよう非表示にします(上の表は非表示後の例です)。
　DRLはJavaが分かる方ならすぐ習得できます。

・簡単なルール追加はExcel編集だけで対応できます。

```java:考慮制約#1のExcelルールのコード例
ShiftAssignment(employee != null, shift.skill != employee.skill)
```

・複雑な処理はJava側で記載し、Excel上のコードからJavaメソッドを呼び出します。

```java:絶対制約#1のExcelルールのコード例
ShiftAssignment(employee != null, $name : shift.name, $employee : employee, $shiftDateTime : shift.shiftDateTime)
ShiftAssignment(shift.name > $name, employee == $employee, shift.shiftDateTime.overlaps($shiftDateTime))
```

## 特長2 スコア情報出力で結果の理由が分かる
・最適化結果となる制約条件/評価指標の遵守度合いをスコア情報として出力できます。

**スコア情報の出力例**
![score_example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624448/5083a562-92b4-4b3a-7200-8850b1030785.png)

　・トータルスコア
　　全体でどのくらい制約条件/評価指標を遵守できているか(目標値に達しているか)。
　・ルール単位のスコア
　　どのルール(制約条件/評価指標)を違反しているか。各ルールをどのくらい遵守しているか。
　・各ルールの詳細スコア
　　詳細スコアの値は正しいか(期待通り動作しているか)。どのデータが違反しているか。
　　スコア=-(平均担当回数-担当回数)^2
　　A001：-(7-6)^2=-1 ⇒ 正しい
　　A002：-(7-9)^2=-4 ⇒ 正しい

・スコア情報により、期待通り動作しているか確認でき、品質も保証できます。

・守れなかった制約条件が分かるため、入力データや制約条件の見直しができます。

## 特長3 過去計画のスコアも出力して比較できる

・人手or他製品で計画した計画済データのスコア情報を出力して、旧計画と新計画のスコアを比較し、旧計画以上となっているか確認できます。

・計画済データのスコア情報は、通常の最適化計算用に作成した業務アプリケーション、Excelルールをほぼそのまま利用して簡単に出力できます。

**通常の最適化計算**
![normal_flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624448/e2ff2bbe-e665-5934-68b4-119b4bc16396.png)
**計画済データのスコア情報出力**
![planned_data_flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624448/202399f5-15b3-88e3-152b-1e79ca9dd5e9.png)

# おわりに
本稿では、結果の理由が分かるAIによる計画最適化を紹介しました。
AIはまだ難しい、信用できない、という方も活用を検討してみてはどうでしょうか。

第2回：[結果の理由が分かるAIで計画最適化「活用イメージ」](https://qiita.com/t-takahisa/items/5ced5669c9b0564fdc01)