皆さんこんにちは!この記事では、IBM BobとCPLEXを使って数理最適化計算で解を求める方法をご紹介したいと思います。
IBM Bobとは
IBM Bob は、開発者のパートナーとして、単にコードを書くだけでなく、要件定義から実装、テスト、デプロイまで、ソフトウェア開発ライフサイクル全体を効率化し、最適化するように設計された、AIファーストで設計された統合開発環境です。
オープンソースのAIソフトウェア・エンジニア・エージェントと、VS Code(Visual Studio Code)を拡張して、COBOLやPRGなどの基幹システム向け言語に対応し、セキュリティー、コンプライアンス、高品質を実現することができます。
CPLEXとは
CPLEX(IBM ILOG CPLEX)は、数理最適化(Optimization)を実現するソフトウェアであり、業務上のさまざまな制約条件のもとで最適な意思決定を支援します。
線形計画法(LP)、混合整数計画法(MIP)、二次計画法(QP)、制約プログラミング(CP)などの高度な最適化問題を高速に解くことができ、製造計画、サプライチェーン最適化、人員配置、物流ルート最適化、スケジューリングなど、幅広い業務領域で活用されています。
1. はじめに
はじめに当シナリオの説明をします。とある製造業の会社は3つの工場(川崎、熊谷、幕張)を持っており、製品を製造して供給することができます。この度5社の異なる顧客(A~E)から製品を納入して欲しいと依頼がありました。それぞれの顧客の需要量は以下になります。(CustomerRequiredQuantity.csv)
顧客の需要量
| 顧客 | 需要量(ユニット) |
|---|---|
| A | 50 |
| B | 80 |
| C | 60 |
| D | 70 |
| E | 40 |
工場が供給できる量には限りがあり、以下になっています。(FactoryProductionAmount.csv)
工場が供給できる量
| 工場 | 供給量(ユニット) |
|---|---|
| 川崎 | 120 |
| 熊谷 | 130 |
| 幕張 | 70 |
1ユニット当たりの輸送コスト(人件費、燃料費等を合計したユニット当たりのコスト)がわかっており、以下になっています。
(TransportationCosts.csv)
1ユニット当たりの輸送コスト
| 顧客 | 工場 | 1ユニット当たりの輸送コスト(円) |
|---|---|---|
| A | 川崎 | 3000 |
| A | 熊谷 | 5000 |
| A | 幕張 | 7000 |
| B | 川崎 | 2000 |
| B | 熊谷 | 6000 |
| B | 幕張 | 3000 |
| C | 川崎 | 4000 |
| C | 熊谷 | 5000 |
| C | 幕張 | 1000 |
| D | 川崎 | 5000 |
| D | 熊谷 | 3000 |
| D | 幕張 | 2000 |
| E | 川崎 | 8000 |
| E | 熊谷 | 2000 |
| E | 幕張 | 3000 |
以下の制約条件があります。
制約①
道路状況などの影響で、ルート(工場から顧客への配送ルート)ごとに輸送個数の上限があり、以下になっています。(RouteCapacity.csv)
ルートごとの輸送ユニット数上限
| 工場 | 顧客 | 輸送ユニット数上限 |
|---|---|---|
| 川崎 | A | 60 |
| 熊谷 | A | 60 |
| 幕張 | A | 30 |
| 川崎 | B | 90 |
| 熊谷 | B | 50 |
| 幕張 | B | 60 |
| 川崎 | C | 40 |
| 熊谷 | C | 40 |
| 幕張 | C | 70 |
| 川崎 | D | 50 |
| 熊谷 | D | 80 |
| 幕張 | D | 60 |
| 川崎 | E | 50 |
| 熊谷 | E | 50 |
| 幕張 | E | 40 |
制約②
輸送費、人件費のコストを増加させないために、各顧客は需要量のユニット数すべてを1工場からのみ調達する。
制約③
リードタイムが納期を超えるルートは使用を禁止。(CustomerDeadline.csv, LeadTime.csv)
顧客別納期
| 顧客 | 納期(日) |
|---|---|
| A | 2 |
| B | 2 |
| C | 2 |
| D | 3 |
| E | 4 |
リードタイム
| 工場 | 顧客 | リードタイム(日) |
|---|---|---|
| 川崎 | A | 1 |
| 熊谷 | A | 2 |
| 幕張 | A | 3 |
| 川崎 | B | 1 |
| 熊谷 | B | 3 |
| 幕張 | B | 2 |
| 川崎 | C | 2 |
| 熊谷 | C | 3 |
| 幕張 | C | 1 |
| 川崎 | D | 3 |
| 熊谷 | D | 2 |
| 幕張 | D | 1 |
| 川崎 | E | 4 |
| 熊谷 | E | 1 |
| 幕張 | E | 2 |
輸送コストが最も最小となる配送計画をCPLEXを使って立ててみましょう。
2. Bobと一緒に要件を整理しよう
2-1. 初めに、こちらのデータをダウンロードし、展開して、作業フォルダに配置します。
2-2. Bobにログイン後、左上のメニューから「ファイル」→「フォルダーをワークスペースに追加」をクリックします。

