1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CPLEX +Bob クーポンメール送付の最適化

1
Last updated at Posted at 2026-07-09

皆さんこんにちは!この記事では、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. はじめに

はじめに当シナリオの説明をします。とある小売業、ここでは百貨店とします。この百貨店では、昨年1年間の顧客ごとの売上データをもとにして、各顧客が特定の品目(バッグ、インナーウェア、アクセサリ)を今後購入するかしないかを予測したデータを持っています。

予測データの説明
$R が「T」の場合「購入する」という予測で「F」の場合、購入しないという予測です。
$RRPは予測の傾向スコアです。

それぞれの品目で購入意思が高いと予測する顧客に3種類のクーポンメールを送付したいと考えています。

  • バッグのクーポンは5000円分
  • インナーウェアのクーポンは1000円分
  • アクセサリーのクーポンは7000円分

ただし、このキャンペーンの予算には限りがあり、クーポンは合計で20万円分しか発行できません。また、各クーポンの同士の発行数は大きな偏りを持たせないために±10とします。

予算内で最も収益性を最大化したく、そのような結果になりうる顧客へクーポンを送りたいと考えています。
クーポンを使った時の収益はそれぞれ

  • バッグが30,000円
  • インナーウェアが2,000円
  • アクセサリが28,000円

となります。

また通信制限があり、顧客一人に対して2通までしかメールを送れません。

制約があるなかで、どの顧客に、何のクーポンを送るのが最も期待収益を最大化できるのか、CPLEXを使って解を求めます。

*CPLEX は Community Editionの場合、変数と制約の数が1000個までの制限があります。

Community Editionを使用している場合は、購入確率の高い上位333顧客を選ぶように事前にフィルタリングするように要件を追加します。

2. Bobと一緒に要件を整理しよう

2-1. 初めに、予測データ(predict2026.csv)をダウンロードし、作業フォルダに配置します。

2-2. Bobにログイン後、左上のメニューから「ファイル」→「フォルダーをワークスペースに追加」をクリックします。
image.png

フォルダが追加されました。
image.png

2-3. PlanモードでBobと一緒に要件を整理します。
Planモードにして以下をプロンプトにペーストしてください。

とある小売業、ここでは百貨店とします。
この百貨店では、昨年1年間分の顧客ごとの売上データを持っており、この売上データを学習データとして、今後の各顧客が特定の品目を購入するかしないかを予測したデータpredict2026.csvを持っています。

顧客に3種類のクーポンメールを送付したいと考えています。
 - バッグのクーポンは5000円分
 - インナーウェアのクーポンは1000円分
 - アクセサリーのクーポンは7000円分

ただし、このキャンペーンの予算には限りがあり、クーポンは合計で20万円分しか発行できません。
また、各クーポンの同士の発行数は大きな偏りを持たせないために±10とします。


予算内で最も収益性を最大化したく、そのような結果になりうる顧客へクーポンを送りたいと考えています。
クーポンを使った時の収益はそれぞれ

- バッグが30,000円
- インナーウェアが2,000円
- アクセサリが28,000円

となります。


また通信制限があり、顧客一人に対して2通までしかメールを送れません。


制約があるなかで、どの顧客に送るのが最も期待収益を最大化できるのか、CPLEXを使って解を求めてください。

Community Editionを使用している場合は、購入確率の高い上位333顧客を選ぶように事前にフィルタリングしてください。docplexを使用してください。
HTMLでレポートを作成してください。

テキスト入力欄の下の部分にモード切替があります。Planモードにして、テキストを貼り付けます。
txccplex1.png

承認待ちが表示されたら、内容を確認し、「一度だけ承認」をクリックします。

image.png

Bobにどこまで自動で実行させるか権限を与えるには、「権限」をクリックします。
スクリーンショット 2026-07-09 101149.png

しばらくすると、Bobの理解やプランの概要が表示されます。以降は、表現やアプローチはその時々で変わります。以下を参考にBobとやり取りを進めてください。

image.png

image.png

要件で不明なところはフォローアップ質問がされます。
確認して回答します。(ここでは上段を選んでいます。)
image.png

要件が確定すると確定したプランを表示します。
image.png

要件はmdファイルに記載されています。プレビューして確認しましょう。

image.png

image.png

3. Agentモードでコーディングしよう

Planモードで要件が固まると、次にAgentモードでコーディングを始めます。
Bobが実装を開始するか聞いてきますので、応答して進めてください。
image.png

実装は、Todoで管理されます。
image.png

実装時に、docplexがインストールされていない場合は、pip install docplexが始まります。

実装が完了するとToDoリストを更新し、HTMLでレポートを出力します。

image.png

以下はBobのプロンプトに表示された結果サマリーです。
image.png
image.png

4. 結果を確認しよう

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

image.png
image.png
image.png
image.png

5. 追加のお願いをしてみよう

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

image.png

送付対象顧客一覧で各顧客に対し、不採用になった品目の購入確率も表示してください。見やすいようにグラフィカルに表示してください。

image.png

その他、以下のような追加要件などお試しください。
スクリーンショット 2026-07-10 080241.png

対象が「T」の商品は、予測の時点で売れる予測です。であれば「F」を対象にして、クーポンを配ることで購入確率が高くなりそうな顧客を対象にクーポンを配りたいです。見直しできますか?

image.png
image.png
image.png

6. わからないことがあったら聞いてみよう

結果の解釈などでわからないことがあればBobを通じて聞いてみましょう。
image.png

顧客103037はアクセサリが0.426でインナーウェアが0.140ですが、インナーウェアが採用されています。この理由を教えてください。

image.png
image.png

7. 新しいタスクを始めるには

これまでの問題と別の問題を解きたい場合は、「新しいタスク」をクリックして始めます。
image.png

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?