Watsonで建築計画を立てる!  Model Builderでカンタン最適化 

# はじめに
[Watsonで数独を解く! Decision Optimizerを使ってみた](https://qiita.com/makaishi2/items/d1cc9a3f49f640a3b649)
[Watsonで巡回セールスマン問題を解く](https://qiita.com/makaishi2/items/78570f9283c0bc6c7e6c)

に引き続きWatsonの新サービスDecision Optimaizer紹介の第三弾です。
前2回は、**Python API**を使うことでモデル定義を行いましたが、今回は新機能**Model Builder**の**Modeling Assitant**を使って、コーディングなしに簡単にモデル構築を行ってみます。

なお、これから紹介するシナリオは、[Decision Optimizeチュートリアル](https://dataplatform.cloud.ibm.com/docs/content/DO/DODS_Mdl_Assist/exhousebuild.html#cogusercase)を参考に、一部手順を修正したものとなります。

# 問題定義
家の建築プロジェクトを対象とします。このプロジェクトは下の表にあるような、計10のタスクから構成されます。それぞれの工程に必要な日数も表に記載があります。
また、次のような制約条件があります。

* 10個のタスクすべてを1回ずつ行う必要がある。
* 作業はJoe, Jim, Jackの3名で行う。
* 各タスクは1名の作業員でしか行えない。
* 作業員は同時に最大1つのタスクしか行えない。
* 該当タスクは、表の「前工程」が完了していないと着手できない。

|タスク名|(日本語訳)|所要日数|前工程|
|---|---|---|---|
|masonry|(基礎)|35||
|carpentry|(内装)|15|masonry|
|plumbing|(配管)|40|masonry|
|ceiling|(天井)|15|masonry|
|roofing|(屋根)|5|carpentry|
|painting|(塗装)|10|ceiling|
|windows|(窓)|5|roofing|
|facade|(外装)|10|roofing, plumbing|
|garden|(庭)|5|roofing, plumbing|
|moving|(引渡し)|5|windows,facade,garden,painting|

この制約条件を満たした上で、「**最短日数で建築を行うにはどうしたらいいか**」というのが、これから解く例題の問題設定となります。

# 事前準備
事前準備としてはWatson Studioの環境セットアップと、csVファイルのダウンロードが必要です。

前者については、下記リンク先に書いた手順をそのまま実施して下さい。オプション設定のうち、Watson Machine Learningとの関連づけも必要になるので、注意してください。

[無料でなんでも試せる! Watson Studioセットアップガイド](https://qiita.com/makaishi2/items/b666f847a98c2e42dfbb)

後者については、以下の2つのCSVファイルをダウンロードして下さい。

https://github.com/makaishi2/sample-data/raw/master/data/build_activities.csv
https://github.com/makaishi2/sample-data/raw/master/data/build_members.csv


# モデルの作成
それでは、実際のモデル作成を始めましょう。

![スクリーンショット 2019-09-25 11.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/296f5344-3c83-e389-c93a-35c301172e23.png)

最初に上のWatson Studioの管理画面から、画面上部の「**Add to project**」をクリックします。

![スクリーンショット 2019-09-25 11.20.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/395a8876-f0cc-049f-1b10-9f691e85ba7c.png)

上のようなメニューが出てくるので、一番下にある「**Decision Optimization**」を選択します。

![スクリーンショット 2019-09-25 11.21.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/5283735d-44c9-9e9b-b4ea-a8f74c116c83.png)

「**New Decision Optimization model**」のパネルが表示されるので、「**House Building**」など適当な名前を入力して、画面右下の「**Create**」ボタンをクリックします。
下のような**Model Builder**の初期画面が表示されるはずです。

![スクリーンショット 2019-09-25 11.21.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/5ff610b3-eac4-d4de-14d8-9808ef29c7ef.png)

# データの準備(Prepare data)
事前にダウンロードした2つのCSVファイルを上の赤枠の領域にdrag and dropします。

![スクリーンショット 2019-09-30 9.52.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/cfe788e5-8e3b-4385-74d7-3a71b5b15978.png)

``build_actibities.csv``と``build_members.csv``の2つのファイルにチェックをつけて、「**Import**」リンクをクリックします。

![スクリーンショット 2019-09-30 9.56.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/251dc729-9574-9ea7-8256-198971ef6def.png)


中央のプレビュー画面で取り込んだ2つのCSVファイルの内容を確認します。
``build_members``には3名の作業者のリストが、``build_activities``には、10個の作業タスクが、作業日数(**Durations in days**)と前提タスク(**Proceeding activities**)とともに入っていることがわかります。
これで、データ準備は完了です。次にモデル構築作業に入ります。
そのため、画面左側のメニューから「**Run model**」を選んで下さい。


![スクリーンショット 2019-09-25 12.53.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/b294e80e-bc81-1f31-068d-653633d5a5aa.png)

上の画面になったら、真ん中の「**Use modeling assistant**」を選択します。

![スクリーンショット 2019-09-25 12.54.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f293fe31-b9d1-2dde-3fef-d4cd77896f05.png)

上記の画面になったら、「**Scheduling**」を選択して下さい。

![スクリーンショット 2019-09-30 10.01.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f6f9db2e-c898-e078-40a9-1cd86ba8f816.png)

上の画面では、入力とするCSVファイルを指定します。
上の「**TASKS**」は``build_activities``を、下の「**RESOURCES**」は``build_members``を指定して下さい。

![スクリーンショット 2019-09-30 10.02.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/e7db86e9-be58-22cf-95ec-53a5fd408383.png)

上のダイアログが表示されたら、2箇所にチェックの付いた、デフォルトの状態で「**Continue**」とします。

![スクリーンショット 2019-09-30 10.02.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/c54dde64-2439-3ae0-f5fd-a49df1ebd3ce.png)

上の画面が表示されたら、「**Finish**」をクリックして下さい。

![スクリーンショット 2019-09-25 12.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/d6cf8929-54f8-aad3-95d5-309ece5722c2.png)

この画面が解説用のものなので、閉じるアイコンをクリックして閉じます。

# ルールの詳細定義

![スクリーンショット 2019-09-30 10.06.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/53365f23-61fb-759d-603d-c0ebec213310.png)

上のような画面が表示されるので、この画面でまた定義できていないルールの詳細を定義していきます。
まず、オレンジの線が出ている2箇所は、決めるべきことが未決定であることを示しているので、こちらを設定します。

上の「**must be defined**」のアンダーラインをクリックします。

![スクリーンショット 2019-09-30 10.07.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/5198940e-ab58-b25e-b584-a13261550e11.png)

このような画面が出てきます。それぞれのタスク遂行日数の情報をどこから取ってくるかを聞いているので「**Duraion in days**」を選択します。

次に「**a date and time**」のアンダーラインをクリックします。

![スクリーンショット 2019-09-25 20.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/dfa12f77-778e-312d-4008-d9320a5105fc.png)

ここで指定すべきことは、タスクの開始日です。例えば「2019/10/01」などと指定してEnterキーを押します。

![スクリーンショット 2019-09-30 10.09.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/838467de-5f7f-e888-0e53-955d2e45511f.png)

この段階で、画面は上のようになったはずです。必須入力のオレンジのラインは全部解決しましたが、まだ追加で設定すべき項目が2つあるので、それぞれについて説明します。

①時間の単位の指定については「**days**」を設定して下さい。

②ここのプラスアイコンをクリックして、先行タスクとの依存関係の制約を追加します。

![スクリーンショット 2019-09-30 10.14.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/dcaf18d3-6935-23e2-086c-886087237f60.png)

上の画面のように新しい制約が追加されるので、黄色のアンダーラインをクリックして、先行項目として「**Preceding activities**」を選択して下さい。

![スクリーンショット 2019-09-30 10.20.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/e2fe8b74-2488-53eb-d95c-e441b42fb706.png)


この段階で、モデルの制約は上の画面のようになっているはずです。
お疲れ様でした。これで必要な制約の設定はすべて完了したことになります。

# モデルの実行
上記の制約設定がすべて完了したら、画面右上の「**Run Model**」のボタンをクリックします。

![スクリーンショット 2019-09-25 21.06.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/b78fa3a7-990c-12d6-eb7d-3e2dcfec4d1b.png)

すると、上のような「Running Scenario 1」の画面に遷移します。

![スクリーンショット 2019-09-30 10.18.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/cece38c4-2adb-3762-5b71-991d3b0a0f57.png)

しばらく待っていると、上のように問題の解決結果(今回のケースでは90日)が表示されます。
また、詳細項目リストで、「誰がいつからどのタスクを実施するか」が規定されていることもわかります。

![スクリーンショット 2019-09-30 10.26.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/9b328adf-b714-7e3f-51c4-af259c72ff6c.png)

画面左下の「**Visualization**」、引き続いて「**Gantt**」をクリックすると、上の画面のようにガントチャートも表示可能です。

# スキルレベルも考慮した最適化
引き続き、``house_expertise.csv``も考慮した最適化計画を作ってみます。
(T.D.B)　　(後日追記予定)