2-3. PlanモードでBobと一緒に要件を整理します。
Planモードにして以下をプロンプトにペーストしてください。
とある製造業の会社は3つの工場(川崎、熊谷、幕張)を持っており、製品を製造して供給することができます。この度5社の異なる顧客(A~E)から製品を納入して欲しいと依頼がありました。それぞれの顧客の需要量は以下になります。(CustomerRequiredQuantity.csv)
工場が供給できる量には限りがあり、以下になっています。(FactoryProductionAmount.csv)
1ユニット当たりの輸送コスト(人件費、燃料費等を合計したユニット当たりのコスト)がわかっており、以下になっています。
(TransportationCosts.csv)
以下の制約条件があります。
制約①
道路状況などの影響で、ルート(工場から顧客への配送ルート)ごとに輸送個数の上限があり、以下になっています。(RouteCapacity.csv)
制約②
輸送費、人件費のコストを増加させないために、各顧客は需要量のユニット数すべてを1工場からのみ調達する。
制約③
リードタイムが納期を超えるルートは使用を禁止。(CustomerDeadline.csv, LeadTime.csv)
輸送コストが最も最小となる配送計画をCPLEX(docplex)を使って立ててください。
レポートをHTMLで出力してください。
承認待ちが表示されたら、内容を確認し、「一度だけ承認」をクリックします。

Bobにどこまで自動で実行させるか権限を与えるには、「権限」をクリックします。

Bobが問題の整理を始めます。以降は、表現やアプローチはその時々で変わります。以下を参考にBobとやり取りを進めてください。

フォローアップ質問がある場合は、回答して追加の要件を指定します。ここでは、「docplexがインストール済みで使用可能」 を選びます。

以下のような追加質問がある場合もあります。お好きなものを選んでください。

実装前にmdファイルに記載されている要件をプレビューして確認しましょう。

3. Agentモードでコーディングしよう
Planモードで要件が固まると、次にAgentモードでコーディングを始めます。
Bobが実装を開始するか聞いてきますので、応答して進めてください。
実装は、Todoで管理されます。
実装時に、docplexがインストールされていない場合は、pip install docplexが始まります。
実装が完了するとToDoリストを更新し、HTMLでレポートを出力します。

4. 結果を確認しよう
プロンプトに以下のようにHTMLレポートが表示されるので、「開く」をクリックして中身を確認します。

5. 追加のお願いをしてみよう
レポートの表示の変更や、要件の変更、追加など、Bobに追加のお願いをしてみましょう。

各工場と各顧客とをつなぐネットワーク図を追加してください。
画像が切れてしまった場合は、スクリーンショットを送ってBobに教えてあげてください。

コストが抑えられるか確認したいので、以下の制約条件を外して再計算してください。
制約②
輸送費、人件費のコストを増加させないために、各顧客は需要量のユニット数すべてを1工場からのみ調達する。
6. わからないことがあったら聞いてみよう
結果の解釈などでわからないことがあればBobを通じて聞いてみましょう。
川崎工場から顧客Aへ配送するルートはなぜ不採用ですか?
7. 新しいタスクを始めるには
これまでの問題と別の問題を解きたい場合は、「新しいタスク」をクリックして始めます。

本記事は以上になります。



















