こんにちは!IBMデータプラットフォームのカスタマーサクセスエンジニアの周栄です。
このところ、IBM Bob が話題になっていて、問い合わせを含めて大変なことになっています笑。
IBM BobはAIエージェント駆動のビジネス向け開発支援ツールで開発者のパートナーとして、単にコードを書くだけでなく、要件定義→実装→テスト→デプロイまで、ソフトウェア開発ライフサイクル全体を支援するAIファーストの統合開発環境です。
さらに Bob は、他製品と連携することで価値が広がります。今回はIBM の最適化ソルバーであるIBM CPLEX と連携し、マッチング最適化を実行してみました。
本記事は、2023年のTechXchange SPSS秋ユーザーイベントで出題されたテーマをベースに、Bobで再現したものです 。
当時のお題は以下になります。
男性8名、女性8名を以下の条件を満たしたうえで最適にペアリングを行います。
1.全ペアの合計の年齢差が最小(最優先)
2.全ペアの合計の季節スコアが最大(好みの季節一致で2点加点、正反対の季節は1点減点)
ただし、下記の制約条件を満たすようにします。
1.居住県は一致もしくは隣接
2.年齢差は±3歳まで
詳細は下記のリンクからご確認ください。
https://speakerdeck.com/jpspss/2023spssqiu-07-ri-ben-qing-bao-tong-xin-sen-shan-yang?slide=10
こちらの問題では、8対8の組み合わせは8! = 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 = 40,320通り も存在します。
これだけでも、手作業で最適な組み合わせを見つけるのは非常に時間がかかります。
さらに規模を拡大し、今回はBob × CPLEXで20対20の組み合わせにも挑戦してみます。
20対20の場合、その組み合わせ数は 20! ≒ 2,432,902,008,176,640,000通り(約2,000京通り) にもなります。
このように、組み合わせが爆発的に増える問題では、人手での対応は現実的ではありません。
ここでこそ、CPLEXの計算力とBobの支援が大きな力を発揮します 。
IBM Bob+CPLEXでの実行手順
具体的な手順は以下のとおりです。
- IBM Bobに自然言語で最適化問題を定義し
- IBM BobがOPLコードを生成し
- IBM Bobが生成したものをCPLEXに取り組み、実行する
実際に与えたプロンプト
以下のプロンプトをIBM Bobに与えます。
女性20名「female20.xlsx」,男性20名「male20.xlsx」を以下の条件を満たした上で最適にペアリングしてください
1.全ペアの合計の年齢差が最小(最優先)
2.全ペアの合計の季節スコアが最大(好みの季節一致で2点加点、正反対の季節は1点減点)
ただし、下記の制約条件を満たすようにします。
1.居住県は一致もしくは隣接
2.年齢差は±3歳まで
CPLEXでOPLモデルを作成してください。
※ここで使用している「female20.xlsx」と「male20.xlsx」は、それぞれ20名分の女性・男性の情報(氏名、好みの季節、居住県、年齢など)を含むデータファイルです
最初の実行結果:実行不可能
最初はプロンプトに書いてあるように、年齢差制約を ±3歳に設定しました。
すると結果は:実行不可能です。
Bobが自動で原因分析を行い、23歳の女性が2名いるが、条件を満たす男性年齢層が不足していると指摘してくれました。
制約を緩和して再実行
年齢差制約を ±5歳に緩和して再実行。
結果:
- 合計年齢差:32歳
- 平均:1.6歳/ペア
- 季節スコア:10点
- 求解時間:0.03秒
全員がマッチング成功したことを確認できました。
制約が厳しすぎると解が存在しない、という最適化の典型パターンも確認できました 。
生成されたOPLコードはは以下になります。
matching.mod(一部)
/*********************************************
* マッチングペアリング最適化モデル
* CPLEX OPL Model
*
* 目的:
* 1. 年齢差の最小化(最優先)
* 2. 季節スコアの最大化
*
* 制約:
* 1. 居住県は一致もしくは隣接
* 2. 年齢差は±5歳まで
*********************************************/
…
// 決定変数
// x[i][j] = 1 if 女性iと男性jがペアになる
dvar boolean x[Females][Males];
// 重み
int ageWeight = 1000;
int seasonWeight = 1;
// 目的関数
// 年齢差を最小化(最優先)、季節スコアを最大化
minimize
sum(i in Females, j in Males)
(ageWeight * ageDiff[i][j] - seasonWeight * seasonScore[i][j]) * x[i][j];
// 制約条件
subject to {
// 制約1: 各女性は1人の男性とのみペアになる
forall(i in Females)
ctFemaleOneMatch:
sum(j in Males) x[i][j] == 1;
// 制約2: 各男性は1人の女性とのみペアになる
forall(j in Males)
ctMaleOneMatch:
sum(i in Females) x[i][j] == 1;
// 制約3: 年齢差は±maxAgeDiff歳まで
forall(i in Females, j in Males)
ctAgeDiff:
if (ageDiff[i][j] > maxAgeDiff)
x[i][j] == 0;
// 制約4: 居住県は一致または隣接
forall(i in Females, j in Males)
ctPrefecture:
if (prefectureCompatible[i][j] == 0)
x[i][j] == 0;
}}
…
続いて、CPLEXで新しいプロジェクトを作成し、先ほどBobが生成した matching.mod と matching.dat を構成に追加して実行します。
実行すると、最適化が走り、マッチング結果が出力されます。
なお、Bobが生成したコードに、CPLEX OPLでは使用できないメソッドが含まれており、エラーが発生する場合があります。その際は、CPLEXのマニュアルリンクを参照するようにBobに指示すると、仕様を理解したうえでコードを修正してくれます。
さらに、Bobに「マッチング結果をCSV形式で出力する」よう指示することで、結果ファイルの自動生成も可能です。
出力された matching_result_cplex.csv を確認すると、すべての男性と女性が1対1でペアリングされていることが分かります。これにより、制約条件を満たしたうえで完全なマッチングが実現できていることを確認できます。

Webアプリケーションの開発
あわせて、Bob にアプリの作成も依頼しました。
作成されたアプリは以下のものです。
female20.xlsx と male20.xlsx をアップロードして実行したところ、最適化は問題なく動作し、マッチング結果が正しく出力されることを確認できました。


Bob+CPLEX Modelerの利用価値
Bob と CPLEX Modeler を組み合わせることで、最適化開発は「専門家だけの領域」から「誰でも扱える領域」へと大きく進化します。 ここでは、その価値を 3 つの観点で整理します。
1. コーディング不要で CPLEX を操作できる
従来、CPLEX を使うには OPL 言語を書ける人に依存していました。 そのため、最適化プロジェクトはどうしても属人化し、導入のハードルも高いものでした。
Bobの登場により、自然言語で制約条件や要件を記述するだけでモデルを構築できるようになり、これまでOPLを書ける人に限られていた操作が、誰でも簡単に扱えるようになります。
その結果、業務の効率化を促進するとともに、人的ミスの抑制や、特定担当者に依存しない安定した運用が可能になります。
2. 暗黙知や業務ルールの定式化の障壁が下がる
最適化の難しさの一つは、業務の暗黙知をどう数式に落とし込むかという定式化の壁にあります。
Bobは、業務上の制約をそのまま言語で入力できる仕組みにより、最適化の専門家でなくても業務担当者が直接モデル作成に関与できる環境を実現します。これにより、定式化のハードルが大きく下がります。
さらに、求解不能になった場合でも原因を自動的に分析し、制約の緩和案を提示します。
今回のマッチング最適化でも、Bob は次のように分析し、代替案を提示してくれました。
「23歳の女性2名に対し、±3歳の範囲に該当する男性がいないため、 マッチングが不可能です。年齢差を±5歳に緩和してください。」
3. モデル開発からアプリ化まで一気通貫で実現
Bobはモデル生成だけで終わらず、作成した最適化モデルをそのままプロトタイプアプリに変換し、UI付きのアプリケーションとしてすぐに動作させることができます。
つまり、最適化モデル→プロトタイプアプリ→運用までを一つの AI エージェントで完結できます。
従来の 「データ担当 → 最適化担当 → アプリ担当 → 運用担当」 という分断されたプロセスを統合し、 開発スピードと保守性を大きく向上させます。
最後に、本構成の作成にあたり西牧さんにもご協力いただきました。心より感謝申し上げます。

周栄 晴美
日本アイ・ビー・エム株式会社
データプラットフォーム
カスタマサクセスエンジニア